bind()-Problem



  • Hallo zusammen,

    ich bin gerade dabei mir eine Socketklasse zu schreiben, jedoch habe ich irgendeinen Fehler bei der Anwendung der bind()-Methode.
    In meiner Methode ListenToClient() funktioniert der Aufruf nicht, kopiere ich allerdings das komplett in meinen Konstruktor, klappt es bestens.

    Könnt ihr mir sagen, woran das liegt ?
    Vielen Dank für die Hilfe 🙂

    class csocket
    {
    private:
    	void socketError(CString str,bool exitApp=true);
    
    	WSADATA wsaData;       // Socket instance
        SOCKET server,client;  // Socket file descriptor
    	SOCKADDR_IN sInfo;	   // SOCKADDR_IN struct
    	LPHOSTENT hostEntry;   // host
    
    public:
    	csocket(int port, CString host);
    	~csocket(void);
    	void ListenToClient();
    };
    
    csocket::csocket(int port, CString host)
    {
    	//initialize socket
    	if(WSAStartup(0x101, &wsaData) == SOCKET_ERROR)
    	{
    		socketError("Socketinitialization failed");
    	}
    
    	//create socket
    	if ((server=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
    	{
    		socketError("Socketcreation failed");
    	}
    
    	//store information about the server
    	if(inet_addr(host)==INADDR_NONE)//is it a DNS
    	{
    	    hostEntry=gethostbyname(host);
    	}
    	else //or an IP
    	{
    	    int addr=inet_addr(host);
    	    hostEntry=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
    	}
    	if(!hostEntry)
    	{
    		socketError("Invalid Host");
    	}
    
    	//fill the sockaddr_in struct
    	sInfo.sin_family = PF_INET;
        sInfo.sin_port = htons(port);
        sInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
    }
    
    csocket::~csocket(void)
    {
    	WSACleanup();
    }
    
    void csocket::socketError(CString str,bool exitApp)
    {
    	MessageBox(NULL, str, "SOCKET ERROR", MB_OK);
    	if(exitApp)exit(0); 
    }
    
    void csocket::ListenToClient()
    {
    	//sin_port nach CString wandeln
    	CString strport;
    	strport.Format("%d", ntohs(sInfo.sin_port));
    
    	//bind the socket
    	if(bind(server,(LPSOCKADDR)&sInfo,sizeof(sInfo)) == SOCKET_ERROR)
    	{
    		socketError("Can't bind the Socket");
    	}
    
    	//get socket to listen 
        if(listen(server, 2) == SOCKET_ERROR)
    	{
    		socketError("Can't listen on Port "+strport);
    	}
    	socketError("Listening on Port "+strport,false);
    
    	//wait for a client
    	if(accept(server, NULL,NULL) == INVALID_SOCKET)
    	{
    		socketError("Can't accept Client");
    	}
    	while(true)
    	{
    	  break;
     	}
    	closesocket(server);
    }
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo,

    was funktioniert denn nicht? Wie verhaelt sich das Programm? Kommt bind() mit
    einem Fehler zurueck?

    mfg
    v R



  • also wenn ich den Teil in meinen Konstruktor kopiere, funktioniert alles bestens.
    Jedoch beim Aufruf aus der ListenToClient()-Methode, erhalte ich meine Fehlermeldung "Can't bind the Socket"...
    😞

    //bind the socket
        if(bind(server,(LPSOCKADDR)&sInfo,sizeof(sInfo)) == SOCKET_ERROR)
        {
            socketError("Can't bind the Socket");
        }
    
        //get socket to listen 
        if(listen(server, 2) == SOCKET_ERROR)
        {
            socketError("Can't listen on Port "+strport);
        }
        socketError("Listening on Port "+strport,false);
    
        //wait for a client
        if(accept(server, NULL,NULL) == INVALID_SOCKET)
        {
            socketError("Can't accept Client");
        }
        while(true)
        {
          break;
         }
        closesocket(server);
    


  • hab jetzt mal alles aus dem Konstruktor in ne eigene Methode ausgelagert und nun klappts auch mit dem Nachbarn 😉

    Hat irgendwer dafür ne Erklärung ?



  • was gibt WSAGetLastError() für eine Nummer zurück?


Anmelden zum Antworten