免费注册 查看新帖 |

Chinaunix

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

unix下测试远程端口是否可用的程序,大家看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-01 18:00 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <sys/select.h>
  6. #include <fcntl.h>
  7. #include <sys/time.h>
  8. #include <sys/select.h>
  9. #include <arpa/inet.h>
  10. #include <netinet/in.h>
  11. #include <netinet/tcp.h>


  12. int testConnect(char *hostIp,int hostPort);

  13. void main()
  14. {
  15.         char *hostIp="192.168.106.81";
  16.         int hostPort= 514;
  17.         int sts;
  18.         sts = testConnect(hostIp,hostPort);
  19.         if (sts == 0)
  20.         {  
  21.                 printf("Can't connect %d:%s now!",hostIp,hostPort);
  22.         }
  23.         else
  24.           printf("%d:%s can be connected now!",hostIp,hostPort);
  25. }

  26. int testConnect(char *hostIp,int hostPort)
  27. {
  28.     int s,flags,retcode;
  29.     int err,len;
  30.     struct sockaddr_in  peer;
  31.    
  32.     char *srvip;
  33.     int srvport;
  34.     srvip=hostIp;
  35.     srvport=hostPort;
  36.    
  37.                 s = socket(AF_INET, SOCK_STREAM, 0);
  38.                 //下面获取套接字的标志
  39.                 if ((flags = fcntl(s, F_GETFL, 0)) < 0)
  40.                 {
  41.             return 0;
  42.                 }

  43.                 //下面设置套接字为非阻塞
  44.                 if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)
  45.                 {
  46.                     return 0;
  47.                 }
  48.                
  49.                 peer.sin_family      = AF_INET;
  50.           peer.sin_port        = htons(srvport);
  51.                 peer.sin_addr.s_addr=inet_addr(srvip);
  52.                
  53.                 retcode = connect(s, (struct sockaddr*)&peer, sizeof(peer));

  54.                 //如果connect()返回0则连接已建立,直接返回1
  55.                 if (retcode == 0)         return 1;

  56.                 fd_set rdevents,wrevents,exevents;
  57.                
  58.                 FD_ZERO(&rdevents);
  59.                 FD_SET(s, &rdevents);  //把先前的套接字加到读集合里面
  60.                 wrevents = rdevents;   //写集合
  61.                 exevents = rdevents;   //异常集合
  62.    
  63.     struct timeval tv;       
  64.                
  65.                 tv.tv_sec = 1;  //设置时间为1秒
  66.                 tv.tv_usec = 0;
  67.                
  68.                 retcode = select(s+1, &rdevents, &wrevents, &exevents, &tv);
  69.                 if (retcode < 0)
  70.                 {
  71.                     return 0;
  72.                 }
  73.                 else if (retcode == 0)
  74.                 {  //select 超时???
  75.                     return 0;
  76.                 }

  77. }      

复制代码



编译时:cc testconnect.c
报错:

未定义                  文件中的
符号                       在文件中
socket                              testconnect.o
connect                             testconnect.o
inet_addr                           testconnect.o
ld: 致命的: 符号参照错误. 没有输出被写入a.out

请各位法师版主指点一二!THX~~

论坛徽章:
0
2 [报告]
发表于 2006-04-01 18:38 |只看该作者
没有连Socket库,man socket看看需要加什么库。

论坛徽章:
0
3 [报告]
发表于 2006-04-01 19:15 |只看该作者
多谢老cao提醒,可是不幸的是我加了几个其他同事程序include的头文件,好像还是老毛病,实在不知道缺哪一个阿?
我在SUN下编译。

论坛徽章:
0
4 [报告]
发表于 2006-04-01 19:21 |只看该作者
老生常谈

SUN的Solaris加:
-lsocket -lnsl
即:
cc -o testconnect testconnect.c -lsocket -lnsl


Linux:
-lnsl

论坛徽章:
0
5 [报告]
发表于 2006-04-01 19:31 |只看该作者
哦,谢谢,果然如此。
有时老手的一句指点,就解决了一个困扰新手大半天的问题。
看来这个编译选项还得硬记住阿,不过SUN为什么就要这么奇怪呢,ALPHA到是不用。

论坛徽章:
0
6 [报告]
发表于 2006-04-01 23:40 |只看该作者
原帖由 caojiqun 于 2006-4-1 18:38 发表
没有连Socket库,man socket看看需要加什么库。

lz没有照着做吧,里面写的很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP