Для класса я пишу основной прокси-сервер в c.
В примере профессора (это java) он принимает запрос браузера, который выглядит так:
GET http://www.cs.rpi.edu/index.html HTTP/1.1
Host: www.cs.rpi.edu
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Proxy-Connection: keep-alive
Cookie: __utma=138860844.163543584.1329315062.1329315062.1329315062.1;__utmz=138860844.1329315062.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
Cache-Control: max-age=0
И форматирует его так, как он выглядит, плюс заголовки Accept и User-Agent перед отправкой на хост-сервер:
GET /index.html HTTP/1.1
Host: www.cs.rpi.edu
Я тоже это сделал, но теперь я столкнулся с 2 проблемами и 1 вопросом:
а. Сообщение отправляется на сервер в порядке, потому что connect () и write () не дают мне никакой ошибки, но когда я иду читать read () ответ сервера (возможно, ошибочно ожидая HTML?), Программа зависает и просто сидит навсегда пока я не нажму Ctrl + C. Я не могу ради жизни найти причину:
/* write a message out on the socket connection */
int n = write( sock, clientrequest, strlen( clientrequest ) );
if ( n < strlen( clientrequest ) )
{
perror( "write() failed" );
return EXIT_FAILURE;
}
printf("Made it here.\n\n");
char buffer2[1024];
n = read( sock, buffer2, 1024 );
if ( n < 1 )
{
perror( "read() failed" );
return EXIT_FAILURE;
}
else
{
buffer2[n] = '\0';
printf( "Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2 );
}
printf("But not here.\n\n");
B. Скажем, я подключаюсь к чему-то вроде www.google.com. Нет /index.html, так что же должно идти после GET в отформатированном запросе?
C. Почему запрос должен быть отформатирован таким образом, а не просто отправлен как есть?