怎么强行停止BEGINRECEIVE过程(不是关闭SOCKET哦)

juventusland 2011-12-31 02:26:10
private void ReceiveA(Socket client)
{
try
{

StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveACallback), state);
}
catch (Exception e)
{

}
}

private void ReceiveACallback(IAsyncResult ar)
{
try
{

StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);

//here, client has some logic problem, it keeps receiving
if (bytesRead > 0)
{

response = Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
state.sb.Append(response);//ascii string get append

if (response.IndexOf("val")> -1 || response.IndexOf("\r\n> ") > -1)
{

if (state.sb.Length > 1) //get ascii code out true
{
response = state.sb.ToString();
state.sb.Clear();
}
receiveDone.Set();
}

else
{

// Get more data
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveACallback), state);

}
}
}
catch{}
}

可以看到在RECEIVEACALLBACK中,由于一次接受数据不够,利用ELSE称述中的CLIENT.BEGINRECEIVE继续接受数据。但是我不想让这一过程一直接收下去,请问有什么办法强行停止吗?(不能关闭SOCKET,因为我还要继续发送新的命令来得到接收数据)。。。
谢谢了,前面发的一帖没描述好,被忽视了。。。。
...全文
377 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LOVE_GG 2011-12-31
  • 打赏
  • 举报
回复
你的数据肯定有自己的固定格式吧,接收部分一直不停的接受,然后把接收的数据交给另外一个线程去处理,怎么存储、分割数据,都是另外一个线程的事情,接收部分只是负责接收。
jiuhexuan 2011-12-31
  • 打赏
  • 举报
回复
提前中止异步线程
http://archive.cnblogs.com/a/60040/
qldsrx 2011-12-31
  • 打赏
  • 举报
回复
你这个接收本身就会自动停止,不会一直接收下去的。如果想接收完之前强制停止,只要外部给一个标志变量,判断下即可。
解释:“if (bytesRead > 0)”即当收到数据后才会继续接收,没有数据则直接停止,别以为没数据的话,ReceiveACallback就不会触发,一样会的,只要客户端主动关闭Socket,这时服务端就会进入这个ReceiveACallback,并且bytesRead == 0
juventusland 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiuhexuan 的回复:]

提前中止异步线程
http://archive.cnblogs.com/a/60040/
[/Quote]谢谢你,我明天详细看一下你给的文章,如果有帮助就给你分了!

110,571

社区成员

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

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

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