Problem beim Versenden von einem String per Client an Server[gelöst]



  • Serverklasse:

    Header:

    int Server::Handle_Client(const int sock)
    {
    	char buffer[BUF_SIZ];
    	int bytes;
        bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
    
        if (bytes == -1)
        {
            perror("recv() in get_banner() failed");
            return 1;
        }
    
        buffer[bytes] = '\0';
    
    cout << buffer << endl;
    	return 0;
    }
    

    Source:

    #include "Klasse.h"
    
    int main()
    {
    	Server a;
    	a.SocketStart();
    	return 0;
    }
    

    Client:

    void cut(char *s)
    {
        while (*s && (*s != '\r') && (*s != '\n'))
            s++;
        *s = '\0';
    }
    
    DWORD WINAPI reader(PVOID pParam)
    {
        char line[BUF_SIZ];
        SOCKET s;
    
        s = *(SOCKET*)pParam;
    
        while(fgets(line, sizeof(line) - 3, stdin))
        {
            cut(line);
            strcat(line, "\r\n");    /* passt sicher */
            if (send(s, line, strlen(line), 0) == -1)
                return 1;
        }
    
        return 0;
    }
    
    DWORD WINAPI writer(PVOID pParam)
    {
        char buffer[BUF_SIZ] = "gar nichts";
        int bytes;
        SOCKET s;
    
        s = *(SOCKET*)pParam;
    
        while((bytes = recv(s, buffer, sizeof(buffer), 0)) > 0)
            fwrite(buffer, 1, bytes, stdout);
    
        return 0;
    }
    

    Mein Problem ist, dass die Daten, die ich vom Client zum Server senden möchte, nicht ankommen. Die Funktion recv() gibt den Fehlercode -1 bzw. SOCKET_ERROR aus.

    recv() in get_banner() failed...

    Was mache ich falsch?


  • Administrator

    skullyan schrieb:

    Was mache ich falsch?

    1. Du schreibst zu viel Code hin, dass wird sich ja niemand antun und durchlesen.
    2. Du gibst eine ungenügende Fehlerbeschreibung.
    3. Du wählst wohl sogar das falsche Forum. Du benutzt die WinAPI Sockets, also frag auch im WinAPI Forum nach, denn die wissen, wie diese Sockets funktionieren.

    Grüssli



  • Wie kann ich das denn verschieben, wenn überhaupt...



  • Selber kannst du den Thread nicht verschieben. Vielleicht ist aber ein Moderator so nett. 😉



  • Benutze WSAGetLastError()...
    Simon



  • Fehler: 10057. Socket not connected. Aber wie kann das denn sein, wenn vorher alles geklappt hat?



  • Es kann nicht alles geklappt haben.. 🕶

    Zeigmal dein Code, der dein Socket erzeugt und schlussendlich int Server::Handle_Client(const int sock) aufruft.

    Simon



  • #ifndef _SERVER_
    #define _SERVER_
    
    #include <iostream>
    #include <string>
    #include <winsock.h>
    using namespace std;
    #define BUF_SIZ 4096
    
    class Server
    {
    private:
    	SOCKET s, c;
    	int addr_len;
    	struct sockaddr_in addr;
    public:
    	Server()
    	{}; //Konstrukor
    	~Server(){}; // Destruktor
    	int SocketStart();
    	int Handle_Client(const int sock);
    
    }; 
    
    int Server::Handle_Client(const int sock)
    {
    	char buffer[BUF_SIZ];
    	int bytes;
        bytes = recv(sock, buffer, sizeof(buffer) - 1, 0);
    	int a = WSAGetLastError();
    	cout << a << endl;
        if (bytes == -1)
        {
            perror("recv() in get_banner() failed");
            return 1;
        }
    
        buffer[bytes] = '\0';
    
    cout << buffer << endl;
    	return 0;
    }
    
    int Server::SocketStart()
    {
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
            return EXIT_FAILURE;
        }
    		//SOCKET ANLEGEN	Sleep(2345);
    	s = socket(PF_INET, SOCK_STREAM, 0);
    	if (s == -1)
    	{
    	  perror("socket() failed");
    	  return 1;
    	}
    		//CONNECTEN
    	addr.sin_addr.s_addr = INADDR_ANY;
    	addr.sin_port = htons(7000);
    	addr.sin_family = AF_INET;
    
    	//BINDEN
    	if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == -1)
    	{
    		perror("bind() failed");
    		return 2;
    	}
    
    	//ZUHÖREN
    	if (listen(s, 3) == -1)
    	{
    		perror("listen () failed");
    		return 3;
    	}
    
    	//WARTEN
    	for(;;)
        {
            addr_len = sizeof(addr);
            c = accept(s, (struct sockaddr*)&addr, &addr_len);
            if (c == -1)
            {
                perror("accept() failed");
                continue;
            }
    
            printf("Client from %s\n", inet_ntoa(addr.sin_addr));
    		Server::Handle_Client(s);
            closesocket(c);
    	}
    	closesocket(s);
    
    	return 0;
    } 
    
    #endif _SERVER_
    


  • Und...?



  • skullyan schrieb:

    Und...?

    Jetzt wartest Du ein bisschen, bis sich das jemand ansieht, der WinAPI mag oder ein C++-Mod Dich ins entsprechende Forum verschiebt, ohne im anderthalb-Stunden-Takt nachzufragen. 🙂



  • Server::Handle_Client(s);
    

    Du versuchst auf dem Server Socket zu empfangen... versuchsmal mit dem Client Soccket... 😉



  • theta schrieb:

    Server::Handle_Client(s);
    

    Du versuchst auf dem Server Socket zu empfangen... versuchsmal mit dem Client Soccket... 😉

    Der Client schickt ihm aber einen String. Muss der vom Server nicht rein theoretisch ausgelesen werden?

    Client:

    DWORD WINAPI writer(PVOID pParam)
    {
        char buffer[BUF_SIZ] = "gar nichts";
        int bytes;
        SOCKET s;
    
        s = *(SOCKET*)pParam;
    
        while((bytes = recv(s, buffer, sizeof(buffer), 0)) > 0)
            fwrite(buffer, 1, bytes, stdout);
    
        return 0;
    }
    


  • Ich verstehe nicht, wie das funktionieren soll. Kannst Du mir ein Beispiel geben?



  • Bitte, denn ich will das echt verstehen...



  • Wie wärs mit ein wenig Geduld? Dein erster Post ist gerade mal 1.5 Stunden her... 🙄



  • außerdem wird hier nicht alles verraten.



  • Das war nun genug Geduld, oder?



  • Ich versuche gerade einen einfachen char String zu senden:

    Server:

    int Server::Handle_Client(const int sock)
    {
        int bytes, err;
        char banner[] = "Welcome to the Foobar server!\r\n";
    
        bytes = send(sock, banner, strlen(banner), 0);
        if (bytes == -1)
        {
            perror("send() in send_banner() failed");	
    		err = WSAGetLastError();
    		std::cout << err;
            return 1;
        }
        return 0;
    }
    

    Client:

    int send_request(const int sock, const char *hostname)
    {
        char buf[BUF_SIZ];
        int bytes;
    
        bytes = recv(sock, buf, sizeof(buf) - 1, 0);
        if (bytes == -1)
        {
            perror("recv() in get_banner() failed");
            return 1;
        }
    
        buf[bytes] = '\0';
    
        printf("Banner is \"%s\"\n", buf);
    
        return 0
    }
    

    WSAGetLastError() gibt immer aus, dass der Socket nicht verbunden ist. 10057. Wieso?? Alles andere vorher funktioniert nämlich und auch der Socket ist angeblich verbunden, dann aber plötzlich nicht mehr?!



  • hat sich erledigt. closed.



  • Zum Glück, dein Spam war unerträglich 😃


Log in to reply