调用IPv6插槽的连接时参数错误无效

时间:2017-07-19 00:05:56

标签: c sockets ipv6

调用

时出现无效的参数错误
connect(m_socket, (struct sockaddr *)&m_socket_addrv6, sizeof(struct sockaddr));

m_socket_addrv6是一个sockaddr_in6结构。 从gdb开始,这就是m_socket_addrv6的样子。

>{sin6_len = 0 '\0', sin6_family = 28 '\034', sin6_port = 20480,  sin6_flowinfo = 0, sin6_addr = {__u6_addr = {
  __u6_addr8 = "�\200\000\000\000\000\000\000\002PV���\000n", __u6_addr16 = {33022, 0, 0, 0, 20482, 65366, 48126, 28160},
  __u6_addr32 = {33022, 0, 4283846658, 1845541886}}}, sin6_scope_id = 0}. 

类似的代码适用于IPv4。 v6有什么我缺少的吗?

2 个答案:

答案 0 :(得分:2)

这是connect的函数签名。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

addrlen参数必须是addr参数的真实大小。您将其指定为sizeof(struct sockaddr)。这对于您传递的实际结构来说太小了,因此connect不会正确使用您的结构。

而是传递m_socket_addrv6结构的实际实际大小。

connect(m_socket, (struct sockaddr*)&m_socket_addrv6, sizeof(m_socket_addrv6));

答案 1 :(得分:1)

您需要传递地址的大小,即sizeof(m_socket_addrv6) sizeof(struct sockaddr)