socket 缓冲区接收一定量数据以后 如何复位
使C#做个小聊天工具
使用 socket 套接字实现异步接收,在进行接收图片时,因为图片没有压缩,直接已byte[]数组传送过来接收的
部分代码如下:
出现"未处理的SocketException"异常"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作"。
这个异常怎么处理啊? 由于socket 的在接收数据时,需要给其分配个缓冲区,这里的缓冲区是 1024*64 就是64K大小(就算改大点,我改到1000000以后同样会报出这个异常,执行receive以后byte[]数组再清空已经和socket的缓冲区无关了),由于socket是在死循环中,所以socket的缓冲区没有被复位,所以再接收信息的时候,就是在刚才接受到得数据的缓冲区后再接收数据。
何如能吧receive的缓冲区给手动复位呢?
使用 socket 套接字实现异步接收,在进行接收图片时,因为图片没有压缩,直接已byte[]数组传送过来接收的
部分代码如下:
private Socket LocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private int size = 1024*64;
private Thread ListenThread;
private byte[] bytData;
/// <summary>
/// 监听方法,用于监听远程发送到本机的信息
/// </summary>
public void Listen()
{
ListenThread = new Thread(new ThreadStart(VideoListen));
ListenThread.Start();
}
/// <summary>
/// 监听线程
/// </summary>
private void VideoListen()
{
bytData = new byte[size]
while (true)
{
LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="iar"></param>
private void ReceiveVideo(IAsyncResult iar)
{
int intRecv = 0;
try
{
intRecv = LocalSocket.EndReceiveFrom(iar, ref ipeRemote);
}
catch
{
//throw new Exception();
}
第二次执行到LocalSocket.BeginReceiveFrom(bytData, 0, bytData.Length, SocketFlags.None, ref ipeRemote, new AsyncCallback(ReceiveVideo), LocalSocket);
出现"未处理的SocketException"异常"由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作"。
这个异常怎么处理啊? 由于socket 的在接收数据时,需要给其分配个缓冲区,这里的缓冲区是 1024*64 就是64K大小(就算改大点,我改到1000000以后同样会报出这个异常,执行receive以后byte[]数组再清空已经和socket的缓冲区无关了),由于socket是在死循环中,所以socket的缓冲区没有被复位,所以再接收信息的时候,就是在刚才接受到得数据的缓冲区后再接收数据。
何如能吧receive的缓冲区给手动复位呢?
...全文
相关推荐
Linux socket错误分析
类似的,非阻塞接收操作如果返回值小于请求的长度,表示缓冲区没有可读数据,这时应检查errno值,看是否返回了EAGAIN。在某些情况下,非阻塞操作未完成时也可能返回“资源暂时不可用”的错误。
W5500初始化过程
第一步硬件复位 1:拉低RST 2:拉高RST 3:读取通用寄存器0x002e地址以确以太网连接完成(如果读到1,为以太网连接完成) 第二步初始化W5500 1:初始化W5500寄存器函数 软复位 向通用寄存器(5'b00000)中的MR模式寄存器(地址是0x0000)写入0x80 写入网关地址 向通用寄存器(5'b00000)中的GAR寄存器(地址是0x0001)写入网关地址 ...
基于W5100的DSP快速网络接入解决方案
W5100提供了4个独立的Socket通信,16KB的发送/接收缓冲区能快速处理数据,最大通信速率可达25Mbps。
W5100模块技术规范
**大容量缓存**:内置16KB存储器作为发送/接收缓冲区,提高了数据处理速度。5.
Linux上TCP的Shutdown和Close
它允许你选择性地关闭socket的读、写或两者。例如,`shutdown(fd, SHUT_RD)`意味着不再接收来自对端的数据,但仍然允许你读取已存在于缓冲区的数据。


