C++ , Send () - Funktion sendet zusätzliche bytes
Ich habe ein Problem mit einer Winsock2-wrapper-Klassen (client-server) und nach unzähligen Stunden kratzen-meinen-Kopf-in-die Verwirrung, beschloss ich, es wäre besser, wenn ich bat um Eure Meinung.
Um genauer zu sein, das problem ist, dass jedes mal, wenn ich meine Send () - Funktion, sowohl der client und der server (nicht immer!) senden Sie ein oder zwei zusätzliche bytes!
Beispielsweise verwende ich SendBytes("Hallo") und die Recv-Funktion liefert "Hallo•" mit einem '•' oder andere zufällige Zeichen am Ende des Zeichen-array.
//main.cpp (Client)
#include "Socket.h"
int main()
{
NetworkService::Client cService = NetworkService::Client();
int res = cService.Initialize("127.0.0.1","20248");
if(res == 0){
int local = cService.SendBytes("Hello!");
printf("Bytes Sent: %ld\n", local);
cService.Shutdown();
char* temp = cService.Recv();
printf("String Recieved: %s - Size: %d",temp,strlen(temp));
printf("\nSTRLEN: %d",strlen("X5"));
}
else{
cService.Clean();
}
cService.Close();
while(!kbhit());
return 0;
}
Natürlich, sendet der server den string "X5" und der Kunde druckt die strlens ...
//The result with "X5" as the dummy text:
String Recieved: X5? - Size: 3 //Notice the extra '?' character
STRLEN: 2
Senden //Empfangen Funktionen
int NetworkService::Client::SendBytes(char* lData){
int local = send( ConnectSocket, lData, (int)strlen(lData), 0 );
if (local == SOCKET_ERROR) {
Close();
return WSAGetLastError();
}
return local;
}
char* NetworkService::Client::Recv(){
recv(ConnectSocket, recvbuf , recvbuflen, 0);
return recvbuf;
}
Hilfe würde geschätzt ^_^.
- Sie sind nicht die Entsendung der terminierenden NULL-byte in der Zeichenfolge.
- Vielen Dank für die Beantwortung so schnell! Heres die Sache , ich fügte hinzu, '\0' am Ende von string , aber es hat nichts. Ich bekomme immer noch zufällige Einfügungen.
- Sie haben bereits einen impliziten \0 gibt es durch die string-literal. damit Sie gesendet werden, obwohl, müssen Sie zum anpassen der Größe-parameter in der send () - Aufruf. ändern Sie es von strlen(L Daten) zu strlen(L Daten)+1 um die abschließenden \0. werden Sie sicher, dass die strlen() - Funktion, wenn Sie immer noch unsicher, warum dies notwendig ist.
- Es ist nicht wirklich notwendig ,ich benutzte es vor zu vergleichen, die Länge des langen strings , weil ich Durcheinander mit dem Problem mit mehr als 2 byte-strings. Ich denke, (L Daten)+1 funktionieren wird , danke ich werde es versuchen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entschuldigen Sie mich, aber
Was Sie versuchen zu erreichen? Es gibt viele ernsthafte Probleme in Ihrem code.
Dies ist nicht der Weg, den Sie senden die Daten über das Netzwerk. Es gibt zu viele Fehler.
WENN Sie möchten, senden von null-terminierte Zeichenfolgen, die über das Netzwerk:
als jeder sagte, Sie müssen nicht tatsächlich senden Sie die null-terminator. Sie hätte es geschickt, wenn Sie Hinzugefügt 1 um die Länge. Darüber hinaus mit langen Ketten, die
send()
Funktion nicht garantieren, dass Sie senden den ganzen string auf einmal. Sie haben zu prüfen, dass und senden Sie den fehlenden Teil.Du nicht den Rückgabewert überprüfen, so dass Sie nicht wissen, die Länge der empfangenen Zeichenkette. Als Sie nicht senden Sie das null-byte, das empfangen von Daten ist nicht null-terminiert ist. Auch, wenn null-terminator ist der einzige Trennzeichen mehr Daten, die Sie senden, müssen Sie zum Lesen von byte-by-byte (nicht effizient) nicht zu verpassen, der null-terminator, zu wissen, Wann zu beenden. Eine alternative wäre, Ihre eigenen zu machen Pufferung Schema (also das nächste Lesen würde teilweise das Ergebnis der früheren), oder das Protokoll ändern, um die Länge der zu transportierenden Daten sind im Voraus bekannt. Auch, die gleiche Bemerkung über das teilweise liest, wie mit den
send
- Funktion gilt auch hier.BTW Rückkehr eine statische/Globale Puffer ist nicht ein Zeichen von guter code.
recv
und behandelt als ein C-style string-Daten, ist nicht garantiert, dass ein C-Stil-string.Du nicht wirklich überprüfen Sie den Rückgabewert von
recv
.Gibt es eine do-while -, aber es tut nichts. Sie kehren von der Funktion ohne entsprechende Fehlerbehandlung, auch wenn
recv
nicht, aber Sie wird es nie erfahren.Auch Sie nicht senden Sie die Kündigung
\0
das ist nicht notwendig schlecht ist, hängt davon ab, was Sie versuchen zu tun, zum Beispiel, können Sie hinzufügen, dass nach Erhalt.=
im ernst?