繁体   English   中英

C ++ Linux中的套接字超时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM