- Connection reset on receiving packet in UDP server
- using System;
- using System.Net;
- using System.Net.Sockets;
- static class Program
- {
- static void Main(string[] args)
- {
- UdpEchoServer.Start();
- while (true)
- {
- Console.ReadLine();
- SendPacket();
- }
- }
- static void SendPacket()
- {
- Console.WriteLine("SendPacket");
- var c = new UdpClient();
- c.Send(new byte[5], 5, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 445));
- c.Close();
- }
- }
- static class UdpEchoServer
- {
- static Socket mSocket;
- static byte[] mBuffer;
- static SocketAsyncEventArgs mRxArgs, mTxArgs;
- static IPEndPoint mAnyEndPoint, mLocalEndPoint;
- public static void Start()
- {
- mAnyEndPoint = new IPEndPoint(IPAddress.Any, 0);
- mLocalEndPoint = new IPEndPoint(IPAddress.Any, 445);
- mBuffer = new byte[1024];
- mRxArgs = new SocketAsyncEventArgs();
- mTxArgs = new SocketAsyncEventArgs();
- mRxArgs.Completed += ReceiveComplete;
- mTxArgs.Completed += SendComplete;
- mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- mSocket.Bind(mLocalEndPoint);
- ReceiveNext();
- }
- static void ReceiveNext()
- {
- Console.WriteLine("ReceiveNext");
- mRxArgs.RemoteEndPoint = mAnyEndPoint;
- mRxArgs.SetBuffer(mBuffer, 0, mBuffer.Length);
- if (!mSocket.ReceiveFromAsync(mRxArgs))
- Console.WriteLine("Error in ReceiveNext: " + mRxArgs.SocketError);
- }
- static void ReceiveComplete(object sender, SocketAsyncEventArgs e)
- {
- Console.WriteLine("Receive Complete: " + mRxArgs.SocketError);
- if (mRxArgs.SocketError != SocketError.Success)
- return;
- mTxArgs.SetBuffer(mBuffer, 0, mRxArgs.BytesTransferred);
- mTxArgs.RemoteEndPoint = mRxArgs.RemoteEndPoint;
- Console.WriteLine("Sending reply packet");
- if (!mSocket.SendToAsync(mTxArgs))
- Console.WriteLine("Error in ReceiveComplete: " + mRxArgs.SocketError);
- }
- static void SendComplete(object sender, SocketAsyncEventArgs e)
- {
- Console.WriteLine("Send Complete: " + mTxArgs.SocketError);
- if (mTxArgs.SocketError != SocketError.Success)
- return;
- ReceiveNext();
- }
- }
- ReceiveNext
- SendPacket
- Receive Complete: Success
- Sending reply packet
- Send Complete: Success
- ReceiveNext
- Error in ReceiveNext: ConnectionReset
- mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- const int SIO_UDP_CONNRESET = -1744830452;
- byte[] inValue = new byte[] {0};
- byte[] outValue = new byte[] {0};
- mSocket.IOControl(SIO_UDP_CONNRESET, inValue, outValue);
- mSocket.Bind(mLocalEndPoint);