Socket Server Bindungs-Problem



  • Hallo Forumnutzer,

    für die Klasse Server habe ich folgenden Konstruktor:

    // Variablen in der Klasse Server
    char*buffer;
    const unsigned short bufferSize=8192;
    int clientID;
    const unsigned short port;
    int socketID;
    sockaddr_in targetClient;
    // Konstruktor
    Server::Server(unsigned short port):port(port){
    	unsigned int addrlen=sizeof(sockaddr_in);
    	const int y=1;
    
    	if(this->socketID=socket(AF_INET,SOCK_STREAM,0)==-1){ // Socket erzeugen
    		cerr<<"Couldn't create socket."<<endl;
    		exit(EXIT_FAILURE);
    	};
    	cout<<"socketID:"<<this->socketID<<endl;
    	/*
    	if(setsockopt(this->socketID,SOL_SOCKET,SO_REUSEPORT,&y,sizeof(y))==-1){
    		switch(errno){
    			case EBADF:
    				cerr<<"EBADF"<<endl;
    				break;
    			case EFAULT:
    				cerr<<"EFAULT"<<endl;
    				break;
    			case EINVAL:
    				cerr<<"EINVAL"<<endl;
    				break;
    			case ENOPROTOOPT:
    				cerr<<"ENOPROTOOPT"<<endl;
    				break;
    			case ENOTSOCK:
    				cerr<<"ENOTSOCK"<<endl;
    				break;
    			default:
    				cerr<<"unknown error"<<endl;
    				break;
    		};
    		exit(EXIT_FAILURE);
    	};
    	*/
    	this->targetClient.sin_addr.s_addr=INADDR_ANY; // IP-Adresse festlegen
    	this->targetClient.sin_family=AF_INET;
    	this->targetClient.sin_port=htons(this->port); // Port festlegen
    	if(bind(this->socketID,reinterpret_cast<sockaddr*>(&this->targetClient),sizeof(this->targetClient))==-1){
    		switch(errno){
    			case EACCES:
    				cerr<<"EACCES"<<endl;
    				break;
    			case EADDRINUSE:
    				cerr<<"EADDRINUSE"<<endl;
    				break;
    			case EBADF:
    				cerr<<"EBADF"<<endl;
    				break;
    			case EINVAL:
    				cerr<<"EINVAL"<<endl;
    				break;
    			case ENOTSOCK:
    				cerr<<"ENOTSOCK"<<endl;
    				break;
    			case EADDRNOTAVAIL:
    				cerr<<"EADDRNOTAVAIL"<<endl;
    				break;
    			case EFAULT:
    				cerr<<"EFAULT"<<endl;
    				break;
    			case ELOOP:
    				cerr<<"ELOOP"<<endl;
    				break;
    			case ENAMETOOLONG:
    				cerr<<"ENAMETOOLONG"<<endl;
    				break;
    			case ENOENT:
    				cerr<<"ENOENT"<<endl;
    				break;
    			case ENOMEM:
    				cerr<<"ENOMEM"<<endl;
    				break;
    			case ENOTDIR:
    				cerr<<"ENOTDIR"<<endl;
    				break;
    			case EROFS:
    				cerr<<"EROFS"<<endl;
    				break;
    			default:
    				cerr<<"unknown error"<<endl;
    				break;
    		};
    		exit(EXIT_FAILURE);
    	};
    	listen(this->socketID,1);
    	this->clientID=accept(this->socketID,reinterpret_cast<sockaddr*>(&this->targetClient),&addrlen);
    	this->buffer=new char[this->bufferSize];
    	cout<<"Connected on port "<<this->targetClient.sin_port<<"."<<endl;
    };
    

    main-Funktion:

    Server server(port);
    string buffer;
    
    server>>buffer;
    cout<<buffer<<endl;
    

    Als Ausgabe im Terminal erhalte ich:

    socketID:0
    ENOTSOCK
    

    Wieso wird this->socketID nicht als Socket angesehen bzw. warum kann keiner gebunden werden?
    sudo hat keinen Einfluss auf die Ausgabe.

    Übrigens, wenn ich den auskommentierten Code mitverwende, dann wird errno schon vorher ENOTSOCK. Als port verwende ich 15000.

    Wo liegt hier der Fehler?
    Habe den Code von hier.

    Danke im Voraus!

    Mit freundlichen Grüßen
    Seikuassi



  • Benutz Deinen Compiler um die Fehler zu finden.
    Aktivier Warnungen und lass Ihn pedantisch sein...
    g++ -Wall -pedantic ...


Log in to reply