1
TNet 3 Support / Re: TNUdpProtocol OnReceive crashing when BeginReceiveFrom
« on: February 27, 2015, 10:55:41 PM »
Thanks for your response!
I've also written a test program to easily regenerate the crash.
You can use this code for test.
* Test locally:
* Just run it.
* It's very easy to re-generate the crash in this mode.
*
* Test across machines:
* server:
* Test.exe 9988
* client:
* Test.exe 9988 192.168.x.x
* It's NOT very easy to re-generate the crash in this mode.
Thanks again!
I've also written a test program to easily regenerate the crash.
You can use this code for test.
* Test locally:
* Just run it.
* It's very easy to re-generate the crash in this mode.
*
* Test across machines:
* server:
* Test.exe 9988
* client:
* Test.exe 9988 192.168.x.x
* It's NOT very easy to re-generate the crash in this mode.
- using System;
- using System.Net;
- using System.Net.Sockets;
- namespace Test
- {
- class Program
- {
- private class AsyncData
- {
- public int Port;
- public Socket Socket;
- public EndPoint EndPoint;
- }
- private static void StartUDPServer(int port)
- {
- socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endpoint, OnReceivedFrom, new AsyncData()
- {
- Port = port,
- Socket = socket,
- EndPoint = endpoint,
- });
- }
- private static void OnReceivedFrom(IAsyncResult result)
- {
- var data = (AsyncData)result.AsyncState;
- int bytes = data.Socket.EndReceiveFrom(result, ref data.EndPoint);
- data.Socket.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, data.EndPoint, OnServerSentTo, data); // KEY_POINT-I: send anything back
- data.Socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref data.EndPoint, OnReceivedFrom, data);
- }
- private static void OnServerSentTo(IAsyncResult result)
- {
- var data = (AsyncData)result.AsyncState;
- int bytes = data.Socket.EndSendTo(result);
- //Console.WriteLine("sent {0} back", bytes);
- }
- private static void StartUDPClient(EndPoint server)
- {
- socket.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, server, OnClientSentTo, new AsyncData()
- {
- Port = 0,
- Socket = socket,
- EndPoint = server,
- });
- }
- private static void OnClientSentTo(IAsyncResult result)
- {
- var data = (AsyncData)result.AsyncState;
- int bytes = data.Socket.EndSendTo(result);
- data.Socket.Close(); // KEY_POINT-II: close client it immediately
- StartUDPClient(data.EndPoint);
- }
- /**
- *
- * Test locally:
- * Just run it.
- * It's very easy to re-generate the crash in this mode.
- *
- * Test across machines:
- * server:
- * Test.exe 9988
- * client:
- * Test.exe 9988 192.168.x.x
- * It's NOT very easy to re-generate the crash in this mode.
- *
- */
- static void Main(string[] args)
- {
- bool localTest = true; // both server and client locally
- EndPoint server = null;
- int port = 9988;
- if (args.Length > 0) // first argument as port
- {
- localTest = false;
- port = int.Parse(args[0]);
- }
- if (args.Length > 1) // if client, second argument as server address
- {
- foreach (var address in Dns.GetHostAddresses(args[1]))
- {
- if (address.AddressFamily == AddressFamily.InterNetwork)
- {
- }
- }
- }
- if (localTest)
- {
- StartUDPServer(port);
- StartUDPClient(server);
- }
- else if (server == null)
- {
- StartUDPServer(port);
- }
- else
- {
- StartUDPClient(server);
- }
- System.Console.ReadLine();
- }
- }
- }
Thanks again!
