2011-11-26 2 views
-1

그래서 소켓으로 놀고 싶지만 내 read() 호출은 계속 걸려 있습니다. 포트 80에서 임의의 웹 페이지 (예 : yahoo.com)에 연결하고 있습니다. 출력에서 ​​5 바이트를 쓰고 있음을 보여 주지만 아무것도 반환하지 않습니다. 아무도 내가 잘못하고있는 것을 지적 할 수 있습니까?socket read() hanging

portno = 80; 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0) {printf("could not open socket\n");} 

server = gethostbyname("yahoo.com"); 
if (server == NULL) 
{ 
    printf("could not get hostbyname\n"); 
    exit(0); 
} 

printf("Server name:%s\n",server->h_name); 

bzero((char *) &serv_addr, sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET; 

bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); 
serv_addr.sin_port = htons(portno); 


if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
{ 
    printf("connect error\n"); 
} 
char buffer[1000]; 
strcpy(buffer,"GET \\"); 
printf("bytes in command:%d\n",sizeof(buffer)); 
n = write(sockfd,buffer,strlen(buffer)); 
if(n <= 0){printf("could not get page:\n");} 
printf("Bytes that where writen:%d\n", n); 

printf("reading from socket\n"); 
n = read(sockfd,buffer,sizeof(buffer)); 
printf("bytes that where read:%d",n); 
+3

시작을 위해'strcpy (buffer, "GET/\ r \ n \ r \ n")'을 시도하십시오 ... – pilcrow

답변

4

HTTP 프로토콜이 충분하지 않습니다. 이 옵션을 사용합니다 ...

strcpy(buffer,"GET/HTTP/1.1\r\nHostname:www.yahoo.com\r\n\r\n"); 

당신은 "GET"와 파일 이름을 지정해야 헤더를 표시하기 위해 HTTP 버전, 호스트 이름, 두 개의 새로운 라인이 이루어집니다. 서버는 헤더 전송을 시작하기 전에 헤더를 완료해야합니다. 이것이 read()에 대한 호출이 멈추는 이유입니다. Wikipedia의 HTTP 기사에서 Client Request example을 살펴보십시오.