| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2260 人关注过本帖
标题:[求助]异步通讯之关闭后重新自动连接
只看楼主 加入收藏
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
收藏
得分:0 

if (nBytesRec > 0)
{

string ss = Encoding.ASCII.GetString(Receive_Buffer, 0, nBytesRec);
。。。
}
else
{
shutdown
close
}

服務器 客戶端 都這樣關就行了


[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-10-19 11:42
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
private void PreventErrorListen()
{
Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
LocalIP = new IPEndPoint(LocalIPAddress, int.Parse(textBox_Listen_Port.Text));
Listener.Bind(LocalIP);
listBox_Receive_Status.Items.Add("开始监听端口" + textBox_Listen_Port.Text + "...");
Listener.Listen(1);
MessageBox.Show("PreventErrorListen Listener.Connected="+Listener.Connected);
Listener.BeginAccept(new AsyncCallback(OnConnectRequest), Listener);
ListenDone.WaitOne();
}


public void OnConnectRequest(IAsyncResult ar)
{
listBox_Receive_Status.Items.Add("进入OnConnectRequest");

// Signal the main thread to continue.
ListenDone.Set();
MessageBox.Show("OnConnectRequest Listener.Connected=" + Listener.Connected);
Socket Listener1 = (Socket)ar.AsyncState; //此处的Listener是局部变量
MessageBox.Show("OnConnectRequest Listener1.Connected=" + Listener1.Connected);
try
{
ClientEndAccept = Listener1.EndAccept(ar);

listBox_Receive_Status.Items.Add("成功接受客户机" + ClientEndAccept.RemoteEndPoint + "的连接请求。。。");

//刚刚建立客户机与主机之间的连接
ClientEndAccept.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceiveData), ClientEndAccept);
ReceiveDone.WaitOne();

Listener.BeginAccept(new AsyncCallback(OnConnectRequest), Listener);
ListenDone.WaitOne();

}
catch { }
}

这里是我的监听部分阿

2006-10-19 11:43
li_ming
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2006-4-1
收藏
得分:0 
我也编过相关方面的程序,做的是短信网关,我是每隔固定时间给客户端发测试消息,查看客户端还是否存在

2006-10-19 11:49
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
以下是引用chenjin145在2006-10-19 11:42:28的发言:

if (nBytesRec > 0)
{

string ss = Encoding.ASCII.GetString(Receive_Buffer, 0, nBytesRec);
。。。
}
else
{
shutdown
close
}

服務器 客戶端 都這樣關就行了


Server这边可以,当Client自己关闭的时候,它可以检测到。同时作出反映 。但是
Client这边的时候就不行了。
我这里说得Client现在只考虑它有一个socket进行连接及发送报文,并没有接收的部分啊。
假如Client只有一个socket进行连接及发送报文,那么Server关闭的时候Client怎么知道S关闭了啊 ?

有人说在C里面做一个timer或者死循环,隔一段时间就检测S是否仍然连接。。。
这样似乎也很麻烦啊


2006-10-19 11:56
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
以下是引用li_ming在2006-10-19 11:49:27的发言:
我也编过相关方面的程序,做的是短信网关,我是每隔固定时间给客户端发测试消息,查看客户端还是否存在

那么照你的说法,就是Server中有个函数,每隔固定时间给客户端发测试消息,查看客户端还是否存在
Client中有个函数,每隔固定时间给Server发测试消息,查看Server还是否存在。
这样子会不会比较麻烦 ?呵呵。。我还没有这样试过。


2006-10-19 11:58
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
收藏
得分:0 
你的client難道是連接後 發送 就關閉的

你這樣就只有
try
{
send
}
catch()
{
信息發不出去
}

[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-10-19 11:58
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
你這樣就只有
try
{
send
}
catch()
{
信息發不出去
}

目前我只能这样子。。。

还有别的方法吗?


2006-10-19 12:12
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
你的client難道是連接後 發送 就關閉的  ???



这句不是很明白什么意思?

Client 这边 先连接connect,然后连上以后,就Send数据。
测试我使用手动发数据,然后我希望S那边关掉的时候。我这里能有反应。或者根据属性,或者什么其它的东西。
有什么别的吗?



2006-10-19 12:14
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
收藏
得分:0 

跟服務器一樣
需要beginreceive


[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-10-19 12:47
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
收藏
得分:0 
对于一个Socket,通常来说如果Send或Receive失败则说明Socket已经关闭,就这么简单.
短信网关是为了实时掌握客户端状态,所以需要在特定时间内进行握手消息,这是因为有时候Socket并没有断,但网络上有丢包的情况

2006-10-19 20:13
快速回复:[求助]异步通讯之关闭后重新自动连接
数据加载中...
 
   



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

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