Über Winsock Datei senden funktioniert nicht



  • Ich überlege jetzt schon eien weile und komm einfach nicht auf den fehler in meinem programm...
    ich habe einen server der eine datei annimmt und diese speichert.
    und ich habe einen client der sie sendet.

    vom server bekomm ich den fehler "recv failed: 10054". damit weiß ich schonmal wo sich das programm aufhängt. der client beendet sich einfach ohne dass die "pause" anweisung aufgerufen wird.

    die datei die der server empfangen soll erstellt er auch, sie wird aber nicht mit daten gefüllt die empfangen werden sollten.

    hier der code vom SERVER:

    [cpp]
    #include <fstream>
    #include <iostream>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;
    // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
    
    #define DEFAULT_BUFLEN 512
    #define DEFAULT_PORT "27015"
    
    int __cdecl main(void) 
    {
        WSADATA wsaData;
        SOCKET ListenSocket = INVALID_SOCKET,
               ClientSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL,
                        hints;
        char recvbuf[DEFAULT_BUFLEN];
        int iResult, iSendResult;
        int recvbuflen = DEFAULT_BUFLEN;
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult);
    		system("pause");
            return 1;
        }
    
        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;
    
        // Resolve the server address and port
        iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed: %d\n", iResult);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
        // Create a SOCKET for connecting to server
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
        if (ListenSocket == INVALID_SOCKET) {
            printf("socket failed: %ld\n", WSAGetLastError());
            freeaddrinfo(result);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
        // Setup the TCP listening socket
        iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
        if (iResult == SOCKET_ERROR) {
            printf("bind failed: %d\n", WSAGetLastError());
            freeaddrinfo(result);
            closesocket(ListenSocket);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
        freeaddrinfo(result);
    
        iResult = listen(ListenSocket, SOMAXCONN);
        if (iResult == SOCKET_ERROR) {
            printf("listen failed: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
        // Accept a client socket
        ClientSocket = accept(ListenSocket, NULL, NULL);
        if (ClientSocket == INVALID_SOCKET) {
            printf("accept failed: %d\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
        // No longer need server socket
        closesocket(ListenSocket);
    
    	ofstream ausgabe("datei2.bin", ios_base::out | ios_base::app | ios_base::binary);
        // Receive until the peer shuts down the connection
        do {
    		// EINLESEN UND SCHREIBEN VON DATEI --------------------------------------
    
            iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
            if (iResult > 0) {
                printf("Bytes received: %d\n", iResult);
    
    			ausgabe.write(recvbuf, sizeof(recvbuf));		
    		// ENDE --------------------------------------------------------------------	
    
    		/*
            // Echo the buffer back to the sender
                iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
                if (iSendResult == SOCKET_ERROR) {
                    printf("send failed: %d\n", WSAGetLastError());
                    closesocket(ClientSocket);
                    WSACleanup();
                    return 1;
                }
                printf("Bytes sent: %d\n", iSendResult);
    			*/
            }
            else if (iResult == 0)
                printf("Connection closing...\n");
            else  {
                printf("recv failed: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
    			system("pause");
                return 1;
            }
    
        } while (iResult > 0);
    	ausgabe.close();
    	system("pause");
    
        // shutdown the connection since we're done
        iResult = shutdown(ClientSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
            printf("shutdown failed: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
    	system("pause");
            return 1;
        }
    
        // cleanup
        closesocket(ClientSocket);
        WSACleanup();
        system("pause");
        return 0;
    }
    [/cpp]
    

    und hier der code vom CLIENT (wird mit " *.exe IP " geöffnet:

    [cpp]
    #include <fstream>
    #include <iostream>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;
    // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
    
    #define DEFAULT_BUFLEN 512
    #define DEFAULT_PORT "27015"
    
    int __cdecl main(int argc, char **argv) 
    {
        WSADATA wsaData;
        SOCKET ConnectSocket = INVALID_SOCKET;
        struct addrinfo *result = NULL,
                        *ptr = NULL,
                        hints;
        char *sendbuf = "this is a test";
    //    char recvbuf[DEFAULT_BUFLEN];
        int iResult;
    //    int recvbuflen = DEFAULT_BUFLEN;
    
    	// Validate the parameters
        if (argc != 2) {
            printf("usage: %s server-name\n", argv[0]);
    		system("pause");
            return 1;
        }
    
    	// Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != 0) {
            printf("WSAStartup failed: %d\n", iResult); 
    	system("pause");
            return 1;
        }
    
    	ZeroMemory( &hints, sizeof(hints) );
        hints.ai_family = AF_UNSPEC;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
    
        // Resolve the server address and port
        iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed: %d\n", iResult);
            WSACleanup();
    		system("pause");
            return 1;
        }
    
    	// Attempt to connect to an address until one succeeds
        for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
    
            // Create a SOCKET for connecting to server
            ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
                ptr->ai_protocol);
            if (ConnectSocket == INVALID_SOCKET) {
                printf("Error at socket(): %ld\n", WSAGetLastError());
                freeaddrinfo(result);
                WSACleanup();
    	    system("pause");
                return 1;
            }
    
            // Connect to server.
            iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
            if (iResult == SOCKET_ERROR) {
                closesocket(ConnectSocket);
                ConnectSocket = INVALID_SOCKET;
                continue;
            }
            break;
        }
    
    	freeaddrinfo(result);
    
        if (ConnectSocket == INVALID_SOCKET) {
            printf("Unable to connect to server!\n");
            WSACleanup();
    		system("pause");
            return 1;
        }
    
    	// EINLESEN UND SENDEN VON DATEI
    
    	char buf[1];
    	char bufsend[DEFAULT_BUFLEN];
        int bytes;
    	int i;
        ifstream eingabe("datei1.bin", ios_base::in | ios_base::binary);
        if (eingabe.good())
    	{
           eingabe.seekg(0L,ios::end);
           bytes=eingabe.tellg();
           cout << bytes << endl;
           eingabe.seekg(0L,ios::beg);
        }
    
        for (i=0; i<bytes;)
    	{
    		for (int z=0; z<DEFAULT_BUFLEN; z++)
    		{
    			eingabe.read(buf, sizeof(buf));
    		    strcat(bufsend,buf);
    			i++;
    			cout << "i = " << i << endl;
    			if (i==bytes)
    			{
    				sendbuf=bufsend;
    				iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    				if (iResult == SOCKET_ERROR)
    				{
    					printf("send failed: %d\n", WSAGetLastError());
    					closesocket(ConnectSocket);
    					WSACleanup();
    					system("pause");
    					return 1;
    			    }
    			}
    		}
    		cout << bufsend << endl;
    		if (i<bytes)
    		{
    			sendbuf=bufsend;
    			// Send an initial buffer
    			iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
    			if (iResult == SOCKET_ERROR)
    			{
    				printf("send failed: %d\n", WSAGetLastError());
    				closesocket(ConnectSocket);
    				WSACleanup();
    				system("pause");
    				return 1;
    			}
    			printf("Bytes Sent: %ld\n", iResult); 
    		}
        }
        eingabe.close();
        system("pause"); // ---------------------------------------
    
        // shutdown the connection since no more data will be sent
        iResult = shutdown(ConnectSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
            printf("shutdown failed: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
    		system("pause");
            return 1;
        }
    /*
        // Receive until the peer closes the connection
        do {
    
            iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
                printf("Bytes received: %d\n", iResult);
            else if ( iResult == 0 )
                printf("Connection closed\n");
            else
                printf("recv failed: %d\n", WSAGetLastError());
    
        } while( iResult > 0 );
    */
        // cleanup
        closesocket(ConnectSocket);
        WSACleanup();
    
        // << FUNKTIONUCKELT <<
    
    system("pause");
    
    	return 0;
    }
    [/cpp]
    

    vielen dank schonmal vorab für die hilfe!


Log in to reply