int proxyRequest(string &request, char buffer[], struct hostent* host){
int sockfd, sockopt;
struct sockaddr_in their_addr;
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
perror("Socket generating failed");
return -1;
}
if (host==NULL){
strcpy(buffer, "HTTP/1.1 404 Not found\r\nContent-Type: text/html\r\n\r\n<h2>INET_E_RESOURCE_NOT_FOUND</h2>");
}
else{
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(SERVERPORT);
their_addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr;
if (connect(sockfd, (struct sockaddr*)&their_addr, sizeof(their_addr)) == -1){
perror("Connection failed");
return -1;
}
write(sockfd, request.c_str(), request.length());
read(sockfd, buffer, BUFSIZE);
cout << buffer << endl;
}
close(sockfd);
return 0;
}
Я делаю простой прокси-сервер, и все в порядке, за исключением того, что я не могу получить правильное тело ответа.
Это запрос, который я отправляю на сервер (www.example.com). Это представлено в коде как «запрос».
Похоже, заголовки http принимаются правильно. Однако html-файл (тело) вообще не отправляется. И вместо него странный персонаж. Почему это происходит? Это связано с нулевым символом?
Помните, что сокеты TCP являются потоковыми, один вызов read может не получить все, что было отправлено, вам может потребоваться цикл, пока все не будет получено.
В TCP это: 'read (sockfd, buffer, BUFSIZE);', т.е. игнорирование результата, возвращаемого функцией read (), является autoFail.
Пожалуйста, не размещайте скриншоты текста, они неприятны.
Кроме того, read не завершает буфер нулем, поэтому его печать, как если бы это была C-строка (даже если она содержит текстовые данные), крайне незаконна.
Прочтите "короткое чтение / запись", а также EINTR. Реальная жизнь немного сложнее, чем вы думаете.
@nm Я мог их прочитать нормально, и я думаю, ОП хотел показать нам этого забавного персонажа.





However, the html file(body) is not sent at all. And there is a weird character instead of it. Why does this happen?
Тело является отправлено, но сжато. Следующее говорит вам, что контент сжимается с использованием алгоритма gzip:
Content-Encoding: gzip
Вам нужно будет либо распаковать его (заботясь о символах NUL), либо сообщить серверу, что вы не готовы работать с закодированным содержимым gzip (т.е. удалить заголовок Accept-Encoding в своем запросе).
«Двоичный» не означает «сжатый». «Забота о символах NUL» почему?
Спасибо, все работает нормально после того, как я удалил Accept-Encoding
Вы должны выводить только количество прочитанных символов, а не весь буфер.