写了两个小程序,主要是用于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. 总结

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

最新文章

  1. UOJ#67. 新年的毒瘤
  2. linux中的解压,压缩命令
  3. Windows平台下的读写锁
  4. POJ 1852
  5. android使用bintray发布aar到jcenter
  6. Bootstrap_排版_列表
  7. SQL基础--&gt;层次化查询(START BY ... CONNECT BY PRIOR)[转]
  8. redis memcache
  9. linux_redhat_线程后台运行方法
  10. IIS URLReWrite URL 重写模块 下载地址
  11. macaca 环境搭建篇,(web 和安卓)
  12. sql数据库设置自定义消息
  13. HTML&amp;javaSkcript&amp;CSS&amp;jQuery&amp;ajax(二)
  14. 如何用xx-net上youtube
  15. 如何设置httpd-mpm-conf的参数
  16. 20135202闫佳歆--week5 课本18章学习笔记
  17. Anaconda下载(改变了镜像路径,下载速度很快!!!)
  18. ZentaoPMS 系统的优先级以及修改
  19. 清华大学《C++语言程序设计基础》线上课程笔记04---指针
  20. ffmpeg安装与配置

热门文章

  1. windows下vue项目启动步骤
  2. Chrome浏览器启动页被360导航篡改解决方法
  3. android设计准则
  4. 【51NOD】数字1的数量
  5. 【51NOD-0】1046 A^B Mod C
  6. iOS开发者两分钟学会用GitHub在Mac上托管代码的两种方法
  7. Reachability from the Capital(Codeforces Round #490 (Div. 3)+tarjan有向图缩点)
  8. SQL Server Delete Duplicate Rows
  9. python进行EDA探索性数据分析
  10. nginx 伪静态rewrite