在C ++ Linux中的套接字超时

好吧,首先我想提一下,我所做的是完全道德的,是的,我是端口扫描。

当端口打开时程序运行良好,但是当我到达一个closures的套接字时,程序停止很长时间,因为没有超时条款。 下面是下面的代码

int main(){ int err, net; struct hostent *host; struct sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_port = htons(xxxx); sa.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx"); net = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); err = connect(net, (struct sockaddr *)&sa, sizeof(sa)); if(err >= 0){ cout << "Port is Open"; } else { cout << "Port is Closed"; } } 

我发现这堆栈溢出,但对我来说使用select()命令是没有意义的。

问题是我们可以使connect()函数超时,所以我们不会等待一年,它会返回一个错误?

Solutions Collecting From Web of "在C ++ Linux中的套接字超时"

最简单的方法是设置一个alarm并用信号中断connect (参见UNP 14.2):

 signal( SIGALRM, connect_alarm ); /* connect_alarm is you signal handler */ alarm( secs ); /* secs is your timeout in seconds */ if ( connect( fs, addr, addrlen ) < 0 ) { if ( errno == EINTR ) /* timeout */ ... } alarm( 0 ); /* cancel alarm */ 

虽然使用select是不是很难:)
您可能也想了解原始套接字 。

如果你使用阻塞IO来完成这个工作,你应该调查setsockopt()调用,特别是SO_SNDTIMEO标志(或其他标志,取决于你的操作系统)。

预先警告这些标志不可靠/便携,并且可以在不同平台或给定平台的不同版本上以不同方式实施。

传统/最好的方法是通过使用select()的非阻塞方法。 如果你不熟悉socket,最好的书籍之一就是TCP / IP Illustrated,Volume 1:The Protocols。 亚马逊网站: http:

RudeSocket解决了这个问题

我发现一个在Linux Fedora(不确定Windows)中测试过的lib文件,它给了我超时选项。 下面你可以找到一个非常简单的例子。

 #include <rude/socket.h> #include <iostream> using namespace std; using namespace rude; Socket soc; soc.setTimeout(30, 5); //Try connecting if (soc.connect("xxx.xxx.xxx.xxx", 80)){ cout << "Connected to xxx.xxx.xxx.xxx on Port " << 80 << "\n"; } //connections Failed else{ cout << "Timeout to xxx.xxx.xxx.xxx on Port " << 80 << "\n"; } soc.close(); 

这是一个到DevSite的链接