TCP连接,如果服务器IP没打开侦听端口,连接很慢。

时间:2022-09-21 15:05:09
软件使用TCP客户端连接服务器。。


在调试的时候,发现,如果服务器没有打开侦听端口,则下面这行代码要等待很久,才会执行到下一行。。

m_SockComm->Connect(str,m_nIPPortNumber)


请问各位朋友,有什么办法可以解决吗?

11 个解决方案

#1


这个会有超时,因为客户端不知道服务端是否打开,可以开个线程等来做

#2


TCP默认的连接超时时间比较长。
而且socket连接默认的是阻塞模式,你可以讲其改为非阻塞模式,再计算超时。
http://blog.sina.com.cn/s/blog_4a6151550100xirf.html

#3


1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

#4


引用 3 楼 zhxingway 的回复:
1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

2楼给的链接里面不就有示例代码嘛
只不过看你那行代码貌似用的是CSocket,说实话,我从来不用

#5


引用 4 楼 year2002 的回复:
引用 3 楼 zhxingway 的回复:

1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

2楼给的链接里面不就有示例代码嘛
只不过看你那行代码貌似用的是CSocket,说实话,我从来不用


对呀,我用的是CSocket啊,,是在MFC框架内使用的嘛。所以2楼的示例代码好像用不了呀。
你为什么不用CSocket呢?

#6


因为我不会用,而且我觉得也不好用
你这个地方需要用CSocket的异步版本CAsyncSocket的Connect函数,它会立马返回WSAEWOULDBLOCK错误(大概是这个样子的,记不清了),不要管它(如果是其它错误就要管一下),如果连接成功了OnConnect事件会被触发
过5秒以后你再过来判一下,如果5秒连不上(所谓5秒这个时间你可以自己定),你就可以认为连接失败了

看看,很麻烦吧,所以我不用它

#7


可以放到线程中执行...

#8


引用 7 楼 tx183584 的回复:
可以放到线程中执行...


确定?

#9


异步select connect.

#10


侦听肯定要放在线程去做的,要不然,界面会假死的。

#11


引用 10 楼 zhongguoren666 的回复:
侦听肯定要放在线程去做的,要不然,界面会假死的。

有道理。

#1


这个会有超时,因为客户端不知道服务端是否打开,可以开个线程等来做

#2


TCP默认的连接超时时间比较长。
而且socket连接默认的是阻塞模式,你可以讲其改为非阻塞模式,再计算超时。
http://blog.sina.com.cn/s/blog_4a6151550100xirf.html

#3


1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

#4


引用 3 楼 zhxingway 的回复:
1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

2楼给的链接里面不就有示例代码嘛
只不过看你那行代码貌似用的是CSocket,说实话,我从来不用

#5


引用 4 楼 year2002 的回复:
引用 3 楼 zhxingway 的回复:

1,2楼的2个方法都很好,

有示例的代码就更好了。时间比较紧。

或者告诉我怎么找资料哦。。

2楼给的链接里面不就有示例代码嘛
只不过看你那行代码貌似用的是CSocket,说实话,我从来不用


对呀,我用的是CSocket啊,,是在MFC框架内使用的嘛。所以2楼的示例代码好像用不了呀。
你为什么不用CSocket呢?

#6


因为我不会用,而且我觉得也不好用
你这个地方需要用CSocket的异步版本CAsyncSocket的Connect函数,它会立马返回WSAEWOULDBLOCK错误(大概是这个样子的,记不清了),不要管它(如果是其它错误就要管一下),如果连接成功了OnConnect事件会被触发
过5秒以后你再过来判一下,如果5秒连不上(所谓5秒这个时间你可以自己定),你就可以认为连接失败了

看看,很麻烦吧,所以我不用它

#7


可以放到线程中执行...

#8


引用 7 楼 tx183584 的回复:
可以放到线程中执行...


确定?

#9


异步select connect.

#10


侦听肯定要放在线程去做的,要不然,界面会假死的。

#11


引用 10 楼 zhongguoren666 的回复:
侦听肯定要放在线程去做的,要不然,界面会假死的。

有道理。