2017-07-19 84 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)