为 IPv6 套接字调用连接时出现无效参数错误
Invalid argument error while calling connect for IPv6 socket
我在调用
时收到无效参数错误
connect(m_socket, (struct sockaddr *)&m_socket_addrv6, sizeof(struct sockaddr));
m_socket_addrv6 是一个 sockaddr_in6 结构。
从 gdb 中,这就是 m_socket_addrv6 的样子。
>{sin6_len = 0 '[=11=]', sin6_family = 28 '4', sin6_port = 20480, sin6_flowinfo = 0, sin6_addr = {__u6_addr = {
__u6_addr8 = "�0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]2PV���[=11=]0n", __u6_addr16 = {33022, 0, 0, 0, 20482, 65366, 48126, 28160},
__u6_addr32 = {33022, 0, 4283846658, 1845541886}}}, sin6_scope_id = 0}.
类似的代码适用于 IPv4。 v6 有什么我想念的吗?
需要传地址的大小,是sizeof(m_socket_addrv6)
,不是sizeof(struct sockaddr)
.
这里是connect的函数签名。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
addrlen
参数需要是 addr
参数的真实大小。您将其指定为 sizeof(struct sockaddr)
。这对于您传递的实际结构来说太小了,因此连接将无法正确使用您的结构。
而是传递 m_socket_addrv6
结构的实际实际大小。
connect(m_socket, (struct sockaddr*)&m_socket_addrv6, sizeof(m_socket_addrv6));
我在调用
时收到无效参数错误connect(m_socket, (struct sockaddr *)&m_socket_addrv6, sizeof(struct sockaddr));
m_socket_addrv6 是一个 sockaddr_in6 结构。 从 gdb 中,这就是 m_socket_addrv6 的样子。
>{sin6_len = 0 '[=11=]', sin6_family = 28 '4', sin6_port = 20480, sin6_flowinfo = 0, sin6_addr = {__u6_addr = {
__u6_addr8 = "�0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]0[=11=]2PV���[=11=]0n", __u6_addr16 = {33022, 0, 0, 0, 20482, 65366, 48126, 28160},
__u6_addr32 = {33022, 0, 4283846658, 1845541886}}}, sin6_scope_id = 0}.
类似的代码适用于 IPv4。 v6 有什么我想念的吗?
需要传地址的大小,是sizeof(m_socket_addrv6)
,不是sizeof(struct sockaddr)
.
这里是connect的函数签名。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
addrlen
参数需要是 addr
参数的真实大小。您将其指定为 sizeof(struct sockaddr)
。这对于您传递的实际结构来说太小了,因此连接将无法正确使用您的结构。
而是传递 m_socket_addrv6
结构的实际实际大小。
connect(m_socket, (struct sockaddr*)&m_socket_addrv6, sizeof(m_socket_addrv6));