2013-08-30 121 views
0

我对UDP套接字相当新,大部分我的套接字体验都与TCP有关。UDP套接字:一个现有的连接被远程主机强制关闭

我使用C#创建一个UDP套接字,绑定它,然后不断侦听来自IP的数据包。但是,当客户端发送数据包时,套接字会引发异常:“现有连接被远程主机强行关闭”。

这是我如何创建UDP套接字:

Socket UDPSocket = new Socket(SocketType.Dgram, ProtocolType.Udp); //Create UDP socket 
UDPSocket.Bind(new IPEndPoint(IPAddress.Any, 1338)); //Bind port 1338 from any IP 

创建套接字后,我异步接收数据:

UDPSocket.BeginReceiveFrom(newClient.bufferu, 0, AbstractServerClient.BUFFER_SIZE, 0, ref newClient.remoteEndpoint,new AsyncCallback(ReceiveCallbackUDP), newClient); 

newClient.remoteEndpoint从TCP套接字的端点,所以UDP是有效的接收来自TCP连接到的相同IP的数据包。假设其余的参数是有效的(它们在TCP上工作正常)。

ReceiveCallbackUDP方法是这样的:

public void ReceiveCallbackUDP(IAsyncResult ar) 
{ 
    AbstractServerClient client = (AbstractServerClient)ar.AsyncState; 
    int bytesRead = UDPSocket.EndReceive(ar); 

    if (bytesRead > 0) 
    { 
     Bitstream data = new Bitstream(client.bufferu, 12); 
     int bytesProcessed = 12; 
     while (bytesProcessed < bytesRead) 
     { 
      ushort messageLength = data.ReadUInt16(); //Read the message length 
      byte messageID = data.ReadByte(); //Read the message ID 
      // Logger.Log("Received message ID: " + messageID.ToString() + " (Size: " + messageLength + " bytes)"); 
      bytesProcessed += messageLength + sizeof(UInt16); 
      client.GetPacketHandler(messageID).HandlePacket(data); //Process the message 
      bytesProcessed += 12; 
      data.Seek(bytesProcessed); //Seek to the next message 
     } 
    } 
    UDPSocket.BeginReceiveFrom(client.bufferu, 0, AbstractServerClient.BUFFER_SIZE, 0, ref client.remoteEndpoint, new AsyncCallback(ReceiveCallbackUDP), client); 
} 

此功能的插座上呼吁EndReceive()读取数据,并对其进行处理,并呼吁BeginReceiveFrom等待更多的数据(异步)。线上抛出异常int bytesRead = UDPSocket.EndReceive(ar);

为什么会发生这种情况?据我了解,UDP是一个无连接套接字,因此异常“现有的连接已关闭”没有任何意义。我在这里做错了什么?

+0

您可能会遇到与此处提到的问题相同的问题:http://stackoverflow.com/questions/7201862/an-existing-connection-was-forcibly-closed-by-the-remote-host –

回答

0

BeginReceiveFrom您的remoteEP应该标识正在监听的套接字,大部分是您用于Bind的端点。

而在你的回调方法ReceiveCallbackUDP你应该叫EndReceiveFrom,因为这是对应的方法BeginReceiveFrom

EndPoint tempRemoteEP = (EndPoint)client.remoteEndpoint; 
int bytesRead = UDPSocket.EndReceiveFrom(ar, ref tempRemoteEP); 

参见示例中http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.beginreceivefrom.aspx,其中tempRemoteEP传递给BeginReceiveFrom相同端点sender传递给Bind

相关问题