SocketAsyncServer数据粘包处理,急!!!
现在遇到一个问题,就是担心TCP会有数据粘包的现象发生,如果有问题,我应该怎么处理,同步的socket我会处理,定义个包头和长度,然后就是内容了,可以实现正确判断。如果要是异步的怎么办呢?我用的是MSDN上的例子,这里我有一个疑问,completed事件是只要服务器端有数据就触发吗?那如果客户端A给服务器S发送数据,由于网络原因服务器端只收到了一半,会触发这个completed事件吗?等A剩下的另一半数据又接收后还会触发completed事件吗?然后客户端B又给服务器S发送了一个数据,触发completed事件后,A的数据怎么和B的数据进行区分。在ProcessReceive里应该如何实现数据粘包问题,如何处理我接收的字符串received,求各位大神给予帮助。
代码如下:
private void OnIOCompleted(object sender, SocketAsyncEventArgs e)
{
// Determine which type of operation just completed and call the associated handler.
switch (e.LastOperation)
{
case SocketAsyncOperation.Receive:
this.ProcessReceive(e);
break;
case SocketAsyncOperation.Send:
this.ProcessSend(e);
break;
default:
throw new ArgumentException("The last operation completed on the socket was not a receive or send");
}
}
private void ProcessReceive(SocketAsyncEventArgs e)
{
// Check if the remote host closed the connection.
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
Socket s = e.UserToken as Socket;
Int32 bytesTransferred = e.BytesTransferred;
// Get the message received from the listener.
String received = Encoding.ASCII.GetString(e.Buffer, e.Offset, bytesTransferred);
// Increment the count of the total bytes receive by the server.
Interlocked.Add(ref this.totalBytesRead, bytesTransferred);
Console.WriteLine("Received: {0}\"{1}\". The server has read a total of {2} bytes.", s.RemoteEndPoint, received, this.totalBytesRead);
}
else
{
this.CloseClientSocket(e);
}
}
相关推荐
SocketAsyncServer
老外写的SocketAsyncServe,比较全,补充了msdn文档上的例子不足指出
SocketAsyncServer3.5
高性能异步SOCKET服务器端 public class TcpListener { private SocketAsyncEventArgs Args; private Socket ListenerSocket; private StringBuilder buffers; public TcpListener() { } public void Listen(EndPoint e) { //buffer buffers = new StringBuilder(); //socket ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ListenerSocket.Bind(e); ListenerSocket.Listen(10); //异步socket事件 Args = new SocketAsyncEventArgs(); Args.Completed += new EventHandler(ProcessAccept); BeginAccept(Args); Console.WriteLine("server run at {0}", e.ToString()); } //开始接受 void BeginAccept(SocketAsyncEventArgs e) { e.AcceptSocket = null; if (!ListenerSocket.AcceptAsync(e)) ProcessAccept(ListenerSocket, e); } //接受完毕 开始接收和发送 void ProcessAccept(object sender, SocketAsyncEventArgs e) {
SocketAsync两个例子
SocketAsync两个例子,很不错的,用到了.net 中的socketasynceventargs异步socket
蒙古国寺庙shp信息点wgs84.zip
蒙古国寺庙shp信息点wgs84.zip
【电力系统状态估计与PMU(相量测量单元)】使用WLS和PMU来估计系统的电压幅值和角度还将这些值与使用Newton-Raphson方法获得的状态进行比较(Matlab代码实现)
内容概要:本文系统阐述了基于加权最小二乘法(WLS)融合相量测量单元(PMU)量测数据进行电力系统状态估计的理论与实现方法,重点研究了如何利用PMU提供的高精度、高同步性的电压和电流相量信息,构建精确的量测方程,并将其集成到传统的WLS状态估计算法中,以实现对系统节点电压幅值和相角的高精度估计。文中详细描述了WLS-PMU联合估计模型的数学推导过程,包括状态变量定义、量测函数建立、雅可比矩阵计算及迭代求解流程,并通过Matlab编程实现了该算法。研究进一步将WLS-PMU的估计结果与基于传统SCADA量测和牛顿-拉夫森(Newton-Raphson)潮流计算的状态估计结果进行对比分析,通过仿真验证了PMU的引入能显著提升状态估计的精度、收敛速度和抗噪声能力,为现代电力系统的高精度实时监控与安全分析提供了有效的技术手段。; 适合人群:具备电力系统分析、现代控制理论基础,熟悉状态估计、潮流计算原理,并能熟练运用Matlab进行仿真实验的电气工程专业高年级本科生、研究生及从事电力系统自动化、智能电网相关领域的科研人员和技术工程师。; 使用场景及目标:① 掌握融合PMU量测的WLS状态估计模型的完整构建方法与理论依据;② 学习并掌握在Matlab环境中实现WLS算法及Newton-Raphson潮流计算的具体编程技巧与仿真流程;③ 通过定量对比分析,深入理解PMU在提升电网可观测性、增强状态估计鲁棒性方面的核心价值与技术优势。; 阅读建议:建议读者在阅读时紧密结合所提供的Matlab代码,逐行分析算法实现细节,特别是PMU量测方程的处理、权重矩阵的设定以及WLS迭代过程的逻辑。鼓励通过修改系统参数(如网络拓扑、PMU配置数量与位置)、引入不同程度的量测噪声等方式进行扩展性仿真实验,以直观感受不同因素对估计性能的影响,从而深化对状态估计理论精髓的理解。


