对于课程,我在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后应该怎么做?
℃。为什么需要以这种方式格式化请求,而不是按原样发送?
答案 0 :(得分:1)
A)您确定修改后的clientrequest字符串末尾有2个换行符吗?如果没有,那么服务器仍在等待您发送剩余的请求。
此外,如果第一次write()调用未发送所有数据,则不希望声明失败。你应该坐在一个循环中继续写,直到你耗尽你的缓冲区。如果有实际错误,将返回-1,然后您可以宣布紧急情况。
B)只需要'/',如“GET / HTTP / 1.1”。服务器将知道该怎么做。
C)以这种方式格式化,例如,只有GET和Host:行的请求?有时,代理服务器的功能是隐私:浏览器泄露了很多关于自身的信息。这个代理示例正在剥离很多这些行。