测试发送带有控制台的UDP数据包的问题

时间:2012-09-23 09:21:31

标签: c# .net networking udp

这是我的客户端代码

    class Program
{
    static void Main(string[] args)
    {
        string msg;
        Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 999);
        sck.Bind(ep);
        byte[] msgbytes;

        while (true)
        {
            msg = Console.ReadLine();
            msgbytes = ASCIIEncoding.ASCII.GetBytes(msg);
            sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);
            Console.WriteLine("sent");
        }
    }

    void callBack(IAsyncResult result)
    {
        ((Socket)result.AsyncState).EndSendTo(result);
    }
}

}

这是服务器代码

    class Program
{
    static void Main(string[] args)
    {
        string msg;
        Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        IPEndPoint ep = new IPEndPoint(IPAddress.Any, 999);
        sck.Bind(ep);
        byte[] msgbytes = new byte[100];

        EndPoint client = (EndPoint)ep;

        int bytesrec;
        while (true)
        {
            bytesrec = sck.ReceiveFrom(msgbytes, 0, msgbytes.Length, SocketFlags.None, ref client);
            msg = ASCIIEncoding.ASCII.GetString(msgbytes);
            Console.WriteLine("4");
        }
    }
}

}

问题是当我尝试使用客户端发送时,服务器没有收到任何数据包。永远不会写入“4”,这确认了执行sck.receive。

2 个答案:

答案 0 :(得分:1)

在您的客户端代码中更改以下内容: 而不是sck.Bind(ep);使用sck.Connect(ep); 而不是

sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);

使用

sck.Send(msgbytes, msgbytes.Length, SocketFlags.None);

它应该有用......

编辑: 如果你真的需要使用异步发送...你可以做类似的事情:

IAsyncResult asyncres = sck.BeginSendTo(msgbytes, 0, msgbytes.Length, SocketFlags.None, ep, null, sck);
sck.EndSendTo(asyncres);

答案 1 :(得分:-2)

您的服务器需要以0.0.0.0的速度收听,否则您将进入平台依赖领域; 您的客户端需要绑定到外部IP地址,而不仅仅是127.0.0.1,否则它无法从本地主机发送任何数据包。