c# socket 异步通信 的一个问题

下面两个函数是clientsocket类中的两个方法,我想定义一个client类,然后通过receive方法返回读取的内容,但是程序运行到下面老是卡住,运行一分钟左右然后... 下面两个函数是clientsocket类中的两个方法, 我想定义一个client类, 然后通过 receive 方法 返回读取的内容, 但是程序运行到下面老是卡住, 运行一分钟左右 然后返回空 , 经过我单步调试,发现在第一次读取数据调用receivecallback之后,读取数据不为0,循环调用receivecallback,但是然后系统就卡住了,大约四五十秒(估计连接已经断开),然后才再调用receivecallback, 然后才bytesread=0, receiveDone.Set()执行后, receivecallback并没有被退出,而是继续执行下去了。 有大神知道怎么回事吗?
public string Receive()
{
try
{
response = "";
StateObject state = new StateObject();
state.workSocket = client;
receiveDone.Reset();
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
receiveDone.WaitOne();
return response;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// 有数据,存储.
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
else
{
response = state.sb.ToString();
// 所有数据读取完毕的指示信号.
receiveDone.Set();

}
展开
 我来答
khlerc
2012-11-23 · TA获得超过420个赞
知道小有建树答主
回答量:485
采纳率:0%
帮助的人:274万
展开全部
运行一分钟左右 然后返回空,是读取超时了才返回的,而且bytesread=0,你应该考虑异步读取,才不会卡住;
追问
现在就是异步读取的啊。。。

你说的异步是 。。。
追答
可否把你的类给我?我给你调试一下看看
你在call string Receive()函数时里面又加了receiveDone.WaitOne();这里必然卡住,所以不是什么异步通讯。
百度网友baf3962
2012-11-21 · TA获得超过667个赞
知道小有建树答主
回答量:204
采纳率:100%
帮助的人:133万
展开全部
receiveDone.Set()干嘛用的,没数据就关闭客户端的链接噻
if (bytesRead == 0)
{
if (client != null && client.Connected)
{
client .Shutdown(SocketShutdown.Both);
}

client .Close();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式