[英]Socket Timeout in C++ Linux
好吧首先,我想提一下我正在做什么是完全道德的,是的我是端口扫描。
当端口打开时程序运行正常,但是当我到达一个关闭的套接字时,程序会暂停很长时间,因为没有超时条款。 以下是以下代码
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()函数超时,所以我们不等一年它才能返回错误?
最简单的方法是设置一个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()的非阻塞方法。 如果您不熟悉套接字,那么最好的书之一就是TCP / IP Illustrated,第1卷:协议。 它位于亚马逊: http : //www.amazon.com/TCP-Illustrated-Protocols-Addison-Wesley-Professional/dp/0201633469
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的链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.