我目前正在努力寻找C语言中的inet/inet6套接字的ip,端口和传输类型。
问题是我有一个 socket fd像
int s = socket( ... );
bind(s, soa, soa_len);
现在,我得到了
s
并想找出它绑定(bind)到哪个Transport/Interface/Port。接口(interface)和端口很容易通过
struct sockaddr_storage sa = {};:w
getsockname(s, (struct sockaddr*) &sa, sizeof(sa));
/* parse the fields of sa depending on sa.sa_family */
但是,我无法找出一种方法来确定
s
是TCP还是UDP套接字-但是必须以某种方式关联-因此:如何找出
s
使用的传输协议(protocol)? 最佳答案
按照 getsockopt(descriptor, SO_TYPE, ...)
手册页中的说明使用man 7 socket
。例如:
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
int socket_type(const int fd)
{
int type = -1;
socklen_t typelen = sizeof type;
if (fd == -1) {
errno = EINVAL;
return -1;
}
if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &typelen) == -1)
return -1;
errno = 0;
return type;
}
对于TCP(
AF_INET
和AF_INET6
套接字系列),这将返回SOCK_STREAM
;对于UDP,SOCK_DGRAM
。关于c - 找出 socket 的运输类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50379119/