Frage zu Server [gelöst]



  • #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	    /* initialize windows sockets */
        WSADATA wsa;
        if (WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            cout << "WSAStartup() failed: " << (unsigned long)GetLastError() << endl;
            return EXIT_FAILURE;
        }
    	SOCKET s;
    	s = socket(PF_INET, SOCK_STREAM, 0);
    	if (s == -1)
    	{
    		cout << "socket() failed" << endl;
    		return 1;
    	}
    	struct sockaddr_in addr;
    
    	addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
    	addr.sin_port = htons(1234);
    	addr.sin_family = AF_INET;
    
    	if (bind(s, (struct sockaddr*) &addr, sizeof(addr)) == -1)
    	{
    		cerr << "bind() failed" << endl;
    		return 2;
    	}
    	if (listen(s, 3) == -1)
    	{
    		cerr << "listen () failed" << endl;
    		return 3;
    	}
    	struct sockaddr_in cli;
    socklen_t cli_size;
    
    cli_size = sizeof(cli);
    if ((c = accept(s, (struct sockaddr*) &cli, &cli_size)) == -1)
    {
    
        cerr << "accept() failed" << endl;
        return 4;
    }
    closesocket(s);
    
    }
    

    Das soll ein Server sein. Er kompiliert aber nicht. Warum?

    Fehlermeldungen:

    error C2065: 'socklen_t': nichtdeklarierter Bezeichner
    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'cli_size'
    error C2065: 'cli_size': nichtdeklarierter Bezeichner
    error C2065: 'cli_size': nichtdeklarierter Bezeichner
    error C2065: 'c': nichtdeklarierter Bezeichner
    error C2065: 'cli_size': nichtdeklarierter Bezeichner
    


  • hast du dem Programm auch 2 Argumente übergeben? Du solltest auf jeden Fall noch eine Abfrage einbauen, ob argc auch groß genug ist.
    Wenn das nicht hilft zerleg die Zeile mal in Einzeanweisungen und schau wo es dann hakt:

    char const* arg2 = argv[2];
    int port = atoi(arg2);
    addr.sin_port = htons(port);
    


  • pumuckl schrieb:

    hast du dem Programm auch 2 Argumente übergeben? Du solltest auf jeden Fall noch eine Abfrage einbauen, ob argc auch groß genug ist.
    Wenn das nicht hilft zerleg die Zeile mal in Einzeanweisungen und schau wo es dann hakt:

    char const* arg2 = argv[2];
    int port = atoi(arg2);
    addr.sin_port = htons(port);
    

    Hab' die Lösung, danke!



  • ...



  • skullyan schrieb:

    Jetzt aber eine andere Frage:

    Angenommen ich möchte, dass der Client versucht, eine Verbindung zum Server aufzubauen. Dann müsste er es ja immer wieder versuchen, wenn der Server vielleicht mal temporär nicht zu erreichen ist. Ich dachte da an eine for-Schleife, aber wie könnte man das am besten lösen?

    Unter anderem versucht connect unter Window selber (sehr) häufig erneut zu verbinden bevor es aufhört. Du könntest natürlich eine while schleife benutzen, um so lange zu versuchen eine Verbindung aufzubauen bis es geklappt hat.



  • ...



  • socklen_t wird wohl irgendwie nicht erkannt, oder?

    Naja, ich wüsste jetzt nicht, wie ich das lösen soll.

    PS.: Ich wollte kein neues Thema anfangen, daher habe ich das überschrieben. Ursprünglich war dieser Thread ein Thread über einen Client.



  • skullyan schrieb:

    socklen_t wird wohl irgendwie nicht erkannt, oder?

    Naja, ich wüsste jetzt nicht, wie ich das lösen soll.

    PS.: Ich wollte kein neues Thema anfangen, daher habe ich das überschrieben. Ursprünglich war dieser Thread ein Thread über einen Client.

    Schreibe einfach:

    int cli_size;
    

    anstelle von

    socklen_t cli_size;
    

    Simon

    edit:
    Guck in der Doku:
    http://msdn.microsoft.com/en-us/library/ms737526(VS.85).aspx


Anmelden zum Antworten