mediaios / net-diagnosis

ios平台网络诊断SDK,支持对ip和域名的ping,traceroute(udp,icmp协议),支持tcp ping, 端口扫描,nslookup,局域网活跃ip扫描等功能-----------Ios platform network diagnostic SDK, support ip and domain name ping, traceroute (udp, icmp protocol), support tcp ping, port scan, nslookup, LAN active ip scan and other functions
MIT License
555 stars 132 forks source link

PNTcpPing在处理一个连接不上的IP的时候,超时时间不能设定 #7

Closed chenfengfeng closed 5 years ago

chenfengfeng commented 5 years ago
- (int)connect:(struct sockaddr_in *)addr{
    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock == -1) {
        return errno;
    }
    int on = 1;
    setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on));
    setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on));

    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
    if (connect(sock, (struct sockaddr *)addr, sizeof(struct sockaddr)) < 0) {
        int err = errno;
        close(sock);
        return err;
    }
    close(sock);
    return 0;
}

我设置了timeout后还是不能,要等好久

chenfengfeng commented 5 years ago

各方面查询了下,代码里面的超时,其实是在建立建立后的发送和接收的超时,而不是建立连接的超时,默认超时时间为2分7秒,代码的sock采用了柱塞式连接,所以遇到一个不存在的IP的时候就会卡住等待很久,我查询了下,最好就是采用非柱塞式连接,这样的话,代码是需要改变的,不能这样写。。。

mediaios commented 5 years ago

是的,代码里使用的是阻塞式的。其实我们想要的结果就是三次TCP连接的时长。个人感觉代码整体上是没问题的,就是少了一种特殊情况的处理(没想到这种case),即:遇到一个不存在的ip,阻塞式socket会很久导致卡住。我们只需要对这种情况做一个处理即可,可以通过添加signal的方式捕获到这种case,进而返回结果结束tcp ping。 后续代码会更新。 感谢你提的issue。。。

chenfengfeng commented 5 years ago

嗯嗯~~希望能够优化一下,毕竟作为测试的项目,不可能没有错误的IP来测试的,所以我觉得还是有必要加上超时处理,否则一直在等待时间太长了

mediaios commented 5 years ago

嗯嗯,好的。这个项目刚开始就只是研究基于icmp的ping和traceroute,后来由于工作需要就一点一点把用到的东西都加进去了,有点糙哈。 后续我会继续尽力优化。非常感谢您!

CivelXu commented 3 years ago

@chenfengfeng 这个问题 有解法吗

mediaios commented 3 years ago

@CivelXu 这个问题已经解决过了呢,现在回等待1s,如果1s连接不成功,就这接error了。

image
mediaios commented 3 years ago

已经解决过了,请看github上的回复。

xuxiwen notifications@github.com 于2021年1月14日周四 下午3:30写道:

@chenfengfeng https://github.com/chenfengfeng 这个问题 有解法吗

— You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub https://github.com/mediaios/net-diagnosis/issues/7#issuecomment-759983036, or unsubscribe https://github.com/notifications/unsubscribe-auth/ALBSXO66BCMB5I7LOQNQAPDSZ2MQLANCNFSM4I7UUUIQ .