C套接字接收数据,然后不发送数据

C套接字接收数据,然后不发送数据,c,linux,sockets,unix,C,Linux,Sockets,Unix,我创建了一个简单的套接字连接,它向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));

我创建了一个简单的套接字连接,它向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请求时,它工作正常,没有显示任何错误,我完全迷路了

请检查以下代码行:

recv(newsocket, response, 51200, 0);
response[strlen(response)] = '\0';`
recv不会返回以null结尾的数据,所以不能使用strlen来确定数据的大小。 您必须改用recv的返回值:

int data_size = recv(newsocket, response, 51200, 0);

检查以下代码行:

recv(newsocket, response, 51200, 0);
response[strlen(response)] = '\0';`
recv不会返回以null结尾的数据,所以不能使用strlen来确定数据的大小。 您必须改用recv的返回值:

int data_size = recv(newsocket, response, 51200, 0);

每次在HTTP 1.1中指定“connection:close”时,HTTP连接都会结束,因此,从服务器读取响应后,套接字无效

可能的解决办法是:

  • 从第一个请求中删除“连接:关闭”标题
  • 接收()响应后,再次将()连接到服务器

每次在HTTP 1.1中指定“连接:关闭”时,HTTP连接都会结束,因此,从服务器读取响应后,套接字无效

可能的解决办法是:

  • 从第一个请求中删除“连接:关闭”标题
  • 接收()响应后,再次将()连接到服务器

打开所有编译器警告。如果在打开警告的情况下编译代码,您会发现代码中存在错误。响应[strlen(response)]='\0'完全不起作用。空值已经在strlen()告诉您的地方。@KlasLindbäck-我已经启用了所有警告和错误,仍然没有luck@paxdiablo的删除答案是正确的。您已经告诉服务器在发送响应后关闭连接,所以服务器已经这样做了。此代码还有其他问题。例如,您正在忽略recv()返回的结果。请打开所有编译器警告。如果在打开警告的情况下编译代码,您会发现代码中存在错误。响应[strlen(response)]='\0'完全不起作用。空值已经在strlen()告诉您的地方。@KlasLindbäck-我已经启用了所有警告和错误,仍然没有luck@paxdiablo的删除答案是正确的。您已经告诉服务器在发送响应后关闭连接,所以服务器已经这样做了。此代码还有其他问题。例如,您正在忽略recv()返回的结果。如果它确实返回以null结尾的数据,那么第二行仍然是完全冗余的。对于任何x,x[strlen(x)]已为空,根据定义。好的,很抱歉,我错过了这一点。我是如何建立两个新的套接字连接的,一个将发送和接收随机数据,另一个将发送随机数据,我仍然有相同的问题和连接:close header它不是我认为的接收后关闭连接的原因,如果它确实返回空终止数据第二条线路仍然是完全冗余的。x[strlen(x)]已经是空的,根据定义,对于任何x都是空的。好的,很抱歉我错过了这一点,我做了两个新的套接字连接,一个将发送和接收随机数据,另一个将发送随机数据,我仍然有相同的问题和连接:close header它不是我认为在接收后关闭连接的原因