Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 31st, 2012  |  syntax: None  |  size: 2.73 KB  |  hits: 9  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Connection reset on receiving packet in UDP server
  2. using System;
  3. using System.Net;
  4. using System.Net.Sockets;
  5.  
  6. static class Program
  7. {
  8.     static void Main(string[] args)
  9.     {
  10.         UdpEchoServer.Start();
  11.  
  12.         while (true)
  13.         {
  14.             Console.ReadLine();
  15.             SendPacket();
  16.         }
  17.     }
  18.  
  19.     static void SendPacket()
  20.     {
  21.         Console.WriteLine("SendPacket");
  22.         var c = new UdpClient();
  23.         c.Send(new byte[5], 5, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 445));
  24.         c.Close();
  25.     }
  26. }
  27.  
  28. static class UdpEchoServer
  29. {
  30.     static Socket mSocket;
  31.     static byte[] mBuffer;
  32.     static SocketAsyncEventArgs mRxArgs, mTxArgs;
  33.     static IPEndPoint mAnyEndPoint, mLocalEndPoint;
  34.  
  35.     public static void Start()
  36.     {
  37.         mAnyEndPoint = new IPEndPoint(IPAddress.Any, 0);
  38.         mLocalEndPoint = new IPEndPoint(IPAddress.Any, 445);
  39.  
  40.         mBuffer = new byte[1024];
  41.  
  42.         mRxArgs = new SocketAsyncEventArgs();
  43.         mTxArgs = new SocketAsyncEventArgs();
  44.  
  45.         mRxArgs.Completed += ReceiveComplete;
  46.         mTxArgs.Completed += SendComplete;
  47.  
  48.         mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  49.         mSocket.Bind(mLocalEndPoint);
  50.         ReceiveNext();
  51.     }
  52.  
  53.     static void ReceiveNext()
  54.     {
  55.         Console.WriteLine("ReceiveNext");
  56.  
  57.         mRxArgs.RemoteEndPoint = mAnyEndPoint;
  58.         mRxArgs.SetBuffer(mBuffer, 0, mBuffer.Length);
  59.  
  60.         if (!mSocket.ReceiveFromAsync(mRxArgs))
  61.             Console.WriteLine("Error in ReceiveNext: " + mRxArgs.SocketError);
  62.     }
  63.  
  64.     static void ReceiveComplete(object sender, SocketAsyncEventArgs e)
  65.     {
  66.         Console.WriteLine("Receive Complete: " + mRxArgs.SocketError);
  67.  
  68.         if (mRxArgs.SocketError != SocketError.Success)
  69.             return;
  70.  
  71.         mTxArgs.SetBuffer(mBuffer, 0, mRxArgs.BytesTransferred);
  72.         mTxArgs.RemoteEndPoint = mRxArgs.RemoteEndPoint;
  73.  
  74.         Console.WriteLine("Sending reply packet");
  75.  
  76.         if (!mSocket.SendToAsync(mTxArgs))
  77.             Console.WriteLine("Error in ReceiveComplete: " + mRxArgs.SocketError);
  78.     }
  79.  
  80.     static void SendComplete(object sender, SocketAsyncEventArgs e)
  81.     {
  82.         Console.WriteLine("Send Complete: " + mTxArgs.SocketError);
  83.  
  84.         if (mTxArgs.SocketError != SocketError.Success)
  85.             return;
  86.  
  87.         ReceiveNext();
  88.     }
  89. }
  90.        
  91. ReceiveNext
  92.  
  93. SendPacket
  94. Receive Complete: Success
  95. Sending reply packet
  96. Send Complete: Success
  97. ReceiveNext
  98. Error in ReceiveNext: ConnectionReset
  99.        
  100. mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  101.  
  102. const int SIO_UDP_CONNRESET = -1744830452;
  103. byte[] inValue = new byte[] {0};
  104. byte[] outValue = new byte[] {0};
  105. mSocket.IOControl(SIO_UDP_CONNRESET, inValue, outValue);
  106.  
  107. mSocket.Bind(mLocalEndPoint);