C#中Socket类ReceiveFrom函数读数据时卡死?
具体情况是我用C#中Socket类ReceiveFrom函数读外界发过来的数据时,读到最后一行数据后,缓冲区已经没有数据了,再用这个函数去读时程序就会卡死(没办法提前判断...
具体情况是我用C#中Socket类ReceiveFrom函数读外界发过来的数据时,读到最后一行数据后,缓冲区已经没有数据了,再用这个函数去读时程序就会卡死(没办法提前判断缓冲区为空)?
比如我的电脑与下位机UDP通信,电脑上发送一条指令到下位机,下位机接收后会返回5条信息过来(每条信息都是以\r\n结尾),电脑上用ReceiveFrom函数可以正确读出这5条信息,但如果读完5条再用这个函数去读的话,程序就卡死,请问有什么办法可以解决这个问题,因为下位机每次发送的数据都可能不固定(有时候5条有时候很多条),所以不可能直接设定ReceiveFrom函数读的次数,怎么样能够判断缓冲区中的数据已经读完了呢?如何能够知道缓冲区中已经读完了,那我就不会再去执行那个函数了,这样是不是就可以解决问题了呢? 展开
比如我的电脑与下位机UDP通信,电脑上发送一条指令到下位机,下位机接收后会返回5条信息过来(每条信息都是以\r\n结尾),电脑上用ReceiveFrom函数可以正确读出这5条信息,但如果读完5条再用这个函数去读的话,程序就卡死,请问有什么办法可以解决这个问题,因为下位机每次发送的数据都可能不固定(有时候5条有时候很多条),所以不可能直接设定ReceiveFrom函数读的次数,怎么样能够判断缓冲区中的数据已经读完了呢?如何能够知道缓冲区中已经读完了,那我就不会再去执行那个函数了,这样是不是就可以解决问题了呢? 展开
1个回答
展开全部
receiveFrom 方法 读取数据的时候 如果缓冲区不够大 则会分好几次读取。
通过判断socket.Available 来判断上次读取的数据还有多少未读取。如果Available ==0则本次读取完毕
可以将接收方法封装在一个类中(SocketClient),实例化类后在单个线程中运行。
int recv;
byte[] data;
string receiveStr="";
while (true)
{
//如果发送的字节已经完毕。则重置接收字符串,休眠线程重新等待数据
if (mySocket.Available == 0)
{
//重置前首先尝试写个事件或委托将这次接收的receiveStr传递出去
OnDataReceived(receiveStr);//这个事件可以自己去补充
receiveStr="";
System.Threading.Thread.Sleep(1);
continue;
}
int bufferSize =1024;
data = new byte[1024];
//接收数据到
int recv = mySocket.ReceiveFrom((data,ref Remote));//Remote 为EndPoint对象
将该批次数据保存在receiveStr中
receiveStr+=Encoding.ASCII.GetString(data,0,recv);
}
}
//接收的类中 实例化上面的类并订阅
SocketClient xxx=new SocketClient();
//订阅接收事件
xxx.OnDataReceived+=new Hander(this.DataReceived);
void DataReceived(string receive)
{
Console.WriteLine("接收到了收据:"+receive)
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询