[WinSock] Problem beim Struktur senden
-
Hi
Ich bin gerade dabei WinSock in einer Klasse zu kapseln. Bisher klappt alles wunderbar. Jetzt habe ich mich daran gemacht, Dateien zu versenden. Ich benutze insgesamt nur eine Funktion zum versenden von Daten, deshalb sende ich vorher eine Struktur, in der Optionen und ähnliches wichtiges steht. So auch der Dateiname, falls eine Datei gesendet werden soll. Da der User ja einen Pfad, und nicht nur einen Dateinamen angibt, habe ich eine Funktion gebastelt, die den Namen rausholt:char *FormatFileString (char *fileString) { int iLen = lstrlen (fileString); if (iLen > MAX_PATH) return NULL; char *data = new char[MAX_PATH]; int f = 0; for (int i = (iLen - 1); fileString[i] != '\\'; --i, ++f) data[f] = fileString[i]; data[f] = '\0'; iLen = lstrlen (data); if (iLen > MAX_PATH) return NULL; char *result = new char[MAX_PATH]; f = 0; for (int i = (iLen - 1); i >= 0; --i, ++f) result[f] = data[i]; result[f] = '\0'; return result; }Da die Struktur eben nur den Dateinamen beinhalten soll und nicht den ganzen Pfad, dieser aber der Sende-Funktion überreicht wird, rufe ich diese Funktion auf, bevor ich die Strukur losschicke und fülle die Struktur mit dem Ergebnis. Wenn ich die Strukur dann aber empfangen habe, dann ist die Variable mit dem Dateinamen leer. Sobald ich die Funktion jedoch weglasse und einfach irgendeinen Text sende, ist sie gefüllt. Allerdings ist die Variable vor dem verschicken gefüllt, also leert sie sich scheinbar während, oder kurz vor dem Senden. Jetzt weiß ich bloß nicht woran das liegen kann.
Hier sind noch die Sende- und Empfangsfunktion:/*------------------------------------------------------------------|| || TYPE_STRUCT(x) || ||------------------------------------------------------------------|| || Formatiert eine typedef struct-Instanz, um sie senden und || || empfangen zu können. || ||------------------------------------------------------------------*/ #ifndef TYPE_STRUCT #define TYPE_STRUCT(x) ( (char *) &x ) #endif . . . /*------------------------------------------------------------------|| || WAXSOCKET::RecvData () || ||------------------------------------------------------------------|| || Empfängt Daten über den Socket sSocket und speichert diese in || || tyData. Bei Bedarf kann die Anzahl der zu übertragenden Bytes || || mit iBytesToRecv eingeschränkt werden. Ansonsten versucht die || || Funktion, 500 Bytes zu empfangen und diese in tyData || || zu speichern. ACHTUNG: Blockierend! || ||------------------------------------------------------------------*/ int WAXSOCKET::RecvData ( SOCKET sSocket, char FAR * tyData, int iBytesToRecv = 0 ) { if (iBytesToRecv == 0) iBytesToRecv = 500; recv (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0); if (wsh.iSendMode == SEND_FILE) { cout << wsh.lpFile; } lWaxBytes = recv (sSocket, tyData, iBytesToRecv, 0); if (lWaxBytes == 0) { DetachSocket (sSocket); return WSERROR_SOCKETCLOSED; } else if (lWaxBytes == SOCKET_ERROR) { return WSERROR_RECIEVE; } return lWaxBytes; } /*------------------------------------------------------------------|| || WAXSOCKET::SendData () || ||------------------------------------------------------------------|| || Sendet die in tyData enthaltenen Daten über den Socket sSocket || || Bei Bedarf kann die Anzahl der zu sendenden Bytes mit || || iBytesToSend eingeschränkt werden. Ansonsten versucht die || || Funktion, 500 Bytes zu senden. || ||------------------------------------------------------------------*/ int WAXSOCKET::SendData ( SOCKET sSocket, const char FAR * tyData, int iBytesToSend = 0, int iSendMode = SEND_DATA ) { if (iBytesToSend == 0) iBytesToSend = 500; if (iSendMode == SEND_FILE) { wsh.lpFile = ::FormatFileString ((char *) tyData); wsh.iSendMode = SEND_FILE; wsh.iBlockSize = SEND_BLOCKSIZE; } send (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0); lWaxBytes = send (sSocket, tyData, iBytesToSend, 0); if (lWaxBytes == SOCKET_ERROR) { return WSERROR_SEND; } return lWaxBytes; }DIV Ominion
-
Du sendest einen Pointer auf eine Zeichenkette. Der ist auf der anderen Seite natürlich nicht gültig.
-
du überprüfst ja noch nicht mal wieviel bytes dir recv gegeben hat

-
So, der Tipp hat mich letztendlich auf den richtigen Weg geführt. Danke.
Mfg Ominion
EDIT: der letzte nicht, sondern der von tenchou
EDIT2: noch brauch ich das auch nicht überprüfen
-
noch brauch ich das auch nicht überprüfen

-
solange die geschichte noch nicht wirklich funktioniert, mache ich mir darum keine sorgen
Mfg Ominion