C Socket Client не recv () - получение байтов с сервера - PullRequest
2 голосов
/ 19 января 2012

Привет, я создаю примитивный браузер в c, который должен сделать очень простую задачу Я пытаюсь заставить моего клиента просто прочитать ответное сообщение с сервера, с которого я запрашиваю. Я пытаюсь получить простой ответ от www.yahoo.com. Я экспериментировал со многими различными сообщениями запроса, которые все успешно отправлены. Следующие сообщения запроса приведены ниже.

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;
}

Любая помощь будет отличной. Спасибо!

Ответы [ 2 ]

6 голосов
/ 19 января 2012

Протокол HTTP требует, чтобы для завершения HTTP-запроса были отправлены 2 возврата каретки / перевода строки

Я не вижу их в вашем вопросе

2 голосов
/ 19 января 2012

После заголовка должно быть два символа новой строки: 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);
}
...