只给出一个现有的/打开的套接字句柄,如何确定套接字是否是Linux下面向连接的套接字?我在Windows下搜索类似WSAPROTOCOL_INFO
的内容,我可以使用getsockopt
检索。
提前致谢, 克里斯托弗
答案 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
}