写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不爽,在不改系统默认超时时间的前提上,引入socket的非阻塞模式达到超时限制的目的,下面是具体程序

1. windows下的tcp端口检测程序

简介:引入select模式作为超时限制

  1. //TCP Port Check program in windows
  2.  
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5.  
  6. #pragma comment(lib,"ws2_32.lib")
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. SOCKET sockfd;
  11. SOCKADDR_IN sockaddr;
  12. int port;
  13. unsigned long ip;
  14. WSADATA wsa;
  15. int timeout=,ret;
  16. struct timeval tv;
  17. struct fd_set fs;
  18. unsigned long ul = ;
  19.  
  20. if(argc != )
  21. {
  22. printf("Usage: %s IP Port TimeOut\n",argv[]);
  23. return -;
  24. }
  25. if((ip=inet_addr(argv[]))==INADDR_NONE)
  26. {
  27. printf("IP Address Error\n");
  28. return -;
  29. }
  30. if((port=atoi(argv[]))==)
  31. {
  32. printf("Port Error\n");
  33. return -;
  34. }
  35. if((timeout=atoi(argv[]))==)
  36. {
  37. printf("Timeout Error\n");
  38. return -;
  39. }
  40. WSAStartup(MAKEWORD(,),&wsa); //initialize Ws2_32.dll
  41.  
  42. if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= ) //create a tcp socket
  43. {
  44. printf("Create socket fail!\n");
  45. return -;
  46. }
  47. //socket non-block mode set
  48. if((ret = ioctlsocket(sockfd, FIONBIO, (unsigned long*)&ul))==SOCKET_ERROR)
  49. {
  50. closesocket(sockfd);
  51. return -;
  52. }
  53. sockaddr.sin_family = AF_INET;
  54. sockaddr.sin_port = htons(port);
  55. sockaddr.sin_addr.S_un.S_addr = inet_addr(argv[]);
  56.  
  57. //connect to target ip with port
  58. connect(sockfd, (SOCKADDR *)&sockaddr, sizeof(sockaddr));
  59.  
  60. tv.tv_sec = timeout;
  61. tv.tv_usec = ;
  62. FD_ZERO(&fs);
  63. FD_SET(sockfd,&fs);
  64. ret = select(sockfd+,NULL,&fs,NULL,&tv);
  65. if(ret<)
  66. {
  67. printf("Select Error\n");
  68. closesocket(sockfd);
  69. return -;
  70. }
  71. else if(ret == )
  72. {
  73. printf(" %s %d Connect fail!\n",argv[],port);
  74. closesocket(sockfd);
  75. return -;
  76. }
  77. else
  78. {
  79. printf(" %s %d Connected success!\n",argv[],port);
  80. closesocket(sockfd);
  81. }
  82. WSACleanup(); //clean up Ws2_32.dll
  83. return ;
  84. }

2. Linux下TCP端口检测程序

  1. #include <stdlib.h>
  2. #include <sys/socket.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <netdb.h>
  8. #include <time.h>
  9. #include <errno.h>
  10. int main(int argc, char *argv[])
  11. {
  12. int sockfd=socket(AF_INET,SOCK_STREAM,);
  13. struct sockaddr_in client;
  14. char ip[];
  15. int port;
  16. int timeout;
  17. struct timeval tv;
  18. if(argc != )
  19. {
  20. printf("Usage : %s ip port timeout\n", argv[]);
  21. exit();
  22. }
  23. strcpy(ip, argv[]);
  24. port = atoi(argv[]);
  25. timeout = atoi(argv[]);
  26.  
  27. bzero(&client, sizeof(struct sockaddr_in));
  28. client.sin_family = AF_INET;
  29. client.sin_addr.s_addr = inet_addr(ip);
  30. client.sin_port = htons(port);
  31.  
  32. tv.tv_sec = ;
  33. tv.tv_usec = ;
  34.  
  35. //set timeout with setsockopt
  36. if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv, sizeof(tv))<)
  37. {
  38. perror("setsockopt failed\n");
  39. exit();
  40. }
  41.  
  42. if(setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char*)&tv, sizeof(tv))<)
  43. {
  44. perror("setsockopt failed\n");
  45. exit();
  46. }
  47. if(!connect(sockfd,(struct sockaddr*)&client,sizeof(struct sockaddr_in)))
  48. {
  49. printf("connect ok\n");
  50.  
  51. }else{
  52. printf("connect fail\n");
  53. }
  54. close(sockfd);
  55. return ;
  56. }

3. 总结

代码不难,关键是能提高效率,有时候简单的东西反而更好,继续努力

TCP Socket Port Check的更多相关文章

  1. C# 的TCP Socket (异步方式)

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  2. C# 的TCP Socket (同步方式)

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  3. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  4. TCP SOCKET中backlog参数的用途是什么? ---图解

    recv_queue中的包大小,为内核的包大小,而不是ip包大小. 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制. 多进程必须在sock ...

  5. Python Tcp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  6. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  7. nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket【转】

    原文地址:https://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-u ...

  8. <转>Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  9. QT创建TCP Socket通信

    最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...

随机推荐

  1. bzoj3524: [Poi2014]Couriers(主席树)

    主席树(可持久化权值线段树)初探... 修改一个点只对树上logn个点有影响,所以新建logn个点就行了,总共新建mlogn个点. 查询一个区间[l,r],相当于将数一个一个加进树,询问第l到第r次操 ...

  2. [NOI2008] 道路设计

    link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...

  3. 使用树莓派录音——USB声卡

    原文链接:http://jingyan.eeboard.com/article/73723 我们都知道树莓派只有音频输出口,而没有音频输入的接口,怎么办呢?其实只要一个USB声卡就可以了. USB声卡 ...

  4. Java 中 给静态方法 添加泛型 (static <T>)

    今天在用到static方法的时候.想要用泛型.结果不能通过编译. 上网查了一下.其具体写法如下:

  5. [USACO06NOV] Roadblocks

    https://www.luogu.org/problem/show?pid=2865 题目描述 Bessie has moved to a small farm and sometimes enjo ...

  6. 图论&数学:矩阵树定理

    运用矩阵树定理进行生成树计数 给定一个n个点m条边的无向图,问生成树有多少种可能 直接套用矩阵树定理计算即可 矩阵树定理的描述如下: 首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u ...

  7. lightoj 1007 - Mathematically Hard 欧拉函数应用

    题意:求[a,b]内所有与b互质个数的平方. 思路:简单的欧拉函数应用,由于T很大 先打表求前缀和 最后相减即可 初次接触欧拉函数 可以在素数筛选的写法上修改成欧拉函数.此外本题内存有限制 故直接计算 ...

  8. 招人不是HR第一职责,留住人才是

    什么是HR的第一责任?我希望你们知道,招人不是你的第一职责,留住人才是你的第一职责.HR工作是相当难做的,你们是公司集团内里各个部门中最难做的部门,也是最具战略性的部门. 以人为本,这个“人”就是阿里 ...

  9. Jmeter-分布式

    转载自: http://www.51testing.com/html/28/116228-247521.html 由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发 ...

  10. 【BZOJ4837】LRU算法 [模拟]

    LRU算法 Time Limit: 6 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小Q同学在学习操作系统中内存管理的 ...