UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断
2024-08-28 02:01:09
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using Common;
using System.Threading;
using System.IO; namespace BLL
{
public class SocketControl
{
bool isRun = false;
Socket socket;
IPEndPoint ipEndPoint;
Thread threadListen ;
byte[] buffer = new byte[]; private void Init()
{
ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), ConfigInformation.UdpPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(ipEndPoint); } public void Start()
{
Init();
isRun = true;
threadListen = new Thread(Listen);
threadListen.Start();
} private void Listen()
{
int dataLength ; while (isRun)
{
try
{ if ( ( dataLength = socket.Receive(buffer) ) > )
{
Analyer(Encoding.ASCII.GetString(buffer, , dataLength));
} }
catch(Exception ex)
{
Helper.LogWrite(ex.Message);
}
}
} private void Analyer(string data)
{
if (data == "LoadPlan")
{
PlanControl.LoadPlan(ConfigInformation.PlanConfigPath);
}
} public void Stop()
{
isRun = false;
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
}
当执行Stop时出现提示:一个封锁操作被对 WSACancelBlockingCall 的调用中断。
后经网上查找,原因大概是因为你关闭socket时,socket.Receive(buffer); 仍出于读取状态。
改为下面就可以了:
if (socket.Poll(-,SelectMode.SelectRead))
{
if ( ( dataLength = socket.Receive(buffer) ) > )
{
Analyer(Encoding.ASCII.GetString(buffer, , dataLength));
}
}
最新文章
- GRUB、MBR名词解释
- js获取当前日期
- js中十进制数转换为16进制
- CentOS VirtualBox启动虚拟及报错:VirtualBox error: Kernel driver not installed (rc=1908)
- Recover Binary Search Tree [LeetCode]
- iScroll.js和Swiper.js联合使用时的插件冲突(滑动冲突)
- String一点小发现
- SQLSERVER中WITH(NOLOCK)详解
- 浅谈Androidclient项目框架
- 2018-2019-2 网络对抗技术 20165304 Exp5 MSF基础应用
- C# 通过java生成的RSA公钥加密和解密
- Spring,为内部方法新起一个事务,此处应有坑。
- iframe子父窗口相互操作方法或元素
- SSH加密原理、RSA非对称加密算法学习与理解
- JavaScript 模拟键盘事件和鼠标事件(比如模拟按下回车等)
- [日常] DNS的迭代查询过程
- javascritp 字符串截取
- 关于Android中根据ID名动态获取资源的两个方法
- LeetCode OJ:Reverse Linked List II(反转链表II)
- python cookbook第三版学习笔记十九:未包装的函数添加参数