C# socket receive方法
发布时间:2025-05-19 17:21:04 发布人:远客网络
一、C# socket receive方法
1、结论:C#的Receive方法是用于从面向连接和无连接套接字中读取数据的关键工具,它将数据读入传入的缓冲区并返回读取的字节数。方法行为取决于所使用的套接字类型和连接状态。
2、在面向连接的套接字中,Receive在调用Connect或Accept建立连接后读取远程主机发送的数据。如果没有数据,Receive会阻塞直到数据可用,或者在超时后抛出SocketException。如果接收的数据达到缓冲区大小,Receive会读取所有数据,直到连接关闭并接收完毕。
3、对于无连接套接字,Receive从目标地址读取第一个排队的数据报,但数据报过大可能导致部分数据丢失。ReceiveFrom方法则允许接收来自任何主机的数据。
4、无论哪种情况,Receive都依赖于Available属性来检查是否有数据可读,如果没有,它会立即完成并可能抛出异常。发送与接收测试中,Send后通过Receive获取服务器的回复,任何SocketException会被捕获并记录错误信息。
5、因此,Receive方法是C#编程中实现数据通信时必不可少的一部分,理解其行为和适用场景对正确使用至关重要。
二、C# socket 如何获取收到数据的事件
1、Socket有个BeginReceive方法,用这个方法来接收数据,
2、这个函数有个参数是个委托AsyncCallBack,是个回调函数..
3、(我是一楼)补充:Socket还有个方法是BeginReveiceFrom是用于UDP协议的.用法与BeginReceive相同,而且UDP不监听的理解是错误的.UDP同样也监听.并不是说只有在TCP中调用了Socket的Listen函数才是监听.BeginReveiceFrom其实已经完成了监听过程
三、C#中Socket类ReceiveFrom函数读数据时卡死
1、receiveFrom方法读取数据的时候如果缓冲区不够大则会分好几次读取。
2、通过判断socket.Available来判断上次读取的数据还有多少未读取。如果Available==0则本次读取完毕
3、可以将接收方法封装在一个类中(SocketClient),实例化类后在单个线程中运行。
4、//如果发送的字节已经完毕。则重置接收字符串,休眠线程重新等待数据
5、//重置前首先尝试写个事件或委托将这次接收的receiveStr传递出去
6、OnDataReceived(receiveStr);//这个事件可以自己去补充
7、System.Threading.Thread.Sleep(1);
8、intrecv=mySocket.ReceiveFrom((data,refRemote));//Remote为EndPoint对象
9、将该批次数据保存在receiveStr中
10、receiveStr+=Encoding.ASCII.GetString(data,0,recv);
11、//接收的类中实例化上面的类并订阅
12、SocketClientxxx=newSocketClient();
13、xxx.OnDataReceived+=newHander(this.DataReceived);
14、voidDataReceived(stringreceive)
15、Console.WriteLine("接收到了收据:"+receive)