首页 新闻 会员 周边 捐助

C#中实现将socket通信回应的数据返回

0
悬赏园豆:40 [待解决问题]

如题:

因为项目需要,使用socket通信。客户端。

client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer});

回应方法:

private static void RecievedComplete(IAsyncResult ar)
{
Info inf= ar.AsyncState as Info;
Socket sk =  inf.Socket;
int recieved;
try
{
recieved = sk.EndReceive(ar);

if (recieved > 0)
{
sk.BeginReceive(inf.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RecievedComplete), Info);

////////////////////我想把inf.Buffer 回应的数据,返回。


}
else {
receiveDone.Set();
}
}

 

比如在 socket回应后,执行 Update()方法。update方法需要使用回应的数据。socket方法我学的公用的。根据返回结果执行不同操作的。

艾紫霁的主页 艾紫霁 | 初学一级 | 园豆:165
提问于:2015-09-08 16:19
< >
分享
所有回答(1)
1

你有一个 Info 对象,其中有  Socket 还有一个 Buffer

—— 你接收到数据之后:inf.Buffer 也就已经赋值了。

 

发送线程:发送数据,线程等待。           从Buffer中取值,执行 后续操作。

接收线程:          接收数据,赋值Buffer, 

——————————————————————————

关键问题是: 如何让 发送线程 等待。

client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer});

这行代码之后,两个方案:

> Thread.Sleep(10000);  //让 发送线程等待 10秒。

> 线程同步锁 —— 这个 理解有点难度(你先用 第一种,实现你的 功能,再考虑用 线程锁 让代码 完美)。

InkFx | 园豆:416 (菜鸟二级) | 2015-09-08 16:51

我确实用的第一种,但是我觉得挺不好的,因为这个需要及时回应给用户展示的。第二个方案怎么弄呢?

支持(0) 反对(0) 艾紫霁 | 园豆:165 (初学一级) | 2015-09-08 16:58

@艾紫霁: 当你 想到第1种方案的时候,说明 你很有觉悟。

第2种方案 再告诉你,你就能够理解了:

 

AutoResetEvent resetEvent = new AutoResetEvent(false);  //创建一个 线程锁

client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(RecievedComplete), new Info(){Socket=client,Buffer=buffer, Event =resetEvent});

resetEvent.Set();   //让 发送线程等待。

——————————————————————————————

接收的时候:

////////////////////我想把inf.Buffer 回应的数据,返回。

inf.Event.Reset();  //开启 线程锁:告知 发送线程,不用再等了。

支持(0) 反对(0) InkFx | 园豆:416 (菜鸟二级) | 2015-09-08 17:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册