C 调用IPv6套接字的连接时出现无效参数错误
我调用时遇到无效参数错误C 调用IPv6套接字的连接时出现无效参数错误,c,sockets,ipv6,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,
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是否缺少一些功能 您需要传递地址的大小,它是
sizeof(m_socket\u addrv6)
,而不是sizeof(struct sockaddr)
这是connect的函数签名
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
addrlen
参数必须是addr
参数的真实大小。您将其指定为sizeof(struct sockaddr)
。这对于您正在传递的实际结构来说太小,因此connect将无法正确使用您的结构
而是传递m_socket\u addrv6
结构的实际大小
connect(m_socket, (struct sockaddr*)&m_socket_addrv6, sizeof(m_socket_addrv6));
请尝试使用
sizeof(m_socket\u addrv6)
。您正在告诉connect
您正在传递的结构,它比实际更小。@PaulRooney谢谢!这样就消除了错误。连接有效吗sin6\u scope\u id
为0,尽管该地址似乎是链接本地地址@MartinRosenau是的,sin6_scope_id=0的连接工作正常。我目前正在使用链接本地地址进行测试。