这个时客户端连接方法:方法在beginConnect后回调Connected方法
public virtual void Connect(string ip, int port)
{
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
try
{
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
}
在Connected方法中实现如下:
protected virtual void Connected(IAsyncResult iar)
{
Socket socket = (Socket)iar.AsyncState;
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
//创建新的会话
_session = new Session(socket);
_isConnected = true;
//触发连接建立事件
if (ConnectedServer != null)
{
ConnectedServer(this, new NetEventArgs(_session));
}
//建立连接后应该立即接收数据
_session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
DefaultBufferSize, SocketFlags.None,
new AsyncCallback(RecvData), socket);
}
在socket.EndConnect(iar)处捕捉异常,也就是如果连不上服务器的话,这个地方抛出异常。
应用程序中:
try
{
m_TcpCli.Connect(m_strServerIp, m_iPortNum);
}
catch(Exception exx)
{
MessageBox.Show(exx.Message);
return;
}
但在程序运行过程中,不启动服务器而启动客户机连接,并没有捕获到那个socket.EndConnect(iar)处抛出的异常,平且显示如图:
[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5984e58aa0b2&attid=0.1][/img]
这是为什么,向大家学习学习。谢谢啦
13 个解决方案
#1
看不到图...
#2
[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5f2db970c8b9&attid=0.2][/img]
#3
图不知道怎么搞的贴不上去,就是在
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
处报错,显示“为处理ApplicationException”
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
处报错,显示“为处理ApplicationException”
#4
关注
#5
#6
[img=http://album.hi.csdn.net/app_uploads/jesenhq/20081004/115714194.p.JPG?d=20081004115812441][/img]
#7
异步方法和普通方法的区别在于调用该方法后,该方法并不会阻塞当前线程,而是使用新线程来处理,因此当你调用该方法时,在调用后立即执行之后的代码。
如下面这段例子:
try
{
//这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
如下面这段例子:
try
{
//这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
#8
问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar);
这报错。怎么才能捕获这个异常呢?
这报错。怎么才能捕获这个异常呢?
#9
异步的错误,一般在End方法处抛出。因此处理错误的打法应该是:
try
{
//如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
xxx.EndMethod(param);
}
catch (Exception ex)
{
//thorw your Exception
....
}
try
{
//如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
xxx.EndMethod(param);
}
catch (Exception ex)
{
//thorw your Exception
....
}
#10
这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来
#11
在End方法捕获就行。
异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。
#12
你可以在调用endConnect的方法中捕捉再抛出这个错误。
或者
可以定义一个ConnectError事件,在出现错误时,引发此事件。
#13
谢谢kssys,我做了个ConnectError事件,可行。感谢Kssys的帮助
#1
看不到图...
#2
[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5f2db970c8b9&attid=0.2][/img]
#3
图不知道怎么搞的贴不上去,就是在
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
处报错,显示“为处理ApplicationException”
try
{
socket.EndConnect(iar);
}
catch
{
throw new ApplicationException("连接失败");
}
处报错,显示“为处理ApplicationException”
#4
关注
#5
#6
[img=http://album.hi.csdn.net/app_uploads/jesenhq/20081004/115714194.p.JPG?d=20081004115812441][/img]
#7
异步方法和普通方法的区别在于调用该方法后,该方法并不会阻塞当前线程,而是使用新线程来处理,因此当你调用该方法时,在调用后立即执行之后的代码。
如下面这段例子:
try
{
//这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
如下面这段例子:
try
{
//这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
}
catch (ApplicationException EX)
{
throw (new ApplicationException("连接服务器失败!"));
}
#8
问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar);
这报错。怎么才能捕获这个异常呢?
这报错。怎么才能捕获这个异常呢?
#9
异步的错误,一般在End方法处抛出。因此处理错误的打法应该是:
try
{
//如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
xxx.EndMethod(param);
}
catch (Exception ex)
{
//thorw your Exception
....
}
try
{
//如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
xxx.EndMethod(param);
}
catch (Exception ex)
{
//thorw your Exception
....
}
#10
这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来
#11
在End方法捕获就行。
异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。
#12
你可以在调用endConnect的方法中捕捉再抛出这个错误。
或者
可以定义一个ConnectError事件,在出现错误时,引发此事件。
#13
谢谢kssys,我做了个ConnectError事件,可行。感谢Kssys的帮助