| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2233 人关注过本帖
标题:[求助]异步通信中C/S之间的连接与断开的问题
只看楼主 加入收藏
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
 问题点数:0 回复次数:15 
[求助]异步通信中C/S之间的连接与断开的问题
异步通信中Server跟Client之间的连接与断开。

我的程序中:
1。server 开始 listen,然后 Client 进行Connect. 连接成功以后可以进行数据的传送.但是如果 调用 EndServer函数,Client 端的 Send 功能依然可用.就是说, 此时,点击Send依然能够传送数据.
private void EndServer()
{
try
{
try
{
//shutdown函数中会抛出异常。可以被截住。
//但是我们将选择不把该异常显示出来。
Listener.Shutdown(SocketShutdown.Both);
try
{
Listener.BeginDisconnect(true, new AsyncCallback(DisconnectServerCallback), Listener);
}
catch
{
listBox_Receive_Status.Items.Add("BeginDisconnect抛出异常");
}
}
catch(SocketException se)
{

}
catch(ObjectDisposedException ode)
{

}
try
{
Listener.Close();
Console.WriteLine(Listener.Connected);
listBox_Receive_Status.Items.Add("Server端已经close。。");

}
catch(InvalidOperationException ioe)
{
listBox_Receive_Status.Items.Add("Server端出现问题"+ioe.ToString());
}
catch(Exception ee)
{
listBox_Receive_Status.Items.Add("Server端没有close"+ee.ToString());
if (Listener.Connected)
Console.WriteLine("Winsock error: " + Convert.ToString(System.Runtime.InteropServices.Marshal.GetLastWin32Error()));
}

}
catch
{
listBox_Receive_Status.Items.Add("Server还没有开始监听,无法断开,请先开启监听端口。");
}
}

private static void DisconnectServerCallback(IAsyncResult ar)
{
// Complete the disconnect request.
Socket client = (Socket)ar.AsyncState;
client.EndDisconnect(ar);
//Listener.EndDisconnect();
}

这是Server端的End的代码。先 shundown,然后begindicconnect,enddisconnect。最后close。然而,即使是这样,也可以发送数据并且可以正确的受到。 但是 我仅仅只是运行Server的End的代码。Client端没有断开。不知道这个时候他们之间的连接是否已经断开?

请各位指点。。。

搜索更多相关主题的帖子: 异步 通信 
2006-08-15 14:48
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
全部都是异步的调用。
Server端:
bind
listen:
beginaccept Listener.BeginAccept(new AsyncCallback( OnConnectRequest), Listener);
endaccept Client.BeginReceive(Receive_Buffer,0,Receive_Buffer.Length,SocketFlags.None,new AsyncCallback(OnReceiveData),Client);

2006-08-15 14:53
水中游
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:149
专家分:0
注 册:2006-3-20
收藏
得分:0 

你的连接服务器时的实例化socket时的对象是什么?
在关闭时用close关闭就可以了。
假如你的连接服务器的实例化socket的代码是:
connectsock=new Socket(AddressFamily.InterNetwork ,SocketType.Stream ,ProtocolType.Tcp );
关闭时用:
connectsock.Close ();//断开与服务器的连接。


锻炼中学习……学习中成长……
2006-08-15 15:25
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
Listener 是一个全局变量
在“StartListen”函数中初始化如下
Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

在EndServer中我将它关闭。如上个帖子所示:
Listener.Shutdown(SocketShutdown.Both);
try
{
Listener.BeginDisconnect(true, new AsyncCallback(DisconnectServerCallback), Listener);
}
Listener.Close();

但是这样子不行,调用Client的Send还是可以发送。除非Client端调用EndClient,这个时候Client的Send才不可以用。

我不是很懂这些地方。
只知道异步beginaccept回调的时候,是将Listener作为参数传进去。
Listener.BeginAccept(new AsyncCallback( OnConnectRequest), Listener);

然后:
public void OnConnectRequest( IAsyncResult ar )
{


listBox_Receive_Status.Items.Add("进入OnConnectRequest");

Socket Listener = (Socket)ar.AsyncState; //此处的Listener是局部变量


try
{
Socket Client = Listener.EndAccept(ar);
,。。。。。。。
Client.BeginReceive(Receive_Buffer,0,Receive_Buffer.Length,SocketFlags.None,new AsyncCallback(OnReceiveData),Client);
使用的就是传过来的参数。
会不会是因为这些变量的关系?
可是我看得一些例子上面也没有说要把这些变量怎么处理阿?


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

beginAccept(callback函數1)
函數1
endAccept獲取到socket
函數2處理(socket)
beginAccept(回調函數1)


函數2
socket.beginReceive(回調函數3)

函數3
endreceive獲取到數據
辨別receive的數據長度 <1 socket.close >1 處理數據
socket.beginreceive(回調函數2)


[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-08-15 16:02
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
chenjin145 ,这是什么意思啊?
我刚看了看,前面的调用基本就是我的那个处理的过程了。但是
辨別receive的數據長度 <1 socket.close >1 處理數據 这个是什么意思?

public unsafe void OnReceiveData(IAsyncResult ar)
{
Sock = (Socket)ar.AsyncState;
try
{
int nBytesRec = Sock.EndReceive(ar);//收到的数据长度
if (nBytesRec > 0)
{
try
{
。。。。。。。。。。。。
string ss = Encoding.BigEndianUnicode.GetString(Receive_Buffer, 0, nBytesRec);
listBox_Receive.Items.Add(ss);
AddIntoFile(ss);
Sock.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length,
SocketFlags.None,
new AsyncCallback(OnReceiveData),
Sock);
}
}

我在这个回调函数OnReceiveData中:
有判断届收到的数据长度的语句,但是没有关于长度《=0的处理。只有》0的时候会接受并作相应的处理。
你的意思是不是要我在长度《=0的时候进行处理?

辨別receive的數據長度 <1 socket.close >1 處理數據
但是你这句话我还是不知道要怎么做?判断完数据长度就把当前的socket关闭?还是哪个socket要关闭?


2006-08-15 16:22
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
收藏
得分:0 
<0
當前連接的socket關了


[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-08-15 16:30
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
函數3
endreceive獲取到數據
辨別receive的數據長度 <1 socket.close >1 處理數據
socket.beginreceive(回調函數2)

不好意思,没有看明白。
我的是
beginrecieve (callback OnreceiveData)
endReceive (回调)

OnreceiveData
判断接受到的数据长度 >0处理。
<=0 没有处理
此处没有socket的处理,没有关闭任何一个socket

<1 socket.close >1 。。。。。。。。。。。这个。。。。。。。。。。。
还有,汗。。。

關 这个是开还是关?




2006-08-15 16:44
水中游
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:149
专家分:0
注 册:2006-3-20
收藏
得分:0 
在Socket使用完毕后,请使用其的Shutdown方法禁用Socket,并使用Close方法关闭Socket。

锻炼中学习……学习中成长……
2006-08-15 16:56
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
收藏
得分:0 
有,我先shutdown,然后再disconnect,最后close了。。。
结果。。。。。。。。
不得其解。。。。。。。。

2006-08-15 17:17
快速回复:[求助]异步通信中C/S之间的连接与断开的问题
数据加载中...
 
   



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

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