CAsyncSocket in Thread



  • Moi Moi,

    ich habe ein Problem mit CAsyncSocket, was mich noch in den Wahnsinn treibt.

    Ich habe ein Klasse CServer in der möchte ich über die Funktion OnBroadcast() Broadcastanfragen von Clients beantworten.

    Weiterhin gibt es ein StartListening() funktion in der die Socket für den Broadcast und für den Normalen Datenverkehr definiert werden.

    Die Funktion OnBroadcast starten ein Workerthread der als Globale Funktion geschrieben ist. Das starten den Workerthread's geschieht nach der Konfiguration des Sockets mit SetSockOpt und Bind.
    Wenn ich das abhören den Netzwerkes in dem Workerthread abarbeiten lasse komme ich beim Debugen immer einen ASSERT-fehler in der socketcore.cpp(Zeile 924) mit der Aussage das es sich um einen nicht zulässigen Sockettypen handelt. Diese tritt bei der Socktefunktion receivefrom(…) auf.

    Führe ich den Code vom Thread hingegen direkt in der Funktion OnBroadcast aus werden alle Anfragen korrekt beantworte.

    Hat der Socket Probleme im Thread zuarbeiten oder was ist hierfür der Grund.

    Weiterhin habe ich noch ein komisches Symthom was ich mir nicht erklären kann, Beim Binden des m_pBroadcastSockets kommt immer die Fehlermelung WSAEINVAL (10022)-> The socket is already bound to an address.
    Wenn ich den Aufruf von Bind weglasse wird die beantwortung von Broadcastanfragen ebenfalls kerrekt abgearbeitet.

    Kann mir hierfür bitte jemanden hilfe geben wie ich dieses Problem löse 🙄

    Mutche

    //Anlegen der Socket Instanzen
    BOOL CServer::StartListening(long lPort)
    {
    
    if ((m_pListeningSocket == NULL) && AfxSocketInit())
    {
     m_pListeningSocket = new CServerSocket(this);
     m_pBroadcastSocket = new CAsyncSocket();
    
     bResult = m_pListeningSocket->Create(m_lPort);
     bResultBroadcast = m_pBroadcastSocket->Create(SERVER_BRAODCAST_PORT, SOCK_DGRAM);	
    
     // Start listening
     if (bResult && bResultBroadcast)
     {
      bResult = m_pListeningSocket->Listen();
     }
    .....
    }//end if
    
    }
    
    //OnBroadcast konfiguiert BroadcastSocket für Broadcastanfragen und starte //Worker Thread
    bool CServer::OnBroadcast(CString& ServerIP)
    {
    .....
    if (m_pBroadcastSocket != NULL)
    {
     bResult = true;
    
     nRet = m_pBroadcastSocket->SetSockOpt(SO_BROADCAST, (char*) &broadcast,  sizeof(broadcast));
    
     if ( nRet == FALSE )
     { 
      CString strErr; strErr.Format("setsockopt() error %i",GetLastError() );
      AfxMessageBox( strErr ); 
      bResult = false;
     }
    
     nRet = m_pBroadcastSocket->Bind( SERVER_BRAODCAST_PORT, "255.255.255.255"  );
     if ( nRet == FALSE )
     { 
      CString strErr;
      switch( GetLastError() )
      {
    	case ....
    	case WSAEINVAL:
    	{
    	//WSAEINVAL   The socket is already bound to an address.
            AfxMessageBox("bind(): WSAEINVAL   The socket is already bound to an address.");
    	break;
    	}
    	case ....
    	default:.....
      }//end switch
    
      bResult = false;
     }// end if 
     //Starten den Worker Thread der die Broadcastanfragen beantwortet			
     AfxBeginThread(&MyThread, m_pBroadcastSocket, THREAD_PRIORITY_NORMAL);
    }//end if
    
    return bResult;
    }
    
    //Worker Thread um Broadcast anfragen zu beantworten
    UINT MyThread(LPVOID pParam)
    {	
    
    CAsyncSocket* m_pBroadcastSocket = reinterpret_cast<CAsyncSocket*>(pParam);
    
    .....
    //do while mit der Abarbeitung der Broadcastanfragen
    do{
     do{
      nRet = m_pBroadcastSocket->ReceiveFrom(cDataBuffer, 512, erg, (UINT&)lPort);
    
      ServerIP = cDataBuffer;
    
      if ( nRet == 0 )
      { 
       CString strErr; 
       strErr.Format("recvfrom() error %i",GetLastError() );
       AfxMessageBox( strErr );
       bResult = false;
      }
    
      if( ServerIP != "where are you")
      {
       bResult = false;
      }
      else
      {
       ServerIP = erg;
       lPort-=1;
       bResult = true;
      }
      Sleep(1000);
     }while(bResult==false);
    
     AfxMessageBox( "Empfang von: " + erg );
    
     if ( nRet == SOCKET_ERROR )
     { 
     .....
     }
    
     nRet = m_pBroadcastSocket->SendTo("Over Here!",10, lPort, ServerIP );
    
     if ( nRet == FALSE )
     { 
     ......
     } 
    }while(1);
    m_pBroadcastSocket->Close();
    return bResult;
    }
    


  • Hat den keiner einen Tip für mich 😞

    Muche


Anmelden zum Antworten