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



  • 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 😃



  • Und? Tust Du jetzt dein von accept() erzeugtes Client Socket verwenden?
    Simon



  • theta schrieb:

    Und? Tust Du jetzt dein von accept() erzeugtes Client Socket verwenden?
    Simon

    Ja.


Anmelden zum Antworten