C++ Linux中的套接字超时

Ang*_*.47 8 c++ sockets linux timeout

好吧首先,我想提一下我正在做什么是完全道德的,是的我是端口扫描.

当端口打开时程序运行正常,但是当我到达一个关闭的套接字时,程序会暂停很长时间,因为没有超时条款.以下是以下代码

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"; }

}
Run Code Online (Sandbox Code Playgroud)

我在堆栈溢出时发现了这个但是使用select()命令对我来说没有意义.

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

Nik*_*sov 7

最简单的是设置一个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 */
Run Code Online (Sandbox Code Playgroud)

尽管使用select并不困难:)
你可能也想了解原始套接字.