2017-07-19 1 views
1

Ich erhalte ein ungültiges Fehlerargument, wenn ichInvalid argument Fehler während für IPv6-Socket verbindet Aufruf

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

m_socket_addrv6 nenne, ist eine sockaddr_in6 Struktur. Von gdb, so sieht m_socket_addrv6 aus.

>{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}. 

Ähnliche Code funktionierte für IPv4. Gibt es etwas, das ich für v6 vermisse?

+4

Versuchen Sie 'sizeof (m_socket_addrv6)' stattdessen. Sie sagen, verbinden Sie die Struktur, die Sie übergeben, ist es kleiner als es tatsächlich ist. –

+0

@PaulRooney danke! das hat den Fehler beseitigt. – aupreti

+0

Funktioniert die Verbindung? 'sin6_scope_id' ist 0, obwohl die Adresse eine Link-lokale Adresse zu sein scheint! –

Antwort

2

Hier ist die Funktion Signatur von verbinden.

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

Das addrlen Argument muss die wahre Größe des addr Argument. Sie geben es als sizeof(struct sockaddr) an. Dies ist zu klein für die tatsächliche Struktur, die Sie übergeben, also wird connect Ihre Struktur nicht korrekt verwenden.

Stattdessen übergeben Sie die tatsächliche reale Größe der m_socket_addrv6 Struktur.

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

Sie müssen die Größe der Adresse zu übergeben, die sizeof(m_socket_addrv6) ist, nichtsizeof(struct sockaddr).

Verwandte Themen