我正在使用Winsock中的TCP套接字编写Minecraft Classic Server,我正在写函数来执行'心跳',只是一个HTTP请求应该返回给我的网址 - 根本没有标题或HTML。Winsock recv()没有收到任何数据(C)
它发送数据到Minecraft.net(至少它说的是这样),但它只是在那里几分钟后,并最终告诉我,它没有从minecraft.net的数据,即它读“HeartBeat :没有收到来自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 socket\n");
return;
} else {
printf("HeartBeat: Success in creating socket\n");
}
printf("HeartBeat: Resolving hostname 'www.minecraft.net'... ");
if((host = gethostbyname("www.minecraft.net")) == NULL)
{
printf("failed\n");
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.net\n");
return;
} else {
printf("HeartBeat: Connected to www.minecraft.net\n");
}
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.net\n");
closesocket(clSock);
return;
} else {
printf("HeartBeat: Yay, success! Url is '%s'", buffer);
closesocket(clSock);
return;
}
}
可能有人请指出哪里我已经错了吗?太感谢了。
您的要求实际上是256个字节吗?这就是你在使用'sizeof(Request)'时要发送的内容。你也可以用隐含的大小来定义'Request'(例如'Request [] = ...')。 – reuben 2012-07-05 10:25:06
如果发生错误,clSock将永远不会低于0。 – MYMNeo 2012-07-05 10:27:45
我试过reuben的解决方案,但仍然没有雪茄。 – phillid 2012-07-05 10:32:27