CAsyncSocket::ReceiveFrom()



  • Hallo!

    Ich habe ein kleines Problem mit der Funktion ReceiveFrom() bzw. ReceiveFromEx() in der Klasse CAsyncSocket: Sobald ich einen Datensatz erhalte, versucht die Funktion den NetBIOS-Namen des Absenders herauszubekommen. Dieser antwortet jedoch nicht darauf (warum das so ist, weiß ich selber nicht so genau, es ist ein Android-Tablet). Das Problem daran ist, dass der Spaß 3 Mal wiederholt wird, bis ReceiveFrom() endlich returned. Ich benötige allerdings auch die Funktion, um Absender-IP und -Port abzufragen. Das Problem tritt nicht mit Receive() auf!

    Meine Frage ist jetzt, ob ich der Klasse CAsyncSocket oder der Funktion ReceiveFrom() irgendwie sagen kann, dass nicht nach dem NetBIOS-Namen gefragt werden soll, den brauche ich nämlich gar nicht?

    Angehängt habe ich ein Wireshark-Screenshot des beschriebenen Problems. Es vergehen immerhin fast 5 Sekunden, bis der PC (192.168.1.50) auf die Anfrage des Tablets (192.168.1.57) antwortet. Das ist mir zu lang!

    Hier der Code:

    // CUdpSocket ist von CAsyncSocket abgeleitet
    CUdpSocket::CUdpSocket(CNetCtrl *pcNetCtrl)
    	: CAsyncSocket(),
    	m_pcNetCtrl(pcNetCtrl),
    	m_u4BytesToSend(0),
    	m_u4BytesSent(0),
    	m_u4RemotePort(0),
    	m_pchSendBuffer(NULL)
    {
    	if(!Create(pcNetCtrl->GetLocalPortNo(), SOCK_DGRAM))
    	{
    		CString sError;
    		sError.Format(pNetCtrl->LoadString(IDS_ERR_UDP_CREATE_CONN) + _T(" : %d"), GetLastError());
    		AfxMessageBox(sError);
    	}
    }
    
    // [...]
    
    void CUdpSocket::OnReceive(int s4ErrorCode)
    {
    	const unsigned int cu4BufLen = 4096;
    	char chBuffer[cu4BufLen];
    
    	CString sRemoteHostAddress;
    	UINT u4RemoteSocketPort = 0;
    
    	int s4Read = ReceiveFromEx(chBuffer, cu4BufLen, sRemoteHostAddress, u4RemoteSocketPort);
    
    	if(s4Read == 0)
    		Close();
    	else if(s4Read == SOCKET_ERROR)
    	{
    		CString sError;
    		sError.Format(pNetCtrl->LoadString(IDS_ERR_UDP_RECEIVE) + _T(" : %d"), GetLastError());
    		AfxMessageBox(sError);
    	}
    	else
    		pNetCtrl->ProcessUdpMessage(chBuffer, s4Read, sRemoteHostAddress, u4RemoteSocketPort);
    
    	CAsyncSocket::OnReceive(s4ErrorCode);
    }
    

    Es wäre super, wenn mir jemand einen Tip geben könnte, wie ich das Probem beheben könnte!




Anmelden zum Antworten