首页 > 代码库 > TCP Socket Port Check
TCP Socket Port Check
写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不爽,在不改系统默认超时时间的前提上,引入socket的非阻塞模式达到超时限制的目的,下面是具体程序
1. windows下的tcp端口检测程序
简介:引入select模式作为超时限制
1 //TCP Port Check program in windows 2 3 4 #include <stdio.h> 5 #include <winsock2.h> 6 7 #pragma comment(lib,"ws2_32.lib") 8 9 10 int main(int argc, char *argv[])11 {12 SOCKET sockfd; 13 SOCKADDR_IN sockaddr;14 int port;15 unsigned long ip;16 WSADATA wsa;17 int timeout=2,ret;18 struct timeval tv;19 struct fd_set fs;20 unsigned long ul = 1;21 22 23 if(argc != 4)24 {25 printf("Usage: %s IP Port TimeOut\n",argv[0]);26 return -1;27 }28 if((ip=inet_addr(argv[1]))==INADDR_NONE)29 {30 printf("IP Address Error\n");31 return -1;32 }33 if((port=atoi(argv[2]))==0)34 {35 printf("Port Error\n");36 return -1;37 }38 if((timeout=atoi(argv[3]))==0)39 {40 printf("Timeout Error\n");41 return -1;42 }43 WSAStartup(MAKEWORD(1,1),&wsa); //initialize Ws2_32.dll44 45 if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) //create a tcp socket46 {47 printf("Create socket fail!\n");48 return -2;49 }50 //socket non-block mode set51 if((ret = ioctlsocket(sockfd, FIONBIO, (unsigned long*)&ul))==SOCKET_ERROR)52 {53 closesocket(sockfd);54 return -1;55 }56 sockaddr.sin_family = AF_INET;57 sockaddr.sin_port = htons(port);58 sockaddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);59 60 //connect to target ip with port61 connect(sockfd, (SOCKADDR *)&sockaddr, sizeof(sockaddr));62 63 tv.tv_sec = timeout;64 tv.tv_usec = 0;65 FD_ZERO(&fs);66 FD_SET(sockfd,&fs); 67 ret = select(sockfd+1,NULL,&fs,NULL,&tv);68 if(ret<0)69 {70 printf("Select Error\n");71 closesocket(sockfd);72 return -1;73 }74 else if(ret == 0)75 {76 printf(" %s %d Connect fail!\n",argv[1],port);77 closesocket(sockfd);78 return -1;79 }80 else81 {82 printf(" %s %d Connected success!\n",argv[1],port);83 closesocket(sockfd);84 }85 WSACleanup(); //clean up Ws2_32.dll 86 return 0;87 }
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,0); struct sockaddr_in client; char ip[20]; int port; int timeout; struct timeval tv; if(argc != 4) { printf("Usage : %s ip port timeout\n", argv[0]); exit(1); } strcpy(ip, argv[1]); port = atoi(argv[2]); timeout = atoi(argv[3]); 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 = 5; tv.tv_usec = 0; //set timeout with setsockopt if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv, sizeof(tv))<0) { perror("setsockopt failed\n"); exit(1); } if(setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char*)&tv, sizeof(tv))<0) { perror("setsockopt failed\n"); exit(1); } if(!connect(sockfd,(struct sockaddr*)&client,sizeof(struct sockaddr_in))) { printf("connect ok\n"); }else{ printf("connect fail\n"); } close(sockfd); return 0;}
3. 总结
代码不难,关键是能提高效率,有时候简单的东西反而更好,继续努力
TCP Socket Port Check
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。