2012-07-05 101 views
1

我正在使用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; 
    } 
} 

可能有人请指出哪里我已经错了吗?太感谢了。

+0

您的要求实际上是256个字节吗?这就是你在使用'sizeof(Request)'时要发送的内容。你也可以用隐含的大小来定义'Request'(例如'Request [] = ...')。 – reuben 2012-07-05 10:25:06

+0

如果发生错误,clSock将永远不会低于0。 – MYMNeo 2012-07-05 10:27:45

+0

我试过reuben的解决方案,但仍然没有雪茄。 – phillid 2012-07-05 10:32:27

回答

1

您没有发送HTTP请求。

A(最小)HTTP请求都必须至少串:

char request[256] ="GET/HTTP/1.0\r\n\r\n"; 

还是在HTTP 0.9的情况下:

char request[256] ="GET /\r\n\r\n"; 

您必须发送仅仅是字符串,而不是含有大量的0字节的整体要求的缓冲区,这样做:

send(clSock, request, strlen(request), 0) 

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

+0

在minecraftwiki.net上,它表示如果没有指定HTTP版本,服务器默认为HTTP 0.9,所以没有标题 – phillid 2012-07-05 10:35:51

+0

啊等一下,它是我需要的/ r! DERP抱歉 – phillid 2012-07-05 10:37:12