2012-01-19 55 views
2

您好我建立一个原始的浏览器在c这是一个非常简单的任务。我试图让我的客户端简单地读出来自我请求的服务器的响应消息。我试图从www.yahoo.com获得一个简单的回复。我已经尝试过许多不同的请求消息,它们都已成功发送。以下请求消息如下。C Socket客户端不recv() - 从服务器的任何字节

GET http://www.yahoo.com HTTP/1.1\r\n 
Host: www.yahoo.com:80\r\n 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n 
Accept-Language: en-us,en;q=0.5\r\n 
Accept-Encoding: gzip, deflate\r\n 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n 
Connection: keep-alive\r\n 

GET http://www.yahoo.com HTTP/1.1 
Host: www.yahoo.com:80 

的问题是,我不是的recv() - 荷兰国际集团从服务器的任何字节。 recv()但是不会导致错误为-1。而服务器只是不想回应。以下是我的代码。

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 

#define MAXDATASIZE 500; 

int main(int argc, char *argv[]){ 
struct addrinfo serverSide,*serverInfo; 
int mySock, status; 
char buf[501],ipstr[INET6_ADDRSTRLEN]; 

memset(&serverSide, 0, sizeof serverSide); 
serverSide.ai_family = AF_UNSPEC; 
serverSide.ai_socktype = SOCK_STREAM; 

if(getaddrinfo("www.yahoo.com","80",&serverSide,&serverInfo)==0){ 
printf("get addr success\n"); 
} 

mySock = socket(serverInfo->ai_family, serverInfo->ai_socktype, serverInfo->ai_protocol); 
connect(mySock, serverInfo->ai_addr, serverInfo->ai_addrlen); 

char msg[500] = "GET/HTTP/1.1\r\n"; 
strcat(msg," Host: www.yahoo.com:80\r\n"); 

printf("%s\n",msg); 
if((status = send(mySock,msg,strlen(msg),0))== -1){ 
printf("request not sent %d\n",status); 
perror("\n"); 
}else{ 
if((status = recv(mySock, buf, 500, 0))== -1){ 
printf("recieved byte error"); 
}else{ 
printf("%s\n Number of bytes recieved %d\n",buf,status); 
} 
} 
close(mySock); 
freeaddrinfo(serverInfo); 
return 0; 
} 

任何帮助将是伟大的。谢谢!

回答

6

HTTP协议要求2个回车/换行符被发送到结束的HTTP请求

我没有看到他们在你的问题

+1

噢,非常感谢你!它的工作,你是一个圣人! –

+0

:-)很高兴它帮助你 - 我们都在那里! –

2

必须有标题之后两个新行:strcat(msg,"Host: www.yahoo.com:80\r\n\r\n");

  • recv()当远程关闭套接字时返回0。
  • 使用正确的地址族AF_INET而不是AF_UNSPEC

还检查socket()connect()返回值,例如, (包括errno.h,stdlib.h):

if (mySocket == -1) { 
    perror("Creating socket failed"); 
    exit(EXIT_FAILURE); 
} 
相关问题