2017-03-02 3 views
2

Also übergebe ich ein Argument an meine Hauptleitung, die eine IP ist als Char * Name ipStr.Warum bekomme ich "ungültiges Argument" von sendto()?

Dann initialisiert ich eine Variable die Länge davon sendto() vor dem Aufruf zu halten:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
char buffer[8]; 
socklen_t ipLen = sizeof(ipStr); 

      res = sendto(sock, buffer, sizeof(buffer), 0, 
        (struct sockaddr*) &ipStr, ipLen); 

Doch noch Invalid argument ich bin immer als ein Fehler zurückgegeben.

Ich bekomme keine Kompilierfehler mit g ++, so dass ich nicht sicher bin, wo das Problem liegt.

EDIT

ich bemerkte ich sizeof vor ipLen nicht gelöscht hatte, änderte sich die obigen und noch Invalid argument bekommen.

+0

Liefert Socket korrekt zurück? Wofür ist ipStr eingestellt? – Joe

+0

Ja 'Socke' kehrt korrekt zurück, ich bin mir nicht sicher, was Sie mit dem meinen, auf dem ipStr eingestellt ist. – xeon48

+1

ipstr könnte Ihr "ungültiges Argument" sein, aber ich sehe keinen Code dafür, nur was Sie behaupten. Sehen wir uns einen vollständigen Code an, der Ihr Problem veranschaulicht. – Joe

Antwort

3

Ihre sockaddr ist wahrscheinlich falsch, es ist ein struct mit einer binären Darstellung der Adresse und einige andere Daten darin. Es ist ein sockaddr_in Cast zu sockaddr.

Versuchen:

struct sockaddr_in ip4addr; 

ip4addr.sin_family = AF_INET; 
ip4addr.sin_port = htons(1234); 
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4"); 
0

socklen_t ipLen = sizeof(ipStr) gibt die Größe von ipStr Datentyp, nicht die Länge der Zeichenfolge es verweist. Der Datentyp ipStr lautet char *, und sizeof(ipStr) ergibt daher 8 (oder 4 auf 32-Bit-Systemen). Daher wird Ihr Parameter wahrscheinlich nicht korrekt interpretiert.

Verwenden Sie stattdessen socklen_t ipLen = strlen(ipStr).

+0

'sendto' erwartet keine Strings oder Stringlängen. –

+0

@ n.m. 'ipLen' wird an' sendto' übergeben, und wenn 'ipStr' eigentlich ein' char * 'ist, dann ist' ipLen = sizeof (ipStr) 'entweder sinnlos (wenn nicht von sendto verwendet) oder falsch, oder? –

+0

iplen ist sinnlos, aber es macht nichts, weil ipstr nicht dort sein sollte. –

Verwandte Themen