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 ...