C#里用socket收发udp数据的问题

一:用udp收发数据,为什么接收方要发一帧数之后才能接收到数据?

    private Socket SetupUdpSocketObject(string localIp, string localPort, string remoteIp, string remotePort)
    {
        //得到本机IP,设置TCP端口号         
        var ip = new IPEndPoint(IPAddress.Parse(localIp), int.Parse(localPort));
        var ret = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        //绑定网络地址
        ret.Bind(ip);

        var sender = new IPEndPoint(IPAddress.Any, 0);
        _remote = sender;

        EndPoint point = new IPEndPoint(IPAddress.Parse(remoteIp), int.Parse(remotePort));
        ret.SendTo(new byte[] { 1, 2, 3 }, point);      //发送一帧数据才能收到数据

        return ret;
    }

    private void ProcessUdpData()
    {
        while (true)
        {
            var data = new byte[DataMaximumLength];
            //发送接受信息
            var recv = _udpSocket.ReceiveFrom(data, ref _remote);
            _recorder.RecordBytes(data, 0, recv);        //记录数据
            var cell = new AzimuthCell(data);
            NotifyAllObservers(cell);   //发送通知
        }
    }
            如果不写ret.SendTo(new byte[] { 1, 2, 3 }, point); 就收不到数据。


            二:socket接收和发送数据我都是用线程发送,一个while(true)循环,反复sendto发缓存区,反复recvfrom,但是这样两个线程的占用率很高,有没有其他办法收发数据,除了beginsendto和beginrecvfrom

:用udp收发数据,为什么接收方要发一帧数之后才能接收到数据?
private Socket SetupUdpSocketObject(string localIp, string localPort, string remoteIp, string remotePort)
{
//得到本机IP,设置TCP端口号

var ip = new IPEndPoint(IPAddress.Parse(localIp), int.Parse(localPort));
var ret = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
ret.Bind(ip);

    var sender = new IPEndPoint(IPAddress.Any, 0);
    _remote = sender;

    EndPoint point = new IPEndPoint(IPAddress.Parse(remoteIp), int.Parse(remotePort));
    ret.SendTo(new byte[] { 1, 2, 3 }, point);      //发送一帧数据才能收到数据

    return ret;
}

private void ProcessUdpData()
{
    while (true)
    {
        var data = new byte[DataMaximumLength];
        //发送接受信息
        var recv = _udpSocket.ReceiveFrom(data, ref _remote);
        _recorder.RecordBytes(data, 0, recv);        //记录数据
        var cell = new AzimuthCell(data);
        NotifyAllObservers(cell);   //发送通知
    }
}

    二:socket接收和发送数据我都是用线程发送,一个while(true)循环,反复sendto发缓存区,反复recvfrom,但是这样两个线程的占用率很高,有没有其他办法收发数据,除了beginsendto和beginrecvfrom

抛开网络编程不管,在线程中进行死循环容易造成线程间的竞争而导致CPU居高不下,适当sleep一点点时间是有些必要的。

_remote = sender??, 需要线程休眠来便面cpu 占用过高