Server accept() fail...



  • Hey,
    Zuerst: Ich bin neu hier und mir leider nicht ganz sich ob ich hier im richtigen Forum bin, wen ich falsch liege mich bitte benachrichtigen/verschieben... thx 😉
    Nun zu Meinem Problem:
    mein in c++ codierter kleiner "Server" lässt sich nicht mittels g++ compilern (oder wie das auch heißt?) ...
    Als Fehlermeldung bringt g++:
    no@no-tower:/media/E8E3-5598$ g++ server.cpp -o server
    server.cpp: In function ‘int main(int, char**)’:
    server.cpp:46:55: error: invalid conversion from ‘int*’ to ‘socklen_t*’
    server.cpp:46:55: error: initializing argument 3 of ‘int accept(int, sockaddr*, socklen_t*)’

    Und das ist der Code dazu:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <cstring>
    #include <cstdlib>
    
    #define BUFFER_SIZE 1024
    
    int main(int argc, char *argv[])
    {
    	int sock, cli_size;
    	struct sockaddr_in my_addr, cli;
    
    	if (sock = socket(AF_INET, SOCK_STREAM, 0) == -1)
    	{
    		perror("socket() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	my_addr.sin_family = AF_INET;
    	my_addr.sin_port = htons(222);
    	my_addr.sin_addr.s_addr = INADDR_ANY;
    
    	if (bind(sock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1)
    	{
    		perror("bind() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	if (listen(sock, 3) == -1)
    	{
    		perror("listen() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	for(;;)
    	{
    		cli_size = sizeof(cli);
    
    		if (accept(sock, (struct sockaddr *) &cli, &cli_size) == -1) // line 46
    		{
    			perror("accept() failed");
    			exit (EXIT_FAILURE);
    		}
    
    		printf("client from %s", inet_ntoa(cli.sin_addr));
    	}
    
    	return 0;
    }
    

    Wenn jemand eine Idee hat, was das ein könnte bitte melden,
    danke im vor raus, 🙂
    ein ziemliches newblood... 😉



  • cli_size ist ein int - und &cli_size demnach ein int*.
    accept(..) erwartet aber als 3. Argument ein socklen_t* - d.h. cli_size muss als socklen_t definiert werden.



  • cool, danke, jetzt lässt sichs compillern! ;)ABER wenn ich das programm jetzt mit diesem code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <cstring>
    #include <cstdlib>
    
    #define BUFFER_SIZE 1024
    
    int main(int argc, char *argv[])
    {
    	int sock, cli_size;
    	struct sockaddr_in my_addr, cli;
    	if (sock = socket(AF_INET, SOCK_STREAM, 0) == -1)
    	{
    		perror("socket() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	my_addr.sin_family = AF_INET;
    	my_addr.sin_port = htons(222);
    	my_addr.sin_addr.s_addr = INADDR_ANY;
    
    	if (bind(sock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == -1)
    	{
    		perror("bind() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	if (listen(sock, 3) == -1)
    	{
    		perror("listen() failed");
    		exit (EXIT_FAILURE);
    	}
    
    	for(;;)
    	{
    		socklen_t cli_size;
    		cli_size = sizeof(cli);
    
    		if (accept(sock, (struct sockaddr *) &cli, &cli_size) == -1)
    		{
    			perror("accept() failed");
    			exit (EXIT_FAILURE);
    		}
    
    		printf("client from %s", inet_ntoa(cli.sin_addr));
    	}
    
    	return 0;
    }
    

    ausführe gibt es nur zurück "bind() failed: Socket operation on non-socket" und schließt sich dann sofort... 😞

    nochmal danke & danke im vorraus
    newblood



  • keiner mehr ne idee? 😞



  • Schreibe mal folgenden Code um:

    // von
    if (sock = socket(AF_INET, SOCK_STREAM, 0) == -1)
    {
       // ...
    }
    
    // nach
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
       // ...
    }
    


  • cool, danke, jetzt geht's ... 😉


Anmelden zum Antworten