简单查看端口是否打开–C语言实现
想要检查端口是否打开主要原理时通过建立一个套接字然后通过connect函数与目的主机进行连接根据返回的情况来判断是否打开。
```c
int Port = (int)(LPVOID)port;
int rec;//调用各种socket函数的返回值
SOCKET desHost;
SOCKADDR_IN servAddr;
desHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == desHost)
{
printf("socket failed!\n");
WSACleanup();
return -1;
}
servAddr.sin_family = AF_INET; /*地址协议为ipv4*/
servAddr.sin_addr.S_un.S_addr = inet_addr(DEST_IP); /*这里设置成了自己的主机可以根据所需扫描的主机更改ip地址*/
servAddr.sin_port = htons(Port); /*扫描的端口*/
rec = connect(desHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
if (rec == SOCKET_ERROR) {
printf("端口%d关闭!\n", Port); /*这里不使用WSACleanup()函数,不然后续的线程会创建不了socket*/
closesocket(desHost);
return -1;
}
为了能够批量检测端口是否打开使用了多线程的方式,用了CreateThread函数
do {
handle[port] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ScanThread, (LPVOID)port, 0, &dwThreadId);
port++;
} while (port < MAX_PORT);
参数scanthread就是要编写的子线程函数
DWORD WINAPI ScanThread(LPVOID port) /*子线程*/
具体代码如下
#incl