我目前正在努力寻找C中inet / inet6套接字的ip,端口和传输类型。
问题是我得到了一个像
这样的套接字int s = socket( ... );
bind(s, soa, soa_len);
现在,我得到s
并想知道它绑定到哪个传输/接口/端口。
接口和端口很容易通过
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
使用的传输协议?
答案 0 :(得分:1)
使用man 7 socket
手册页中所述的getsockopt(descriptor, SO_TYPE, ...)
。例如:
#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
。