C# C/S网络编程 由于系统缓存空间不足或列队已满,不能执行套接字上的操作
服务器那边开了一个线程,用于循环接受客户端的链接请求。但现在客户端退出后登上一段时间,服务器端就好出现“由于系统缓存空间不足或列队已满,不能执行套接字上的操作”的错误。下...
服务器那边开了一个线程,用于循环接受客户端的链接请求。但现在客户端退出后登上一段时间,服务器端就好出现“由于系统缓存空间不足或列队已满,不能执行套接字上的操作”的错误。
下边的截图就是服务器循环接受客户端的代码: 展开
下边的截图就是服务器循环接受客户端的代码: 展开
1个回答
展开全部
改成以下代码试试
public void ReceiveMsg()
{
// 启动异步接收
IAsyncResult iar = udpReceiveClient.BeginRecevice(
new AsyncCallback(ReceiveCallback),
udpReceiveState);
}
private void ReceiveCallback(IAsyncResult iar)
{
// 继续异步接收
ReceiveMsg();
// 完成前一次异步接收EndReceive处理
UdpState udpReceiveState = iar.AsyncState as UdpState;
//……
}
要注意的是:
1)Socket异步接收处理过程中用到了.net framework内部线程池,而线程池中线程的数量是有限制的。
2)ReceiveMsg中的 while(true)循环是多余的
3)ReceiveMsg中的 lock(this) 没有意义
4)WaitOne, Sleep() 都是多余的
public void ReceiveMsg()
{
// 启动异步接收
IAsyncResult iar = udpReceiveClient.BeginRecevice(
new AsyncCallback(ReceiveCallback),
udpReceiveState);
}
private void ReceiveCallback(IAsyncResult iar)
{
// 继续异步接收
ReceiveMsg();
// 完成前一次异步接收EndReceive处理
UdpState udpReceiveState = iar.AsyncState as UdpState;
//……
}
要注意的是:
1)Socket异步接收处理过程中用到了.net framework内部线程池,而线程池中线程的数量是有限制的。
2)ReceiveMsg中的 while(true)循环是多余的
3)ReceiveMsg中的 lock(this) 没有意义
4)WaitOne, Sleep() 都是多余的
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询