接收的过程代码如下:
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);
接收到的数据经常是相同的,请问是什么原因
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);
接收到的数据经常是相同的,请问是什么原因
解决方案 »
- freopen
- 询问创建XML问题
- C#新手求教,一运行VS2003.net就出错,似乎是不能加载资源文件,这是怎么回事啊?
- 孟子e章<img src="Chart.aspx" />语句中的src问题
- 求助:下面这段c#代码对应的c++.net代码?
- 怎样对datagrid摸版列的HeaderTemplate 里面的控件操作?
- 60分求visual studio 2002下载地址
- C#文件操作,急求大神支援!!!!
- Socket异步通讯,求指明什么意思
- 我想在自定义控件中定义自己的属性,表现形式:下拉菜单。。每选一个item..属性随之改变。。。如何添加这样的属性,并且实现这个属性。。
- 字符串比较!
- gridview截取字符串的问题。。
下时,接收到的包和发送的包正常,但增加tcpclient客户端连接切不行,分析是程序在MREvent.WaitOne 停住了,这可能就是异步接收中采集MREvent.Set 同步导致的。现在想问该怎么改进这种问题