1

仅给定一个现有/打开的套接字句柄,如何确定该套接字是否是 Linux 下的面向连接的套接字?我正在寻找类似WSAPROTOCOL_INFOWindows 下的东西,我可以使用getsockopt.

在此先感谢,克里斯托夫

4

2 回答 2

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
}

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

于 2013-09-02T10:24:21.550 回答
1

取自这里

插座选项

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

...

SO_PROTOCOL(自 Linux 2.6.32 起)以整数形式检索套接字协议,返回诸如 IPPROTO_SCTP 之类的值。有关详细信息,请参见套接字 (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
}
于 2013-09-02T10:26:10.297 回答