Socket 异步接收丢包问题(有代码)

danny_2020 2012-12-19 09:42:44
接收的过程代码如下:
public void CommuniteHelp_TCP()
{
while (TCPOpenFlag)
{
try
{
MREvent.Reset();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(AsynAccept),tcpListener);
MREvent.WaitOne();
}
catch (Exception ex)
{
TCPOpenFlag = false;
}
}
}
/// <summary>
/// 异步接收
/// </summary>
/// <param name="mtcplisten"></param>
private void AsynAccept(IAsyncResult mtcplisten)
{
TcpListener mtcpListener = (TcpListener)mtcplisten.AsyncState;
TcpClient mtcpClient = mtcpListener.EndAcceptTcpClient(mtcplisten);
MREvent.Set();
ThreadAsynReceiveData(mtcpClient);
}
private byte[] receiveBytes = new byte[1024];
/// <summary>
/// 新线程异步接收
/// </summary>
/// <param name="mobj"></param>
private void ThreadAsynReceiveData(object mobj)
{

TcpClient mtcpClient = mobj as TcpClient;
if (null != mtcpClient)
{
mtcpClient.Client.BeginReceive(receiveBytes, 0, 1024, SocketFlags.None, new AsyncCallback(doneAsynAccept), mtcpClient);//mtcpClient
}

}

/// <summary>
/// 处理异步接收
/// </summary>
/// <param name="iar"></param>
private void doneAsynAccept(IAsyncResult iar)
{
try
{
lock (lockobj)
{
TcpClient mtcpClient = (TcpClient)iar.AsyncState;
int dataCount = mtcpClient.Client.EndReceive(iar);
if (dataCount > 0)
{
IAsyncResult Result = mtcpClient.Client.BeginReceive(receiveBytes, 0, 1024, SocketFlags.None, new AsyncCallback(doneAsynAccept), mtcpClient);//mtcpClient

string asciistr = System.Text.ASCIIEncoding.ASCII.GetString(receiveBytes, 0, dataCount);
StructModel.tcpSendTo tcpsendto = new StructModel.tcpSendTo();
tcpsendto.point = ((IPEndPoint)mtcpClient.Client.RemoteEndPoint);
tcpsendto.oreceiveBytes = receiveBytes;
tcpsendto.receiveBytesLength = (ushort)dataCount;
tcpsendto.ns = mtcpClient.GetStream();
tcpsendto.tcpClient = mtcpClient;
DoWork(tcpsendto);
//Thread _thread = new Thread(new ParameterizedThreadStart(DoWork));
//_thread.IsBackground = true;
//_thread.Start(tcpsendto);
//lock (RTU80SWSD_MainView.WaitHandleYDM)
//{
// RTU80SWSD_MainView.WaitHandleTCP.Enqueue(tcpsendto);
//}
//RTU80SWSD_MainView.YDMsignal.Set();
Thread.Sleep(200);
}
else
{
mtcpClient.Client.Shutdown(SocketShutdown.Both);
mtcpClient.Client.Close();
}
}
}
catch
{


}

}

在doneAsynAccept函数中 string asciistr = System.Text.ASCIIEncoding.ASCII.GetString(receiveBytes, 0, dataCount);
接收到的数据经常是相同的,请问是什么原因
...全文
424 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonocast 2013-01-02
  • 打赏
  • 举报
回复
将read内容先存在buffer里,然后每次read后扫buffer看是否存在一个完整的包,可能一次read后buffer中的包不完整就等下次,也可能存在一次read后buffer中有多个包,tcp已经确保了不会丢包,只存在socket断开
danny_2020 2013-01-02
  • 打赏
  • 举报
回复
急救!!!!
danny_2020 2012-12-25
  • 打赏
  • 举报
回复
有没能帮上忙的
danny_2020 2012-12-25
  • 打赏
  • 举报
回复
把MREvent.Set(); 移到第4个函数doneAsynAccept的int dataCount = mtcpClient.Client.EndReceive(iar); 下时,接收到的包和发送的包正常,但增加tcpclient客户端连接切不行,分析是程序在MREvent.WaitOne 停住了,这可能就是异步接收中采集MREvent.Set 同步导致的。现在想问该怎么改进这种问题
江左梅郎1 2012-12-24
  • 打赏
  • 举报
回复
大哥粘包了,这是TCP的特性
oraycn 2012-12-24
  • 打赏
  • 举报
回复
确实是粘包 导致的,可以参考一下ESFramework通信框架的做法
danny_2020 2012-12-20
  • 打赏
  • 举报
回复
求救哦,有没有能告诉我怎么解决这个问题
danny_2020 2012-12-19
  • 打赏
  • 举报
回复
自己顶下自己
danny_2020 2012-12-19
  • 打赏
  • 举报
回复
自己顶下自己
danny_2020 2012-12-19
  • 打赏
  • 举报
回复
楼上的都误解了我的意思,我用一个测试工具给Socket 服务并发数据 ,一次可能同时发1000条不一样的数据,但我的socket接收到的却是很多条一样的数据。
nanoxue 2012-12-19
  • 打赏
  • 举报
回复
楼主可以设置一下文件的规则 文件头+文件内容+文件尾 判断如果文件尾没有接收到 ,那就说明是丢包了,接着获取。
nanoxue 2012-12-19
  • 打赏
  • 举报
回复
socket接收数据 跟你的网速也有一定的关系 如果网速不好 很容易丢包的

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧