2012-04-10 10 views
1

Ich versuche, einen Puffer über UDP-Sockets in C zu senden, aber ich bekomme immer einen ungültigen Argument Fehler in sendto. Ich finde den Fehler einfach nicht. Könnte mir vielleicht jemand helfen? Danke im Voraus.Ungültiges Argument bei Verwendung von sendto

Hier ist mein Code:

/**/ void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer) 
{ 
    int iSocket; 
    /* */ 
    if ((iSocket = socket(AF_INET, SOCK_DGRAM, 0)) != -1) 
    { 
     int iSendToReturn; 
     struct sockaddr_in sinServerAddress; 
     struct hostent *pstHost; 
     /* */ 
     pstHost = (struct hostent *)gethostbyname((char *)pazClientAddress); 
     /* */ 
     sinServerAddress.sin_family = AF_INET; 
     sinServerAddress.sin_addr = *((struct in_addr *)pstHost->h_addr); 
     sinServerAddress.sin_port = iPortNumber; 
     bzero(&(sinServerAddress.sin_zero),8); 
     /* */ 
     fprintf(stdout,"sending '%s' to client '%s:%d'\n",pazBuffer,pazClientAddress,iClientPort); 
     iSendToReturn = sendto(iSocket, pazBuffer, sizeof(pazBuffer), 0, (struct sockaddr *)&sinServerAddress, sizeof(sinServerAddress)); 
     /* */ 
     if(iSendToReturn != -1) 
      fprintf(stdout,"%d bytes sent\n",iSendToReturn); 
     else 
      perror("SendTo"); 
     /* */ 
     close(iSocket); 
    } 
    else 
     fprintf(stdout,"could not connect to server\n"); 
} 
+1

Zwei Dinge über Ihren Code: zuerst vergessen Sie, die Port-Nummer in Netzwerk-Byte-Reihenfolge zu konvertieren. Das andere Problem ist, dass Sie 'sizeof (pazBuffer)' als Länge verwenden. Dies wird die Größe des Zeigers (d. H. 4 oder 8 Bytes) und nicht die Länge der Zeichenfolge erhalten. –

+0

Ich habe versucht sinServerAddress.sin_port = htons (iPortNumber); Vorher, aber ohne Erfolg – gekod

+1

Versuchen Sie, den Code in einem Debugger schrittweise zu durchlaufen, und untersuchen Sie alle Parameter, die Sie an 'sendto' übergeben, um sicherzustellen, dass sie korrekt sind. –

Antwort

1

Zum einen sind Sie die ewige Fehler von Anfänger C-Programmierer machen: sizeof mit der Größe eines Zeigers zu erhalten. Die Variable pazBuffer ist ein Zeiger, kein Array, so dass der Operator sizeof die Array-Länge nicht zurückgibt, was Sie wollen. Ihre IPCSend Funktion muss in der Länge von pazBuffer als separate Parameter zu übernehmen:

void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len) 


Was die Fehler Sie bekommen - es könnte sonst etwas in Beziehung gesetzt werden. Invalid argument bedeutet, dass einer der Parameter, die Sie an sendto übergeben, irgendwie ungültig ist. Da ich sehe, dass Sie den Socket-Deskriptor ordnungsgemäß initialisieren, besteht das Problem möglicherweise darin, dass der Sendepuffer irgendwie nicht gültig ist - möglicherweise ein Nullzeiger oder eine ungültige Adresse. Das bedeutet, dass das Problem aus dem von Ihnen geposteten Code nicht ersichtlich ist und wahrscheinlich in einem Code auftritt, der IPCSend aufruft.

+0

Nun, ich habe sizeof (pazBuffer) zu strlen (pazBuffer) geändert, danke für diesen. Es war eher ein Copy-Paste-Fehler eines alten Codes, den ich reparieren wollte. Jetzt für den Fehler, den ich bekomme, fprint ich eine Spur in der IPCSend-Funktion, wie Sie sehen können, und dort ist überhaupt kein Fehler, pazBuffer ist richtig. – gekod

+0

'strlen (pazBuffer)' ist keine gute Idee, da, wenn pazBuffer alle Nullbytes sind, strlen 0 zurückgibt. Sie sollten dem Ratschlag von Charles folgen und die Pufferlänge explizit übergeben. – jedwards

+0

@jedwards Der SO druckt den Inhalt von 'pazBuffer' vor dem' sendto' aus, so dass wir davon ausgehen können, dass es sich um eine normale Null-terminierte Zeichenkette handelt, was bedeutet, dass "strlen" in Ordnung ist. –

Verwandte Themen