开启多个线程调用异步socket进行通信出错

fywindy 2014-03-13 02:12:03
错误提示

下面是源代码:

//根据List开启相应个数的线程。
for (int i = 0; i < MainUI.StIP.Count; i++)
{
Thread sockMSG = new Thread(TreadCallBack);
object o = MainUI.StIP[i].IP;
sockMSG.Start(o);
}
//线程回调函数
private void TreadCallBack(object status)
{
string IP = (string)status;
MessageBoxEx.Show(IP);
IPAddress ip = IPAddress.Parse(IP);
clientSocket.BeginConnect(ip, Convert.ToInt32(4000), new AsyncCallback(ConnectCallBack), clientSocket);
}
/// <summary>
/// 异步回调函数(发送数据)
/// </summary>
/// <param name="ar"></param>
///
private void ConnectCallBack(IAsyncResult ar)
{
Socket sock; //= new Socket();
sock= (Socket)ar.AsyncState;
sock.EndConnect(ar);
try
{
while (MainUI.BeenStart)
{
for (int i = 0; i < MainUI.sps.Count; i++)
{
clientSocket.BeginSend(MainUI.sps[i], 0, MainUI.sps[i].Length, SocketFlags.None, sendCallback, clientSocket);
Thread.Sleep((MainUI.circle * 1000));
}
}
}
catch
{

}
}
/// <summary>
/// 发送数据回调函数(接受数据)
/// </summary>
/// <param name="ar"></param>
private void sendCallback(IAsyncResult ar)
{
try
{
Socket sock = (Socket)ar.AsyncState;
int x = sock.EndSend(ar);
if (x > 0)
{
sock.BeginReceive(Rex2, 0, Rex2.Length, SocketFlags.None, ReceiveCallback, sock);
}
}
catch
{

}

}
/// <summary>
/// 接受数据回调函数(解析数据)
/// </summary>
/// <param name="ar"></param>
private void ReceiveCallback(IAsyncResult ar)
{
try
{
Socket sock = (Socket)ar.AsyncState;
int x = sock.EndSend(ar);
if (x > 0)
{
int UPT = -1;
int ChannelNo = -1;
float Value = 0;
string[] Src = new string[1000];
float[] OutMSG = new float[1000];
Byte[] MSG = new Byte[1000];
int ReNum = UPTDecoder(Rex2, x, MSG, MSG.Length);
for (int i = 0; i < ReNum; i++)
{
Src[i] = Convert.ToString(MSG[i], 16);
if (i == 3)
{
UPT = Convert.ToInt32(Src[i], 16);
}
if (i == 4)
{
ChannelNo = Convert.ToInt32(Src[i], 16);
}
}
int Res = GetValue(Src, OutMSG, ReNum);
for (int i = 0; i < Res; i++)
{
if ((ChannelNo - 1) == i)
{
Value = OutMSG[i];
}
}
ShowValue(this.superGridControl2, Value, UPT, ChannelNo);
}
}
catch
{

}

}



异步操作不能开启多线程????????????刚开始接触网络方面有些东西不懂,欢迎赐教
...全文
129 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Carpathia 2014-03-13
  • 打赏
  • 举报
回复
1.既然IOCP了,还开多线程干嘛? 2.clientSocket是全局变量,每个连接需要用一个SOCKET,不能共用一个 3.没有SOCKETERROR异常判断 4.Thread.sleep会阻塞当前全部SOCKET,如果你这样设计,IOCP等于废了 5.IOCP用在LISTENER端,用于高并发接收处理 我建议你从同步SOCKET开始学起,打好基础,IOCP只是的一个提升高并发SOCKET的一种优化,基本原理上和同步SOCKET差不多,但是IOCP原理简单,但追求的是高效,要做到稳定与真正高性能,需要注重很多细节上的设计和很强的编码能力,一句不严谨的代码可能会让IOCP完全丧失优势,所以我建议你从初级开始,学会同步SOCKET通讯,不要一步登天!

110,536

社区成员

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

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

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