C# Socket 问题,请大家帮忙看一下

wolf_Knight 2010-01-22 01:11:47


private IPEndPoint localEndPoint;
private Socket mySocket;
private bool B_receive_Frm= fase;
public Thread LstThReceive = null;

//启动接收
protected void StartTcpRec()
{

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
localEndPoint = new IPEndPoint(ipAddress, 5000);


mySocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

mySocket.Bind(localEndPoint);


try
{
LstThReceive = new Thread(new ThreadStart(Listerner));
LstThReceive.IsBackground = true;
B_receive_Frm = true;
LstThReceive.Start();
}
catch (Exception e)
{
throw new Exception(" Start SOCKET:" + e.Message);
}



}

/// <summary>
/// 监听数据
/// </summary>
protected void Listerner()
{
try
{


mySocket.Listen(100);
while (B_receive_Frm == true)
{
// Set the event to nonsignaled state.
allDone.Reset();

// Start an asynchronous socket to listen for connections.
// Console.WriteLine("Waiting for a connection...");
mySocket.BeginAccept(
new AsyncCallback(AcceptCallback),
mySocket);

// Wait until a connection is made before continuing.
allDone.WaitOne();


}
}
catch (System.ObjectDisposedException e)
{
throw new Exception("SOCKET OBJECT : " + e.Message);

}
catch (Exception ex)
{
throw new Exception(" SOCKET Listerner: " + ex.Message);
}
}


/// <summary>
/// 异步接受数据
/// </summary>
/// <param name="ar"></param>
protected void AcceptCallback(IAsyncResult ar)
{
// Signal the main thread to continue.
allDone.Set();

//下面就是异步处理的一些代码就不贴了.

}



首先请大家看一下代码对不,想用线程实现socket异步通信功能!

在主界面调用 StartTcpRec 方法后,主界面还有其他线程在处理另外的工作.
单机测试,就是说长时间不给socket发送信息(比如:2-3小时或者更长时间)
发现出现如下问题:


Message:[ObjectDisposedException]
stackTrace:
at system.threading.waitHandle.checkResultInternal(boolean r)
at system.threading.eventwaithandle.set()
at system.windows.forms.control.task.markdone()
at system.windows.forms.control.task.invoke()
at system.windows.forms.control._invokeall()
at system.windows.forms.control.wnproc(WM wm,int32 wparam,int32 Iparam)
at system.windows.forms.containercontrol.wnproc(WM wm,int32 wparam,int32 iparam)
at system.windows.forms.control._internalwnproc(wm wm,int32 wparam,int32 iparam)
at miscrosoft.agl.forms.evl.entermainloop(intptr hwnmain)
at system.windows.forms.all.........

在百度后,有网友说可能是 " allDone.WaitOne(); " 长时间等待会出现这个问题.

请问大虾们有没有遇到这种情况,或者我的代码写的有问题?
有朋友说可以采用 alldone.waitone(new TimeSpan(0,30,0),true) 这样来处理,不知道这样是否可行?或者还有更好的处理方法?谢谢大家了!
...全文
207 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolf_Knight 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yangjiang113 的回复:]
你的程序是不是socket断开了呀?
用心跳包可以解决。
[/Quote]

请看上面说的。我是单机测试,没有其他客户端给我发任何信息,就出这个错误
wolf_Knight 2010-01-26
  • 打赏
  • 举报
回复
我的MSN:mike.li@msn.com
chenglidexiaoxue 2010-01-26
  • 打赏
  • 举报
回复
直接在AcceptCallback里启动远程的连接请求来完成不间断监听不行么
 /// 异步接受数据
/// </summary>
/// <param name="ar"></param>
protected void AcceptCallback(IAsyncResult ar)
{
mySocket.BeginAccept(
new AsyncCallback(AcceptCallback),
mySocket);

//下面就是异步处理的一些代码就不贴了.

}
gudongxing 2010-01-26
  • 打赏
  • 举报
回复
找个地方说句话
yangjiang113 2010-01-26
  • 打赏
  • 举报
回复
你的程序是不是socket断开了呀?
用心跳包可以解决。
wangzi_112 2010-01-26
  • 打赏
  • 举报
回复
up
wolf_Knight 2010-01-26
  • 打赏
  • 举报
回复
有人能帮忙看下我上面写的那个线程来监控是否有问题?
dugupiaoyun 2010-01-26
  • 打赏
  • 举报
回复
自己接收那里做下处理嘛
int bytesRead = mySocket.EndReceive(ar);
if (bytesRead > 0)
{
.......
}
else{
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
//throw(new Exception("读入的数据小于1bit"));
}
wolf_Knight 2010-01-26
  • 打赏
  • 举报
回复
alldone.waitone(new TimeSpan(0,30,0),true)

第2个参数 true或者false 代表什么意思

我在wince下面使用 alldone.waitone(30 * 60 *1000,true)
提示我参数不对 ,后来第2个参数换成false就行了。

l171147904 2010-01-26
  • 打赏
  • 举报
回复
UP
灵雨飘零 2010-01-26
  • 打赏
  • 举报
回复
up
wolf_Knight 2010-01-26
  • 打赏
  • 举报
回复
alldone.waitone(new TimeSpan(0,30,0),true)

第2个参数 true或者flase 代表什么意思
MOmo400 2010-01-22
  • 打赏
  • 举报
回复



你好!你的意思是另外启动一个线程来监控,在刚刚出问题那里catch一下做个标志,如果新起的线程发现这个标志就把原来的接收线程停止,再重起一下?这是个变通的方法.不知道是否有更好的方法呢?
[/Quote]

不用再开一个线程了,浪费资源


alldone.waitone(new TimeSpan(0,30,0),true)

的作法也是可以的.
平生我自如 2010-01-22
  • 打赏
  • 举报
回复
关注
wolf_Knight 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 momo400 的回复:]
做一个接收数据的超时处理.可以解决你的问题
[/Quote]

你好!你的意思是另外启动一个线程来监控,在刚刚出问题那里catch一下做个标志,如果新起的线程发现这个标志就把原来的接收线程停止,再重起一下?这是个变通的方法.不知道是否有更好的方法呢?
lovexilove 2010-01-22
  • 打赏
  • 举报
回复
up
walkghost 2010-01-22
  • 打赏
  • 举报
回复
没做过异步的socket通信。帮顶
MOmo400 2010-01-22
  • 打赏
  • 举报
回复
做一个接收数据的超时处理.可以解决你的问题
jin20000 2010-01-22
  • 打赏
  • 举报
回复
先顶

110,533

社区成员

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

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

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