在ACE网路编程第一卷中有一个获取网页内容的小程序。
但是将代码按照书上的敲击好,却获取不了网页,提示:client sent HTTP/1.1 request without hostname。
后经反复测试终于通过,增加了如下的参数。
iov[3].iov_base="Host:jiayp\r\n\r\n\r\n";
iov[3].iov_len=strlen(iov[3].iov_base);
jiayp是我机器名,随便设置竟让也没问题。
see RFC2616 section 有具体说明,有时间查查。
全部代码如下:
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
const char *pathname=argc>1?argv[1]:"/index.html";
const char *server_hostname=argc>2?argv[2]:"baidu.com";
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
if(peer_addr.set(80,server_hostname)==-1)return 1;
else if(connector.connect(peer,peer_addr)==-1)
return 1;
char buf[BUFSIZ]={0};
iovec iov[4];
iov[0].iov_base="GET ";
iov[0].iov_len=4;
iov[1].iov_base=(char*)pathname;
iov[1].iov_len=strlen(pathname);
iov[2].iov_base=" HTTP/1.1\r\n";
iov[2].iov_len=strlen(iov[2].iov_base);
iov[3].iov_base="Host:jiayp\r\n\r\n\r\n";
iov[3].iov_len=strlen(iov[3].iov_base);
if(peer.sendv_n(iov,4)==-1)return 1;
// if(peer.send(test,strlen(test))==-1)return 1;
for(ssize_t n;(n=peer.recv(buf,sizeof(buf)))>0;)
{
ACE::write_n(ACE_STDOUT,buf,n);
}
ACE::read_n(ACE_STDIN,buf,BUFSIZ);
return peer.close()==-1?1:0;
}
现在就可以获取任意一个网页内容了。