示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        // 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);
        }