Winsocks char Array kommt teils fehlerhaft an



  • Hallo ich habe ein Problem, dass wenn ich über Winsocks ein char array verschicken möchte einige Daten fehlerhaft ankommen...

    Client:

    #define DEFAULT_BUFLEN 512
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;
        int recvbuflen = DEFAULT_BUFLEN;
    [...]
        do {
            iResult = recv(ConnectSocket,recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
    		{
                printf("Bytes received: %s\n", recvbuf);
    			// Send an initial buffer
    			iResult = send( ConnectSocket, hWID, strlen(hWID), 0 );
    			if (iResult == SOCKET_ERROR) {
    				printf("send failed with error: %d\n", WSAGetLastError());
    				closesocket(ConnectSocket);
    				WSACleanup();
    				return 1;
        }
    [...]
    

    Server:

    do {
    				char SessionID[8];
    				gen_random(SessionID,8);
    			// Echo the buffer back to the sender
    				iSendResult = send( ClientSocket, SessionID, sizeof(SessionID), 0 );
    				if (iSendResult == SOCKET_ERROR) {
    					printf("send failed with error: %s\n", SessionID);
    					closesocket(ClientSocket);
    					WSACleanup();
    					return 1;
    				}
    				printf("Bytes sent: %d\nData sent: %s\n", iSendResult, SessionID);
    
    		} while (iResult > 0);
    

    Hier ein Bild von dem Ergebniss. 😮
    http://uppix.net/c/1/0/4e906027acdae1c54ce925aa79ce0.png



  • lawl



  • derp schrieb:

    lawl

    Danke für den hilfreichen Beitrag. 👍



  • Knebelkopf schrieb:

    Hallo ich habe ein Problem, dass wenn ich über Winsocks ein char array verschicken möchte einige Daten fehlerhaft ankommen...

    Client:

    #define DEFAULT_BUFLEN 512
        char recvbuf[DEFAULT_BUFLEN];
        int iResult;
        int recvbuflen = DEFAULT_BUFLEN;
    [...]
        do {
            iResult = recv(ConnectSocket,recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
    		{
                printf("Bytes received: %s\n", recvbuf);
    			// Send an initial buffer
    			iResult = send( ConnectSocket, hWID, strlen(hWID), 0 );
    			if (iResult == SOCKET_ERROR) {
    				printf("send failed with error: %d\n", WSAGetLastError());
    				closesocket(ConnectSocket);
    				WSACleanup();
    				return 1;
        }
    [...]
    

    Server:

    do {
    				char SessionID[8];
    				gen_random(SessionID,8);
    			// Echo the buffer back to the sender
    				iSendResult = send( ClientSocket, SessionID, sizeof(SessionID), 0 );
    				if (iSendResult == SOCKET_ERROR) {
    					printf("send failed with error: %s\n", SessionID);
    					closesocket(ClientSocket);
    					WSACleanup();
    					return 1;
    				}
    				printf("Bytes sent: %d\nData sent: %s\n", iSendResult, SessionID);
    
    		} while (iResult > 0);
    

    Hier ein Bild von dem Ergebniss. 😮
    http://uppix.net/c/1/0/4e906027acdae1c54ce925aa79ce0.png

    Bei recv() ist nicht garantiert das alles auf einmal empfangen wurde... du musst recv() in einer schliefe ausführen bis du alles hast, und aufpassen das du den Daten Puffer nicht überschreibst.

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

    Auserdem solltest du den Code nochmal überdenken! Aber das war ja nicht gefragt...



  • Vielen Danke lowbyte,

    Ich finde es echt toll wie schnell einem hier geholfen wird 🙂
    Werde mir am besten das gesamte Thema Winsocks allgemein anschauen.
    Tut mir echt Leid für die überflüssige Frage, beim nächsten mal denke ich selbst vorher besser nach, versprochen.




Log in to reply