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的连接工作正常。我目前正在使用链接本地地址进行测试。