多个线程同时调用connect连接服务器失败的问题

lirg8405 2013-04-08 04:45:36
您好,下面的我的问题描述:
1、首先,把要连接的服务器信息,保存到链表中;假设有100个服务器要连接;其他一些是存在的服务器,大部分是不存在的,测试用。

2、启动最多32个线程,从队列中取要连接的服务器信息,连接服务器。

a、创建SOCKET
b、设置为非阻塞
c、调用connect
d、判断返回值,如果是WSAEWOULDBLOCK,则调用select处理
e、select最大等待5秒
f、成功/失败的处理。

3、连接失败,则把连接信息放回队列,下次可继续连接。

4、成功则进行其他处理。

过程就是上面的了,效果就是,大量的不存在的服务器,连接超时失败返回,但是应该成功的服务器,连接同样失败,有时是超时,有时是返回10061。然后就是不停的重连,一直都不成功。

如果使用阻塞,则存在的服务器都能连接成功。

我觉得是不是大量在连接同时进行,其他大部不成功,影响了后面应该能连接成功的连接变失败。
具体是什么原因呢?有什么解决办法?盼望各位大神指点迷津,谢谢。
...全文
500 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
无言猪 2013-04-09
  • 打赏
  • 举报
回复
最简单的办法,用1个任务去做,这就不存在同步的问题了,然后观察现象后比较分析.
无言猪 2013-04-09
  • 打赏
  • 举报
回复
引用 15 楼 lirg8405 的回复:
引用 5 楼 lostying 的回复:什么操作系统,非windows server上对tcp并发连接有10个的限制,如果装过迅雷等下载软件破解过的,可能会导致这种错误产生,也就是大量的并发connect非有效的服务器的连接让你connect有效服务器的syn包都发不出去.你可以下载个相应软件看下,破解了就好了. 您好,您说的是对的,应该是这方面的问题,我把电脑的修改为……
当年这问题让我在现场折腾了2天,头大.
lirg8405 2013-04-09
  • 打赏
  • 举报
回复
引用 13 楼 lostying 的回复:
最简单的办法,用1个任务去做,这就不存在同步的问题了,然后观察现象后比较分析.
一个任务是不可取的,目的是要让能够连接上的尽可能的快连接上。
lirg8405 2013-04-09
  • 打赏
  • 举报
回复
引用 5 楼 lostying 的回复:
什么操作系统,非windows server上对tcp并发连接有10个的限制,如果装过迅雷等下载软件破解过的,可能会导致这种错误产生,也就是大量的并发connect非有效的服务器的连接让你connect有效服务器的syn包都发不出去.你可以下载个相应软件看下,破解了就好了.
您好,您说的是对的,应该是这方面的问题,我把电脑的修改为10000去测试,在线的都能够连接上。
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
当使用阻塞连接时,存在的服务器全部都可以连接。但是不能这样使用。因为当连接失败时,要很久才会收到超时返回。这段时间是不能忍受的。 如果把select等待的时间加长,也是不可取的,因为当前面的都是失败的,后面的才能成功。这时,后面成功的不能及时连接上。 现在主要是我弄不明白,为什么会连接失败?
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
引用 9 楼 youyingbo 的回复:
假设有100个服务器要连接,你的32个进程怎么分配的?谁连第一个?谁连第二个? 进程访问同一个服务器信息列表,同步也要注意
谁连那一个看当前要连的服务器列表,一个队列,每次出一个,从线程池中开线程连接。多线程同步上面没有问题。我相信也不是这方面的问题。
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
引用 8 楼 youyingbo 的回复:
仔细检查一遍代码,说不定想当然的地方犯了一个幼稚错误,往深的地方找反而找错地方。 你创建一个线程连接一个存在的服务器可以吗? 主线程接一个存在的服务器可以吗?
就连接来说,不存在错误。当要连接的全是存在的服务器时,全部都能正常连接上。
tiger波波 2013-04-08
  • 打赏
  • 举报
回复
假设有100个服务器要连接,你的32个进程怎么分配的?谁连第一个?谁连第二个? 进程访问同一个服务器信息列表,同步也要注意
tiger波波 2013-04-08
  • 打赏
  • 举报
回复
仔细检查一遍代码,说不定想当然的地方犯了一个幼稚错误,往深的地方找反而找错地方。 你创建一个线程连接一个存在的服务器可以吗? 主线程接一个存在的服务器可以吗?
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
引用 5 楼 lostying 的回复:
什么操作系统,非windows server上对tcp并发连接有10个的限制,如果装过迅雷等下载软件破解过的,可能会导致这种错误产生,也就是大量的并发connect非有效的服务器的连接让你connect有效服务器的syn包都发不出去.你可以下载个相应软件看下,破解了就好了.
这个我了解下,谢谢。 但是即使我把连接线程修改为2个,一样有应该连接上的服务器连接不上。
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
引用 4 楼 yang79tao 的回复:
那应该是代码的逻辑问题。
代码逻辑没有问题
无言猪 2013-04-08
  • 打赏
  • 举报
回复
什么操作系统,非windows server上对tcp并发连接有10个的限制,如果装过迅雷等下载软件破解过的,可能会导致这种错误产生,也就是大量的并发connect非有效的服务器的连接让你connect有效服务器的syn包都发不出去.你可以下载个相应软件看下,破解了就好了.
youngwolf 2013-04-08
  • 打赏
  • 举报
回复
那应该是代码的逻辑问题。
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
引用 1 楼 yang79tao 的回复:
多线程对同一个套接字调用connect吗?
不是,第2步,创建SOCKET,这里是新创建的SOCKET
lirg8405 2013-04-08
  • 打赏
  • 举报
回复
不是,第2步,创建SOCKET,这里是新创建的SOCKET
youngwolf 2013-04-08
  • 打赏
  • 举报
回复
多线程对同一个套接字调用connect吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧