Работая в Ubuntu для Windows IIS Server, код C возвращает -1 для recv () - PullRequest
0 голосов
/ 27 июня 2019

У меня сервер IIS, работающий в Windows 10, и следующий код выполняется из CLion IDE для C в Ubuntu. Программа всегда зависает в recv (), выбрасывая -1 в качестве значения.

Я могу получить ответ от сервера, используя curl, поэтому я могу связаться с сервером с компьютера.

#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif
#include <stdio.h>

#define BUFFERSIZE 512
#define PROTOPORT 5193 
# pragma comment(lib,"ws2_32.lib")
void ClearWinSock() {
#if defined WIN32
    WSACleanup();
#endif
}

void ErrorHandler(char *errorMessage) {
    printf(errorMessage);
}

int main(void) {
#if defined WIN32
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2 ,2), &wsaData);
    if (iResult != 0) {
        printf("error at WSASturtup\n");
        return 0;
    }
#endif


    int Csocket;
    Csocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Csocket < 0) {
        ErrorHandler("socket creation failed.\n");
        closesocket(Csocket);
        ClearWinSock();
        return 0;
    }

    struct sockaddr_in sad;
    memset(&sad, 0, sizeof(sad));
    sad.sin_family = AF_INET;
    sad.sin_addr.s_addr = inet_addr("10.0.0.56"); // IP del server
    sad.sin_port = htons(443); // Server port
    // CONNESSIONE AL SERVER
    if (connect(Csocket, (struct sockaddr *) &sad, sizeof(sad)) < 0) {
        ErrorHandler("Failed to connect.\n");
        closesocket(Csocket);
        ClearWinSock();
        return 0;
    }

    char* inputString = "GET /\r\nHTTP/2\r\nHost:10.0.0.56\r\n\r\n"; 
    int stringLen = strlen(inputString); // Determina la lunghezza

    if (send(Csocket, inputString, stringLen, 0) != stringLen) {
        ErrorHandler("send() sent a different number of bytes than expected");
        closesocket(Csocket);
        ClearWinSock();
        return 0;
    }

    int bytesRcvd;
    int totalBytesRcvd = 0;
    char buf[BUFFERSIZE]; // buffer for data from the server
    printf("Received: "); // Setup to print the echoed string

    while (totalBytesRcvd < stringLen) {
        if ((bytesRcvd = recv(Csocket, buf, BUFFERSIZE - 1, 0)) <= 0) {
            ErrorHandler("recv() failed or connection closed prematurely");
            closesocket(Csocket);
            ClearWinSock();
            return 0;
        }
        totalBytesRcvd += bytesRcvd; // Keep tally of total bytes
        buf[bytesRcvd] = '\0'; // Add \0 so printf knows where to stop
        printf("%s", buf); // Print the echo buffer
    }

    closesocket(Csocket);
    ClearWinSock();
    printf("\n"); // Print a final linefeed
    system("pause");
    return (0);
}

Метод recv () всегда возвращает -1. Не уверен, что может быть проблема здесь.

...