找出套接字的传输类型
Find out transport type for socket
我目前正在努力寻找 C 中 inet/inet6 套接字的 ip、端口和传输类型。
问题是我有一个类似
的socket fd
int s = socket( ... );
bind(s, soa, soa_len);
现在,我得到了s
,想知道它绑定到哪个Transport/Interface/Port。
通过
接口和端口很简单
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
使用的传输协议?
按照 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
套接字系列),这将 return SOCK_STREAM
;对于 UDP,SOCK_DGRAM
。
我目前正在努力寻找 C 中 inet/inet6 套接字的 ip、端口和传输类型。
问题是我有一个类似
的socket fdint s = socket( ... );
bind(s, soa, soa_len);
现在,我得到了s
,想知道它绑定到哪个Transport/Interface/Port。
通过
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
使用的传输协议?
按照 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
套接字系列),这将 return SOCK_STREAM
;对于 UDP,SOCK_DGRAM
。