免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2233 | 回复: 2
打印 上一主题 下一主题

[网络] 我用socket写抓取网页,为什么每个recv都是0字节【已解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-10 20:23 |只看该作者 |倒序浏览
本帖最后由 crazyhadoop 于 2013-01-11 08:27 编辑

代码如下
  1. int main(int argc, char *argv[])
  2. {
  3.                 struct hostent *h;
  4.                 char *ipAddr = NULL;
  5.                 char *domain = "www.baidu.com";
  6.                
  7.                 if ((h=gethostbyname(domain)) == NULL)
  8.                 {
  9.                                 herror("gethostbyname");
  10.                                 exit(1);
  11.                 }
  12.                
  13.                 printf("Host name : %s\n", h->h_name);
  14.                 ipAddr = inet_ntoa(*((struct in_addr*)h->h_addr));
  15.                 printf("IP Address : %s\n", ipAddr);

  16.                 int client_fd;
  17.                 client_fd = socket(AF_INET, SOCK_STREAM, 0);
  18.                 if(client_fd==-1)
  19.                 {
  20.                                 perror("socket failed\n");
  21.                                 exit(1);
  22.                 }

  23.                 struct sockaddr_in server_addr;
  24.                 memset(&server_addr, 0, sizeof(server_addr));
  25.                 server_addr.sin_family = AF_INET;
  26.                 server_addr.sin_port = htons(80);
  27.                 server_addr.sin_addr = *((struct in_addr*)h->h_addr);
  28.                
  29.                 int connectState;
  30.                 connectState = connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  31.                 if(connectState==-1)
  32.                 {
  33.                                 perror("conncet failed\n");
  34.                 }

  35.                 char msg[1024];
  36.                 memset(msg, 0, sizeof(msg));
  37.                 sprintf(msg,"GET http://www.baidu.com/ HTTP/1.1\r\nConnection: Close\r\n\r\n");
  38.                 printf("%s\n",msg);

  39.                 int sendState = 0;
  40.                 sendState = send(client_fd, msg, strlen(msg), 0);
  41.                 if(sendState==-1)
  42.                 {
  43.                                 perror("send Error\n");
  44.                                 exit(1);
  45.                 }

  46.                 int receiveLen = 0;
  47.                 char receiveBuffer[1024];
  48.                 while(true)
  49.                 {
  50.                                
  51.                                 receiveLen = recv(client_fd, receiveBuffer,sizeof(receiveBuffer), 0);       
  52.                                 printf("receive len = %d\n", receiveLen);
  53.                                 if(receiveLen<0)
  54.                                         break;
  55.                 }
  56.                 close(client_fd);

  57.                 return 0;
  58. }
复制代码
从printf("receive len = %d\n", receiveLen);看出,打印出无限个receiveLen等于0的值
请问是我send的数据有问题吗?

论坛徽章:
0
2 [报告]
发表于 2013-01-10 22:27 |只看该作者
自问自答吧,应该是send的数据有问题
  1.        char msg[1024];
  2.                 memset(msg, 0, sizeof(msg));
  3.                 sprintf(msg,"GET ");
  4.                 strcat(msg, url);
  5.                 strcat(msg, " HTTP/1.1");

  6.                 strcat(msg, "\r\nHost: ");
  7.                 strcat(msg, domain);

  8.                 strcat(msg, "\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1");
  9.                 strcat(msg, "\r\nAccept: */*");
  10.                 strcat(msg, "\r\nConnection: close\r\n\r\n");
复制代码
换成上面的代码就OK抓到网页了
url=http://www.baidu.com/
domain=www.baidu.com

论坛徽章:
0
3 [报告]
发表于 2013-01-15 09:52 |只看该作者
不错!      
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP