标题:[求助]异步通讯之关闭后重新自动连接
只看楼主
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
 问题点数:0 回复次数:19 
[求助]异步通讯之关闭后重新自动连接

我做了一个异步通讯的program,基本功能都实现了,现在的问题是Server和Client的非正常关闭连接以及正常关闭后的连接如何处理。
1。正常关闭

使用Client端的EndClient函数 ,Server端没有反应。后来我在BeginReceive的回调函数OnReceiveData中 加入这样的代码
public void OnReceiveData(IAsyncResult ar)
{
ReceiveDone.Set();
Sock = (Socket)ar.AsyncState;
try
{
int nBytesRec = Sock.EndReceive(ar); //收到数据长度
ReceiveDone.Set();
if (nBytesRec > 0)
{

string ss = Encoding.ASCII.GetString(Receive_Buffer, 0, nBytesRec);
。。。
}
else
{
listBox_Receive_Status.Items.Add("收到数据长度为零,远程客户机可能已经关闭,请重新监听。");
//这里我强行加入提示语句,因为发现无论是用EndClient的时候,Server端会进入BeginReceive的回调中。
问题1:Client端关闭,为什么会进入 BeginReceive的回调中
而且,收到数据长度为零。
问题2:在客户端关闭以后,作为接受的Socket Sock。connected属性=true。上面用蓝色字体显示

}


在这种情况下,我如何判断Client端已经关闭,进而对Server端也进行一些相应的处理啊?
比如 Server关掉,重启?




感谢各位的帮忙啊 ,多多关注啊。


搜索更多相关主题的帖子: 异步 通讯 Client 自动 Set 
2006-10-19 09:26
CrazyWeed0907
Rank: 2
等 级:新手上路
威 望:5
帖 子:1385
专家分:0
注 册:2006-5-30
得分:0 

你把整个server 都贴上来


“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”
2006-10-19 09:41
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
public void OnReceiveData(IAsyncResult ar)
{
ReceiveDone.Set();
Sock = (Socket)ar.AsyncState;
try
{
int nBytesRec = Sock.EndReceive(ar);
ReceiveDone.Set();
if (nBytesRec > 0)
{
string ss = Encoding.ASCII.GetString(Receive_Buffer, 0, nBytesRec);
listBox_Receive.Items.Add("接收:" + ss);
//FCS3000 f = new FCS3000("SeparateData");
//SeparateData(ss);
//AddintoMyfile(ss);
//listBox_Receive.Items.Add("接受:"+ss);
//收到要求发送data的报文GET
//发送有效数据。
//SendBackData(ss);
try
{
Sock.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length,
SocketFlags.None,
new AsyncCallback(OnReceiveData),
Sock);
ReceiveDone.WaitOne();
}
catch (ObjectDisposedException ode)
{
listBox_Send_Status.Items.Add("ObjectDisposedException" + ode.ToString());
}
catch (SocketException se)
{
listBox_Send_Status.Items.Add("发送出错,尚未建立远程连接:");
listBox_Send_Status.Items.Add("SocketException" + se.ToString());
listBox_Send_Status.Items.Add("远程主机关闭了连接,无法访问套接字,请重新连接。");
}
}
else
{
listBox_Receive_Status.Items.Add("收到数据长度为零,远程客户机可能已经关闭,请重新监听。");
}
}

catch (ObjectDisposedException ode)
{
listBox_Send_Status.Items.Add("ObjectDisposedException" + ode.ToString());
}
catch (SocketException se)
{
listBox_Send_Status.Items.Add("发送出错,尚未建立远程连接:");
listBox_Send_Status.Items.Add("SocketException:" + se.ToString());
listBox_Send_Status.Items.Add("远程客户机意外关闭了连接,无法访问套接字,请重新监听。");
}
}

这个是Server里面的BeginReceive的回调函数OnReceiveData


2006-10-19 10:23
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
主要的问题是,如果关闭了Client,Server这边如何及时地收到反映?是标志位?Sokcet的某种属性?还是什么?

同样的,如果Server关闭,Client这边如何及时地收到反映?是标志位?Sokcet的某种属性?还是什么?

因为我希望S 或者 C 主动关闭或者意外关闭以后,我能及时地得到通知,然后重新启动关闭的S或者C,重新迅速的建立连接,保证数据的发送。

2006-10-19 10:29
CrazyWeed0907
Rank: 2
等 级:新手上路
威 望:5
帖 子:1385
专家分:0
注 册:2006-5-30
得分:0 

可以通过socket引发异常来关闭连接


“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”
2006-10-19 10:46
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
可不可以说详细一点,引发哪一类异常来关闭连接?

if (nBytesRec > 0)
{
string ss = Encoding.ASCII.GetString(Receive_Buffer, 0, nBytesRec);
listBox_Receive.Items.Add("接收:" + ss);
................
....................................................................
}
else
{
listBox_Receive_Status.Items.Add("收到数据长度为零,远程客户机可能已经关闭,请重新监听。");
}

比如我再CLient那边 调用 ENDClient 这个函数,则会进入Server的OnReceiveData,这样子收到数据为零。然后 进入Else{}
在里面提示信息,然后重新开始监听?


如果是直接关闭整个CLient端,则仍然会进入Server的OnReceiveData函数,

try
{
Sock.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length,
SocketFlags.None,
new AsyncCallback(OnReceiveData),
Sock);
ReceiveDone.WaitOne();
}

这部分code的 Sock.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length,
SocketFlags.None,
new AsyncCallback(OnReceiveData),
Sock);
这句话出错,抛出异常,我接该异常
catch (SocketException se)
{
listBox_Send_Status.Items.Add("发送出错,尚未建立远程连接:");
listBox_Send_Status.Items.Add("SocketException:" + se.ToString());
listBox_Send_Status.Items.Add("远程客户机意外关闭了连接,无法访问套接字,请重新监听。");
}

然后重新监听,等待CLient的连接。

可是如此的话是否太冗余,又没有直接一点的属性或者什么方法呢?当S或者C关闭以后就可以迅速通知对方。


2006-10-19 10:59
skyland84
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2006-10-9
得分:0 
我也是通过 引发异常来处理的!
但是是不是real time 还没有考虑过!

决定人生~
2006-10-19 11:21
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
啊,除了我的处理之外,还有别的比较简单的或者其它方法吗?


2006-10-19 11:27
CrazyWeed0907
Rank: 2
等 级:新手上路
威 望:5
帖 子:1385
专家分:0
注 册:2006-5-30
得分:0 
你写的好像是冗余了,你的监听client的函数怎么写的啊
为什么在回调里面有重新写一次啊

“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”
2006-10-19 11:33
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
"为什么在回调里面有重新写一次啊" ??我没有贴监听的部分啊? 哪里啊? 哪一行贴一下吧。

2006-10-19 11:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-97292-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.213178 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved