2011-11-26 15 views
-1

私はソケットで遊んでいますが、私のread()コールはハングアップしています。ポート80でランダムなWebページ(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(バッファ、" 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のバージョン、ホスト名、および2つの新しい行が行われます。サーバーは、何かの送信を開始する前にヘッダーを完了することを期待しています。これがread()の呼び出しがストールしている理由です。 WikipediaのHTTP記事のClient Request exampleを見てください。