void DoClient() { // listen on a socket for N seconds; write received message (int) InitBuffers(); Socket socketA1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPAddress sendTo = IPAddress.Parse(sendToAddr); EndPoint sendEndPointA1 = new IPEndPoint(sendTo, sendToPort); { AsyncCallback onReceiveFrom1 = new AsyncCallback(OnReceiveFrom); listenOnPort = 0;// sendToPort + 1; EndPoint bindEndPointA1 = new IPEndPoint(IPAddress.Any, listenOnPort); socketA1.Bind(bindEndPointA1); ReceiveFromData rfd = new ReceiveFromData(ref receiveBuffer2, receiveBuffer2.Length, ref bindEndPointA1, ref onReceiveFrom1, ref socketA1, null, this); rfd.BeginReceiveFrom(); } for (byte i = 0; i < messageCount; i++) { sendBuffer1[0] = i; socketA1.SendTo(sendBuffer1, Math.Min(sendBufferSize, 1024), SocketFlags.None, sendEndPointA1); MyWriteLine("buffer " + i + " sent"); Thread.Sleep(100); } }
void DoForward() { // listen on a socket for N seconds; write received message (int) InitBuffers(); AsyncCallback onReceiveFrom1 = new AsyncCallback(OnReceiveFrom); AsyncCallback onReceiveFromForward1 = new AsyncCallback(OnReceiveFromforward); // prepare send thread if (!ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadSendProc), null)) { throw new Exception("cannot QueueUserWorkItem "); } Socket socketA1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); Socket socketB1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); EndPoint bindEndPointA1 = new IPEndPoint(IPAddress.Any, listenOnPort); // bind for listening to unicast. socketA1.Bind(bindEndPointA1); // prepare send socket { EndPoint bindEndPointB1 = new IPEndPoint(IPAddress.Any, 0); socketB1.Bind(bindEndPointB1); ReceiveFromData rfd2 = new ReceiveFromData( ref receiveBuffer2, receiveBuffer2.Length, ref bindEndPointB1, ref onReceiveFrom1, ref socketB1, null, this); rfd2.BeginReceiveFrom(); } // start listening ReceiveFromData rfd = new ReceiveFromData( ref receiveBuffer1, receiveBuffer1.Length, ref bindEndPointA1, ref onReceiveFromForward1, ref socketA1, socketB1, this); rfd.BeginReceiveFrom(); ReceiveFromData rfd3 = new ReceiveFromData( ref receiveBuffer3, receiveBuffer3.Length, ref bindEndPointA1, ref onReceiveFromForward1, ref socketA1, socketB1, this); rfd3.BeginReceiveFrom(); WaitReceivedMessages(messageCount + 1); }
void DoServer() { // listen on a socket for N seconds; write received message (int) InitBuffers(); AsyncCallback onReceiveFrom1 = new AsyncCallback(OnReceiveFrom); Socket socketA1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); EndPoint bindEndPointA1 = new IPEndPoint(IPAddress.Any, listenOnPort); // bind for listening to unicast. socketA1.Bind(bindEndPointA1); // start listening ReceiveFromData rfd = new ReceiveFromData(ref receiveBuffer1, receiveBuffer1.Length, ref bindEndPointA1, ref onReceiveFrom1, ref socketA1, null, this); rfd.BeginReceiveFrom(); WaitReceivedMessages(messageCount + 1); }
// must differentiate v4 and v6 to get the return addr void OnReceiveFromHelper(IAsyncResult result, bool IPv6) { //Console.Write(">"); ReceiveFromData rfd = (ReceiveFromData)result.AsyncState; Socket receiveSocket = rfd.socket; EndPoint remoteEndPoint; if (IPv6) { remoteEndPoint = new IPEndPoint(IPAddress.IPv6Any, 0); } else { remoteEndPoint = new IPEndPoint(0, 0); // hack to create it.. } int bytesRead = 0; try { bytesRead = receiveSocket.EndReceiveFrom(result, ref remoteEndPoint); } catch (SocketException e) { MyWriteLine("SocketException " + e.ErrorCode); switch (e.ErrorCode) { case 995: break; // thread terminated, expected default: { MyWriteLine("socketexception: " + e.ToString()); break; } } } catch (Exception e) { MyWriteLine("exception: " + e.ToString()); } // extract the EndPoint and cast it to an IPEndPoint. Use the IPEndPoint.Address method to obtain the IP address and the IPEndPoint.Port method to obtain the port number. MyWriteLine("[" + receivedBuffers.ToString() + "]" + "OnReceiveFrom called data= " + rfd.buffer[0].ToString() + " size=" + bytesRead + "/" + rfd.length + " host=" + ((IPEndPoint)remoteEndPoint).Address.ToString() + ":" + ((IPEndPoint)remoteEndPoint).Port.ToString()); Dumpbuf(rfd.buffer, 0, bytesRead); byte[] b = null; int length = 0; // if fwd then dup buffer if (rfd.ForwardSocket != null) { // b= new byte[rfd.length]; b = (byte[])rfd.buffer.Clone(); // pyf get real packet size, use that, send with that size not buffersize length = bytesRead; EndPoint forwardEndPoint = new IPEndPoint( IPAddress.Parse(rfd.UDP_helper.forwardToAddr), rfd.UDP_helper.forwardToPort); if (!DropPacket()) { int fwdIn = GetForwardDelay(); Console.Write("sched fwd: {0}", fwdIn); ScheduleSend(b, length, forwardEndPoint, rfd.ForwardSocket, fwdIn); } else { Console.WriteLine("drop"); } } rfd.BeginReceiveFrom(); Interlocked.Increment(ref receivedBuffers); }