TCP Socket Port Check
写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不爽,在不改系统默认超时时间的前提上,引入socket的非阻塞模式达到超时限制的目的,下面是具体程序
1. windows下的tcp端口检测程序
简介:引入select模式作为超时限制
- //TCP Port Check program in windows
- #include <stdio.h>
- #include <winsock2.h>
- #pragma comment(lib,"ws2_32.lib")
- int main(int argc, char *argv[])
- {
- SOCKET sockfd;
- SOCKADDR_IN sockaddr;
- int port;
- unsigned long ip;
- WSADATA wsa;
- int timeout=,ret;
- struct timeval tv;
- struct fd_set fs;
- unsigned long ul = ;
- if(argc != )
- {
- printf("Usage: %s IP Port TimeOut\n",argv[]);
- return -;
- }
- if((ip=inet_addr(argv[]))==INADDR_NONE)
- {
- printf("IP Address Error\n");
- return -;
- }
- if((port=atoi(argv[]))==)
- {
- printf("Port Error\n");
- return -;
- }
- if((timeout=atoi(argv[]))==)
- {
- printf("Timeout Error\n");
- return -;
- }
- WSAStartup(MAKEWORD(,),&wsa); //initialize Ws2_32.dll
- if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= ) //create a tcp socket
- {
- printf("Create socket fail!\n");
- return -;
- }
- //socket non-block mode set
- if((ret = ioctlsocket(sockfd, FIONBIO, (unsigned long*)&ul))==SOCKET_ERROR)
- {
- closesocket(sockfd);
- return -;
- }
- sockaddr.sin_family = AF_INET;
- sockaddr.sin_port = htons(port);
- sockaddr.sin_addr.S_un.S_addr = inet_addr(argv[]);
- //connect to target ip with port
- connect(sockfd, (SOCKADDR *)&sockaddr, sizeof(sockaddr));
- tv.tv_sec = timeout;
- tv.tv_usec = ;
- FD_ZERO(&fs);
- FD_SET(sockfd,&fs);
- ret = select(sockfd+,NULL,&fs,NULL,&tv);
- if(ret<)
- {
- printf("Select Error\n");
- closesocket(sockfd);
- return -;
- }
- else if(ret == )
- {
- printf(" %s %d Connect fail!\n",argv[],port);
- closesocket(sockfd);
- return -;
- }
- else
- {
- printf(" %s %d Connected success!\n",argv[],port);
- closesocket(sockfd);
- }
- WSACleanup(); //clean up Ws2_32.dll
- return ;
- }
2. Linux下TCP端口检测程序
- #include <stdlib.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <string.h>
- #include <netdb.h>
- #include <time.h>
- #include <errno.h>
- int main(int argc, char *argv[])
- {
- int sockfd=socket(AF_INET,SOCK_STREAM,);
- struct sockaddr_in client;
- char ip[];
- int port;
- int timeout;
- struct timeval tv;
- if(argc != )
- {
- printf("Usage : %s ip port timeout\n", argv[]);
- exit();
- }
- strcpy(ip, argv[]);
- port = atoi(argv[]);
- timeout = atoi(argv[]);
- bzero(&client, sizeof(struct sockaddr_in));
- client.sin_family = AF_INET;
- client.sin_addr.s_addr = inet_addr(ip);
- client.sin_port = htons(port);
- tv.tv_sec = ;
- tv.tv_usec = ;
- //set timeout with setsockopt
- if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv, sizeof(tv))<)
- {
- perror("setsockopt failed\n");
- exit();
- }
- if(setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char*)&tv, sizeof(tv))<)
- {
- perror("setsockopt failed\n");
- exit();
- }
- if(!connect(sockfd,(struct sockaddr*)&client,sizeof(struct sockaddr_in)))
- {
- printf("connect ok\n");
- }else{
- printf("connect fail\n");
- }
- close(sockfd);
- return ;
- }
3. 总结
代码不难,关键是能提高效率,有时候简单的东西反而更好,继续努力
TCP Socket Port Check的更多相关文章
- C# 的TCP Socket (异步方式)
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# 的TCP Socket (同步方式)
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# 的tcp Socket设置自定义超时时间
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- TCP SOCKET中backlog参数的用途是什么? ---图解
recv_queue中的包大小,为内核的包大小,而不是ip包大小. 如果发出去的包太大,需要修改write_queue和tx_queue两个参数,tx_queue主要是流量控制. 多进程必须在sock ...
- Python Tcp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...
- nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket【转】
原文地址:https://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-u ...
- <转>Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- QT创建TCP Socket通信
最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...
随机推荐
- bzoj3524: [Poi2014]Couriers(主席树)
主席树(可持久化权值线段树)初探... 修改一个点只对树上logn个点有影响,所以新建logn个点就行了,总共新建mlogn个点. 查询一个区间[l,r],相当于将数一个一个加进树,询问第l到第r次操 ...
- [NOI2008] 道路设计
link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...
- 使用树莓派录音——USB声卡
原文链接:http://jingyan.eeboard.com/article/73723 我们都知道树莓派只有音频输出口,而没有音频输入的接口,怎么办呢?其实只要一个USB声卡就可以了. USB声卡 ...
- Java 中 给静态方法 添加泛型 (static <T>)
今天在用到static方法的时候.想要用泛型.结果不能通过编译. 上网查了一下.其具体写法如下:
- [USACO06NOV] Roadblocks
https://www.luogu.org/problem/show?pid=2865 题目描述 Bessie has moved to a small farm and sometimes enjo ...
- 图论&数学:矩阵树定理
运用矩阵树定理进行生成树计数 给定一个n个点m条边的无向图,问生成树有多少种可能 直接套用矩阵树定理计算即可 矩阵树定理的描述如下: 首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u ...
- lightoj 1007 - Mathematically Hard 欧拉函数应用
题意:求[a,b]内所有与b互质个数的平方. 思路:简单的欧拉函数应用,由于T很大 先打表求前缀和 最后相减即可 初次接触欧拉函数 可以在素数筛选的写法上修改成欧拉函数.此外本题内存有限制 故直接计算 ...
- 招人不是HR第一职责,留住人才是
什么是HR的第一责任?我希望你们知道,招人不是你的第一职责,留住人才是你的第一职责.HR工作是相当难做的,你们是公司集团内里各个部门中最难做的部门,也是最具战略性的部门. 以人为本,这个“人”就是阿里 ...
- Jmeter-分布式
转载自: http://www.51testing.com/html/28/116228-247521.html 由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发 ...
- 【BZOJ4837】LRU算法 [模拟]
LRU算法 Time Limit: 6 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小Q同学在学习操作系统中内存管理的 ...