2017-07-19 57 views
1

我收到一个无效的参数错误,当我打电话无效的参数错误而调用connect为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?

+4

请尝试'sizeof(m_socket_addrv6)'而不是。你告诉'connect'你传递的结构比实际小。 –

+0

@PaulRooney谢谢!那摆脱了错误。 – aupreti

+0

连接是否工作? 'sin6_scope_id'是0,尽管地址似乎是链接本地地址! –

回答

2

这是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)); 
1

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

相关问题