解决C#Socket粘包问题
前言
最近在做一款辅助,需一对多进程间通讯(所有游戏脚本由同一个控制台控制),WM_COPYDATA效率太低,故采用Socket通讯。
作为一个没接触过Socket编程的小白,好不容易写(抄)好代码,一测试,根本得不到有用的数据。调试发现多个数据包连一块了,找遍全网,要么对新手不友好看不懂,要么第三方库,干脆自己写一个,直接上代码。
Thread recvThread = new Thread((object obj) =>
{
try
{
//所有数据包都存buf里
List<byte> buf = new List<byte>();
while (true)
{
Socket socket = obj as Socket;
byte[] data = new byte[1024];
//dll端发送最大1024字节,所以接收也是1024
int len = socket.Receive(data);
//临时存放数据包
byte[] temp = new byte[len];
Array.Copy(data, temp, len);
//数据包添加到buf的末尾
buf.AddRange(temp);
//数据包结构
//说明 包长 类型 包体
// ---- ---- --------
//数据包 0011 2233 44....nn
// ---- ---- --------
//字节数 2 2 n
//如果buf里存放的字节大于、等于(有的数据没有包体) 包长 类型的字节数 进入循环
while (buf.Count >= HeadLenth TypeLenth)
{
//把list转成数组 方便读取
byte[] bufArr = buf.ToArray();
//读取包长
short dataLen = BitConverter.ToInt16(bufArr, 0);
//读取类型
short dataType = BitConverter.ToInt16(bufArr, 2);
//buf里有整包进入if
if (dataLen <= buf.Count)
{
//我这把这个做成了Server控件,这里触发接收事件。
//不做成控件的话,可以直接在里边处理数据。
if (recvEventHandler != null)
{
//构造事件参数。
ReceiveEventArgs e = new ReceiveEventArgs();
//扔掉包长和类型(4字节),只保留包体。
byte[] d = new byte[dataLen - HeadLenth - TypeLenth];
Array.Copy(bufArr, 4, d, 0, d.Length);
//处理好的数据包,包长没有任何意义,包类型和包体作为参数的成员
e.Socket = client;
e.Data = d;
e.DataType = dataType;
//触发接收事件
this.recvEventHandler.Invoke(this, e);
}
//此包处理完,从buf里删除。
buf.RemoveRange(0, dataLen);
}
}
Thread.Sleep(10);
}
}
catch (SocketException ex)
{
switch (ex.SocketErrorCode)
{
//因为Dll直到游戏关闭才会卸载,而且游戏经常直接强退,所以只处理强退的异常
case SocketError.ConnectionReset://远程主机强迫关闭了一个现有的连接。
//强退触发关闭事件。
ServerEventArgs e = new ServerEventArgs();
e.Socket = client;
this.closeEventHandler.Invoke(this, e);
return;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
});
recvThread.IsBackground = true;
threads.Add(recvThread);
recvThread.Start(client);
Thread.Sleep(10);
写的不好,老手勿喷,实在看不下去把你的代码贴出来。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbihja
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01