免费注册 查看新帖 |

Chinaunix

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

用SOCKET 去CONNECT 网站的80端口,没成功,想问问错在哪里了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-11 21:32 |只看该作者 |倒序浏览
connect函数总是失败,返回-1

if((t=connect(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr)))==-1){
        herror("connect");
        exit(1);
    }


全部代码:
#include <fstream>
#include <sys/socket.h>
#include <netdb.h>
#include <string>
#include <arpa/inet.h>
using namespace std;
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char s[]="www.douban.com",src[100];
&nbsp;&nbsp;&nbsp;&nbsp;struct hostent *ph,*h,kkk;
&nbsp;&nbsp;&nbsp;&nbsp;int t;
&nbsp;&nbsp;&nbsp;&nbsp;ph=&kkk;
&nbsp;&nbsp;&nbsp;&nbsp;if((ph=gethostbyname("www.douban.com"))==NULL){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;herror("gethostbyname");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;int sockfd;
&nbsp;&nbsp;&nbsp;&nbsp;if(sockfd=socket(AF_INET,SOCK_STREAM,0)<0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("socket");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in addr;
&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_family=AF_INET;
&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_port=htons(80);
&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_addr=*((struct in_addr *)(ph->h_addr));
&nbsp;&nbsp;&nbsp;&nbsp;memset(addr.sin_zero,0,8);
//&nbsp;&nbsp;&nbsp;&nbsp;printf("address: %s \n",inet_ntop(AF_INET,&addr.sin_addr.s_addr,src,100));

&nbsp;&nbsp;&nbsp;&nbsp;printf("address: %s \n",inet_ntoa(addr.sin_addr));
&nbsp;&nbsp;&nbsp;&nbsp;if((t=connect(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr)))==-1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;herror("connect");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(src,"GET /index.html HTTP/1.1");
&nbsp;&nbsp;&nbsp;&nbsp;send(sockfd,src,strlen(src),0);
&nbsp;&nbsp;&nbsp;&nbsp;src[0]='\n';
&nbsp;&nbsp;&nbsp;&nbsp;send(sockfd,src,strlen(src),0);
&nbsp;&nbsp;&nbsp;&nbsp;while(recv(sockfd,src,100,0)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout<<src<<endl;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-06-11 21:32 |只看该作者
perror 返回的是Unknown host ,

论坛徽章:
0
3 [报告]
发表于 2008-06-11 22:18 |只看该作者
你能ping通这个网站吗?

论坛徽章:
0
4 [报告]
发表于 2008-06-11 22:53 |只看该作者
提示很明显了,解析不了主机.

论坛徽章:
0
5 [报告]
发表于 2008-06-12 10:08 |只看该作者
谢谢楼上几位的回复,问题解决了,不过结果很晕,呵呵
用perror()打印错误的话,结果是sockfd不是合法的sockfd
我又去检查sockfd的代码,
这里搞错了
&nbsp;&nbsp;&nbsp;&nbsp;if(fd=socket(AF_INET,SOCK_STREAM,0)<0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("socket");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}

应该是
&nbsp;&nbsp;&nbsp;&nbsp;if((fd=socket(AF_INET,SOCK_STREAM,0))<0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("socket");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}

if语句内的 fd 赋值少了一个括号,这样fd 的值不是一个sockfd,而是一个sockfd与0的比较结果,
哎,下次编程小心

论坛徽章:
0
6 [报告]
发表于 2008-06-12 16:18 |只看该作者

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2008-06-15 19:01 |只看该作者
原帖由 cainiaoc 于 2008-6-12 10:08 发表
谢谢楼上几位的回复,问题解决了,不过结果很晕,呵呵
用perror()打印错误的话,结果是sockfd不是合法的sockfd
我又去检查sockfd的代码,
这里搞错了&nbsp;&nbsp;&nbsp;&nbsp;if(fd=socket(AF_INET,SOCK_STR ...


呵呵,很多人都容易犯这种错误。
所以以后这种赋值又判断时,就先写 (  )< 0 什么的,然后再加赋值语句放括号里面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP