【问题标题】:Check if socket is listening in C检查套接字是否在 C 中侦听
【发布时间】:2012-04-21 15:59:31
【问题描述】:

在遍历套接字文件描述符时,如何检查其中一个是否来自被动套接字(侦听连接)?

【问题讨论】:

    标签: c sockets file-descriptor


    【解决方案1】:

    这可以通过getsockopt(SO_ACCEPTCONN) 进行检查。例如:

    #include <sys/socket.h>
    
    int val;
    socklen_t len = sizeof(val);
    if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
        printf("fd %d is not a socket\n", fd);
    else if (val)
        printf("fd %d is a listening socket\n", fd);
    else
        printf("fd %d is a non-listening socket\n", fd);
    

    【讨论】:

    • FWIW:Mac OS X High Sierra (10.13.6) 似乎不接受 SO_ACCEPTCONN。 getsockopt 的手册页没有它;和一个电话让你回来错误 42:协议不可用。
    【解决方案2】:

    您可以在命令行中运行(在 Mac/Linux 环境中):

    lsof -i
    

    和/或(Linux/Mac/Windows 环境)

    netstat -a
    

    【讨论】:

    • 他要求一个 C 解决方案(不是我倒下了)。
    【解决方案3】:

    严格来说,您可以尝试对套接字执行一个操作,该操作会偶然确定它是什么类型的套接字,例如尝试接受来自它的连接。如果accept() 因 EINVAL 失败,这是一个很好的迹象,表明它没有在听。 :)

    不过,跟踪哪些套接字是总体上更好的解决方案。除非您正在构建一个非常简单的应用程序,否则您可能需要在每个套接字上保留某种额外的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2011-04-20
      • 1970-01-01
      • 2016-08-19
      • 2011-12-10
      • 1970-01-01
      • 2017-07-20
      • 2012-06-26
      相关资源
      最近更新 更多