首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C套接字接收数据,然后不发送数据

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

Stack Overflow用户
提问于 2013-07-11 07:41:45
回答 2查看 387关注 0票数 1

我已经创建了一个简单的套接字连接,它向node.js应用程序发送请求并接收一些随机数据,然后发送回数据,但它正确地发送和接收数据,但不发送回随机数据

代码语言:javascript
复制
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请求时,它工作得很好,并且没有显示任何错误,我完全迷路了。

EN

回答 2

Stack Overflow用户

发布于 2013-07-11 08:14:50

检查以下代码行:

代码语言:javascript
复制
recv(newsocket, response, 51200, 0);
response[strlen(response)] = '\0';`

recv不返回以null结尾的数据,因此不能使用strlen来确定数据的大小。必须使用recv的返回值:

代码语言:javascript
复制
int data_size = recv(newsocket, response, 51200, 0);
票数 1
EN

Stack Overflow用户

发布于 2013-07-17 15:34:23

当您在HTTP 1.1中指定" connection : close“时,HTTP连接就会结束,因此当您读取完来自服务器的响应后,套接字就会失效。

可能的解决方案包括:

在recv()响应之后,

  • 删除从第一个连接到服务器的"Connection: close“标头
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17582773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档