仅给定一个现有/打开的套接字句柄,如何确定该套接字是否是 Linux 下的面向连接的套接字?我正在寻找类似WSAPROTOCOL_INFO
Windows 下的东西,我可以使用getsockopt
.
在此先感谢,克里斯托夫
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
}
我想这有点简单,因为可能有其他协议可以是流或数据报,但这段代码几乎总是你想要的。
取自这里:
插座选项
可以使用 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
}