一:用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