1

node.jsアプリにリクエストを送信し、ランダムデータを受信して​​からデータを返送する単純なソケット接続を作成しましたが、データを正しく送受信しますが、ランダムデータを返送しません

char *httpbody;
struct addrinfo hints, *result;
const char *host = "localhost";
char user[512] = "test@gmail.com";
char pass[512] = "test";
char headers[512];
srand(time(NULL));

memset(&hints, 0, sizeof(hints));

hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

if (getaddrinfo(host, "3000", &hints, &result) != 0) {
    freeaddrinfo(result);
    perror("Could not resolve hostname.");
    exit(1);
}

int newsocket = socket(result->ai_family, result->ai_socktype, 0);
if (newsocket == -1) {
    perror("Could not create socket.");
    freeaddrinfo(result);
    close(newsocket);
    exit(1);
}

if (connect(newsocket, result->ai_addr, result->ai_addrlen) == -1) {
    perror("Could not connect.");
    freeaddrinfo(result);
    close(newsocket);
    exit(1);
}

sprintf(headers, "GET /auth?user=%s&pass=%s HTTP/1.1\r\n"
        "User-Agent: Device\r\n"
        "Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n"
        "Content-Type: text/html; charset=UTF-8\r\n"
        "Connection: Close\r\n\r\n", user, pass);

if ((send(newsocket, headers, strlen(headers), 0)) == -1) {
    perror("Could not send data.");
    freeaddrinfo(result);
    close(newsocket);
    exit(1);
}

char response[51201] = "";
recv(newsocket, response, 51200, 0);
response[strlen(response)] = '\0';

httpbody = strstr(response, "\r\n\r\n");
if (httpbody) {
    httpbody += 8;
}

int data = rand() % 255 + 1;

sprintf(headers, "GET /add_data?user=%s&data=%i&"
        "uid=%s HTTP/1.1\r\n"
        "User-Agent: Device\r\n"
        "Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n"
        "Content-Type: text/html; charset=UTF-8\r\n"
        "Connection: Close\r\n\r\n", user, data, httpbody);

if ((send(newsocket, headers, strlen(headers), 0)) == -1) {
    perror("Could not send data.");
    freeaddrinfo(result);
    close(newsocket);
    exit(1);
}

printf("done");

freeaddrinfo(result);
close(newsocket);

revc リクエストを削除すると正常に動作し、エラーは表示されず、完全に失われます

4

2 に答える 2

1

次のコード行を確認してください。

recv(newsocket, response, 51200, 0);
response[strlen(response)] = '\0';`

recv は null で終わるデータを返さないため、strlen を使用してデータのサイズを決定することはできません。代わりに recv の戻り値を使用する必要があります。

int data_size = recv(newsocket, response, 51200, 0);
于 2013-07-11T00:14:49.837 に答える
0

HTTP 1.1 では、「Connection: close」を指定するたびに HTTP 接続が終了するため、サーバーからの応答の読み取りが終了すると、ソケットは有効になりません。

考えられる解決策は次のとおりです。

  • 最初のリクエストから「Connection: close」ヘッダーを削除します
  • 応答を recv() した後、再度サーバーに Connect() します。
于 2013-07-17T07:34:22.827 に答える