CAsyncSocket in Thread ->falscher Sockettype

mutche

Grünschnabel
Moi Moi,

ich habe folgendes Problem, welches mich nun schon die halbe woche beschäftigt.. :confused:

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 und kreiert werden.

Die Funktion OnBroadcast starten ein Workerthread der als Globale Funktion geschreiben ist. Wenn ich das abhören den Netzwerkes in dem Workerthread abarbeiten lasse komme ich beim Debugen immer einen ASSERT fehler in der socketcore.cpp 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 in der Funktion OnBroadcast aus werden alle anfragen korrekt beantworte.

Hat der Socket problem im Thread zu

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

Danke im Voraus :p

Mutche

Code:
//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;
}
 
Zurück