winsock阻塞扫描死在那了?解决方法
winsock阻塞扫描死在那了?
根据connect扫描原理写了一个简单的程序,但不懂为什么在扫描中,如果端口关闭,程序就一直死在那里。
我查资料说是,如果connect连接不上,程序就会一直等待服务器的返回,进入什么休眠状态,直到超时。
如果要能进行端口的扫描,需要进行怎样的修改
------解决方案--------------------
改用非阻塞或异步方式
------解决方案--------------------
setsockopt
修改成非阻塞
使用select检测是否超时
------解决方案--------------------
select,connect连接超时
------解决方案--------------------
不是死了,而是等待超时,默认超时时间挺长的,大概是14秒。
可以设置为非阻塞,然后用select判断可读或者可写,如果一旦可读或者可写,说明连接成功了。
- C/C++ code
#include "winsock2.h" #include "stdio.h" #include <stdlib.h> #pragma comment(lib,"ws2_32") void main() { WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int n,ret; char Cipna[20]="207.182.253.40"; long Port,Port1,Port2; // printf("需要进行扫描的ip为:"); // scanf("%s",Cipna); printf("需要扫描的端口段为:"); scanf("%d%d",&Port1,&Port2); //初始化Windows Socket 2.2 for( Port = Port1 ; Port <= Port2 ; Port ++ ) { WSAStartup(MAKEWORD(2,2), &wsaData); s = socket(AF_INET,SOCK_STREAM,0); ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = inet_addr(Cipna); if(connect(s,(SOCKADDR *) &ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR ) { closesocket(s); printf("%d CLOSE!\n",Port); continue; } else printf("%d OPEN!\n",Port); closesocket(s); // 释放Windows Socket DLL的相关资源 WSACleanup(); } }
根据connect扫描原理写了一个简单的程序,但不懂为什么在扫描中,如果端口关闭,程序就一直死在那里。
我查资料说是,如果connect连接不上,程序就会一直等待服务器的返回,进入什么休眠状态,直到超时。
如果要能进行端口的扫描,需要进行怎样的修改
------解决方案--------------------
改用非阻塞或异步方式
------解决方案--------------------
setsockopt
修改成非阻塞
使用select检测是否超时
------解决方案--------------------
select,connect连接超时
------解决方案--------------------
不是死了,而是等待超时,默认超时时间挺长的,大概是14秒。
可以设置为非阻塞,然后用select判断可读或者可写,如果一旦可读或者可写,说明连接成功了。