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下建立一个客户端程序,进行通信测试,发现可以 ...
随机推荐
- Linux之异步通知20160702
异步通知,主要说的是使用信号的方式,同时使用信号也是实现进程之间通信的一种方式. 多的不说,我们直接看代码: 首先应用程序的: #include <sys/types.h> #includ ...
- 关于Mybatis的@Param注解 及 mybatis Mapper中各种传递参数的方法
原文:https://blog.csdn.net/mrqiang9001/article/details/79520436 关于Mybatis的@Param注解 Mybatis 作为一个轻量级的数 ...
- 解决requests获取源代码时中文乱码问题
用requests获取源代码时,如果是中文网页,就可能会出现乱码,下面我以中关村的网站为例: import requests url = 'http://desk.zol.com.cn/meinv/' ...
- HDU 4417 主席树写法
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- python 栈和队列
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push ...
- Moodle通过CLI安装
Moodle通过CLI安装 前提:Moodle准备工作已经完成 1) 数据库(及用户) 2) moodledata目录 3) 源代码及站点配置 安装过程 打开终端,或通过Putty或Xshell等软件 ...
- Robotframework Web自动化实战课程
想学习的小伙伴,现在可以报名了!!!7月1日正式开课本期课程主要是web自动化为主,根据平时工作经验整理的一套流程以及使用过程中常见的问题总结.学完后能很快上手,即学即用,课后遇到问题在线解答,远程协 ...
- 动态规划:区间DP与环形DP
区间型动态规划的典型例题是石子归并,同时使用记忆化搜索实现区间动归是一种比较容易实现的方式,避免了循环数组实现的时候一些边界的判断 n堆石子排列成一条线,我们可以将相邻的两堆石子进行合并,合并之后需要 ...
- [Luogu 2261] CQOI2007 余数求和
[Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...
- MyBatis框架的使用及源码分析(四) 解析Mapper接口映射xml文件
在<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 一文中,我们知道mybat ...