确定Linux下现有套接字句柄的类型

时间:2013-09-02 10:14:52

标签: linux sockets

只给出一个现有的/打开的套接字句柄,如何确定套接字是否是Linux下面向连接的套接字?我在Windows下搜索类似WSAPROTOCOL_INFO的内容,我可以使用getsockopt检索。

提前致谢, 克里斯托弗

2 个答案:

答案 0 :(得分:3)

int sock_type;
socklen_t sock_type_length = sizeof(sock_type);
getsockopt(socket, SOL_SOCKET, SO_TYPE, &sock_type, &sock_type_length);

if (sock_type == SOCK_STREAM) {
    // it's TCP or SCTP - both of which are connection oriented
} else if (sock_type == SOCK_DGRAM) {
    // it's UDP - not connection oriented
}

我认为这有点过于简单,因为可以有其他协议可以是流或数据报,但这段代码几乎总是你想要的。

答案 1 :(得分:1)

取自here

  

套接字选项

     

可以使用setsockopt(2)并使用read来设置这些套接字选项   getsockopt(2),所有套接字的套接字级别设置为SOL_SOCKET:

     

...

     

SO_PROTOCOL (自Linux 2.6.32起)       以整数形式检索套接字协议,返回诸如IPPROTO_SCTP之类的值。有关详细信息,请参阅socket(2)。这个套接字选项是   只读的。

     

<强> SO_TYPE      获取整数的套接字类型(例如,SOCK_STREAM)。此套接字选项是只读的。

要更正xaxxon提供的解决方案,代码必须是:

int sock_type;
socklen_t sock_type_length = sizeof(sock_type);
getsockopt(socket, SOL_SOCKET, SO_TYPE, &sock_type, &sock_type_length);

if (sock_type == SOCK_STREAM) {
    getsockopt(socket, SOL_SOCKET, SO_PROTOCOL, &sock_type, &sock_type_length);
    if (sock_type == IPPROTO_TCP) {
        // it's TCP
    } else {
        // it's SCTP
    }
} else if (sock_type == SOCK_DGRAM) {
    // it's UDP
}