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.dll
44
45     if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)    //create a tcp socket
46     {
47         printf("Create socket fail!\n");
48         return -2;
49     }
50     //socket non-block mode set
51     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 port
61     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     else
81     {
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. 总结

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

时间: 2024-10-26 04:28:53

TCP Socket Port Check的相关文章

TCP、UDP及Socket(Port)的关系,深入浅出!

转自http://www.cnblogs.com/wish123/archive/2013/04/12/3017031.html 提醒:貌似这里说的socket是指port,而非socket api技术!仅供参考!貌似标题命名不准确的说<更安全的Linux网络>第1章防火墙的基本概念,在本书的开始将详尽讲解与防火墙相关的TCP/IP技术.此外,对于防火墙的原理.种类.架构及其优.缺点,在本章中也都有详尽的介绍.本节为大家介绍TCP.UDP及Socket的关系.1.4 TCP.UDP及Socke

TCP Socket Establish;UDP Send Package Process In Kernel Sourcecode Learning

目录 0. 引言 1. TCP握手流程 2. TCP connect() API原理 3. TCP listen() API原理 4. UDP交互过程 5. UDP send() API原理 6. UDP bind() API原理 0. 引言 Monitoring project 1. outer link connect: connect()->inet_stream_connect 2. Suspicious port monitor: listen()->inet_listen 3. S

使用tcp socket进行跨进程/网络通信

看了陈硕的书,说虽然有pipe, msgget, message queue, unix domain socket,  还是建议进程间只用tcp socket来通信. pipe的缺点是阻塞.msgget缺点是不能select.mq_send可以,但是双向通信要开两个mq.unix domain不能跨网络.tcp socket优点很多,就是处理分包比较麻烦些,不过可以抽象出来.根据我的项目需要,自己设计的数据封包格式为: MSG -- 3 Bytes cmd -- 1 Byte ulen --

Go语言TCP Socket编程

Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是"高频+刚需",而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的. 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,s

Python Tcp Socket

socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型SOCKET_STREAM(TCP套接字),SOCKET_DGRAM(UDP套接字) TCP socket通信逻辑 TCP服务端:创建socket>>>绑定本地服务器>>>监听连接>>>通信交互>>>关闭连接 TCP客户端:创建socket

基于Java的TCP Socket通信详解(计算机端/Android手机端)

TCP Socket通信是一种比较常用的基于连接的网络通信方式.本文通过Java实现TCP Socket通信,并将其用于计算机端.Android手机端,同时做到代码规范化,实现代码最大化复用. 本文代码可在GitHub下载,建议对照源码阅读文章 https://github.com/jzj1993/JavaTcpSocket TCP连接的建立 客户端和服务器间通过三次握手建立TCP连接.在Java中,连接建立完成后,服务器端和客户端分别获取到一个Socket实例,之后就可以通过这个Socket实

【转载】TCP socket心跳包示例程序

在做游戏开发时,经常需要在应用层实现自己的心跳机制,即定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性. 在TCP socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能更大.-- 这里实现的是由客户端给服务器发送心跳包,基本思路是: 1) 服务器为每个客户端保存了IP和计数器count,即map<fd, pair<ip, count>>.服务端主线程采用 select 实现多路IO复用,监听新连

【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)

书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: import java.net.Socket; import java.net.SocketException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class TCPEch

浅谈TCP socket

Socket,用来实现应用的通信,是应用非常广的一个api,今天就来揭开它的神秘面纱. 客户端 引入头文件 #include <winsock2.h> 初始化socket的DLL WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData 创建套接字 SOCKET socket(int domain, int type, int protocol); domain 是协议域,包括 AF_INET 对应 ipv4 AF_INET6 对应 ip