微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Winsock recv没有收到任何数据C

我正在使用Winsock中的TCP套接字编写minecraft Classic Server,我正在编写函数来执行“心跳”,只是一个HTTP请求,它应该返回一个URL给我 – 根本没有头文件或HTML。

它将数据发送到minecraft.net(至less它说的是这样),但是在那之后几分钟,它告诉我它没有从minecraft.net得到数据,即它读取“HeartBeat:Recieved no data来自minecraft.net“

到目前为止,我有以下代码(不包括WSAStartup等):

void HeartBeat() { unsigned int clSock; struct hostent *host; struct sockaddr_in server_addr; char buffer[128] = ""; char request[256] = "GET /"; //(I will not show the rest of the request...) if((clSock = socket(AF_INET,SOCK_STREAM,0)) < 0) { printf("HeartBeat: Error creating socketn"); return; } else { printf("HeartBeat: Success in creating socketn"); } printf("HeartBeat: Resolving hostname 'www.minecraft.net'... "); if((host = gethostbyname("www.minecraft.net")) == NULL) { printf("Failedn"); return; } else { printf("success!n"); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(80); server_addr.sin_addr.s_addr = *((unsigned long*)host->h_addr); if (connect(clSock,(SOCKADDR*) &server_addr,sizeof(server_addr)) == SOCKET_ERROR) { printf("HeartBeat: Error conneting to www.minecraft.netn"); return; } else { printf("HeartBeat: Connected to www.minecraft.netn"); } if (send(clSock,request,sizeof(request),0) < 0) { printf("HeartBeat: Sending data Failed.n"); closesocket(clSock); return; } else { printf("HeartBeat: Success in sending data.n"); } if ((recv(clSock,buffer,sizeof(buffer),0)) == 0) { printf("HeartBeat: Received no data from www.minecraft.netn"); closesocket(clSock); return; } else { printf("HeartBeat: Yay,success! Url is '%s'",buffer); closesocket(clSock); return; } }

有人能指出我出错的地方吗? 太感谢了。

批处理脚本调用exe后错误退出

增加FD_SETSIZE的限制并select

未定义的引用sync_fetch_and_add_4

如何使用C ++获取system32目录的完整path?

如何确定button点击期间何时按下控制键

getc是macros还是函数

使用MiniDump获取句柄数据(DbgHelp.h)

send()总是被EPIPE中断

在Android中转换现有的Windows 10 UWP应用程序

在运行时,如何通过编程来确定dynamic链接库使用了多less内存?

你没有发送HTTP请求。

一个(最小的)HTTP请求必须至少是字符串:

char request[256] ="GET / HTTP/1.0rnrn";

或者在HTTP 0.9的情况下:

char request[256] ="GET /rnrn";

您只能发送该字符串,而不是包含大量0字节的整个请求缓冲区,因此:

send(clSock,strlen(request),0)

你正在做1 recv()调用,可能不会读取整个响应。 你应该阅读,直到连接关闭(直到recv()返回0)。 或者要真正遵循HTTP协议,则需要解析响应,查找Content-Length标头。 阅读所有的标题,然后读取正文中的字节数(如果有的话)。 要真正处理HTTP的所有细节,你确实需要一个HTTP库。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐