写了两个小程序,主要是用于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的更多相关文章

  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. 在eclipse中安装html编辑器插件

    1.下载插件( 点击下载)                 解压后得到GEF-ALL-3.4.1.zip和tk.eclipse.plugin.htmleditor_2.2.0.jar   2.安装GE ...

  2. Mybatis中什么时候应该声明jdbcType

    转:http://blog.csdn.net/l799069596/article/details/52052777 疑问来自于,有时候Mapper.xml中 pid = #{pid,jdbcType ...

  3. ios开关按钮

    .al-toggle-button{ appearance: none; -webkit-appearance: none; position: relative; width: 52px; heig ...

  4. vijos 1081 野生动物园 函数式线段树

    描述 cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有一个 ...

  5. [Luogu 3966] TJOI 2013 单词

    经典ACAM. 注意单词之间添加字符,以及对重复单词的处理. #include <cstdio> #include <cstring> #include <queue&g ...

  6. 【vijos】P1066 弱弱的战壕

    [算法]线段树 [题解]将所有坐标按x(第一)和y(第二)从小到大排序,再按顺序插入线段树,即在线段树中将y坐标位置+1,这样就能保证每个坐标能包含的点一定先被处理了,每次询问查询1...a[i].y ...

  7. PHP 练习1:新闻发布

    1.新闻发布主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  8. ie6下双边距的问题

    1.ie6双边距情况 <div class="red"></div> <div class="blue"></div& ...

  9. HTTP响应码摘自apach官网

    HTTP状态列表 响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行. 响应码分五种类型,由它们的第一位数字表示: 1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接 ...

  10. Django-【template】自定义过滤器和自定义标签

      模板语言内置的过滤器和标签比较少,往往会遇到无法满足需求的情况,所以需要我们来自定义.自定义filter和simple_tag在项目中很常用   a.首先检查settings下面INSTALLED ...