Socket 异步接收丢包问题(有代码)
接收的过程代码如下:
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);
接收到的数据经常是相同的,请问是什么原因