请问一个TCP客户端连接多个服务器怎么样高效?

究级邪恶 2016-03-09 01:50:51
目前需要一个客户端同时连接30-40个服务器,使用for循环依次connect服务器,这样也可以实现,就是如果其中有大量服务器地址路由不可达或者连接不顺利的情况下,会耗费大量时间,因为windows connect阻塞模式一台是25秒,30-40台经计算和测试需要10多分钟。自己用非阻塞方式又不稳定。请问下大神有什么即稳定又快速点的方法?
...全文
1260 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
公共马甲0315 2016-04-26
  • 打赏
  • 举报
回复
你只是测试网络服务器是否可用,并不是真的需要连接并与之通讯? 这样的话,可以用CAsyncSocket异步模式,建立批量的socket,然后for循环尝试连接,连接操作本身会立即返回,但是每个连接是否成功有可能需要等20-30秒(连接超时后)才能获得结果,如果连接成功,则几秒内就能获得结果。好处就是等待的开销是重叠的,就是几十个连接都是相同时刻开始等待的,总共可能只需要不到40秒就获得全部结果了。 但这个方法很笨。 还有更简单的方法,发送UDP广播来枚举局域网内的可用ip。采用多线程方式,可以瞬间获得结果。 http://bbs.csdn.net/topics/391046264
Eleven 2016-03-30
  • 打赏
  • 举报
回复
你可以用异步方式,connect采用select模型试试~
wonly3 2016-03-30
  • 打赏
  • 举报
回复
这种情况我觉得要么使用线程,要么还是采用异步的方式。其实只选其一都可以
luawkk 2016-03-17
  • 打赏
  • 举报
回复
1,用线程完成 2,客户端用完成端口异步连接即可
boylafong 2016-03-17
  • 打赏
  • 举报
回复
我楼上已经说的比较明白了
shenyi0106 2016-03-11
  • 打赏
  • 举报
回复
先ping一下在connect不行么?
xian_wwq 2016-03-10
  • 打赏
  • 举报
回复
引用 楼主 huangzwin 的回复:
目前需要一个客户端同时连接30-40个服务器,使用for循环依次connect服务器,这样也可以实现,就是如果其中有大量服务器地址路由不可达或者连接不顺利的情况下,会耗费大量时间,因为windows connect阻塞模式一台是25秒,30-40台经计算和测试需要10多分钟。自己用非阻塞方式又不稳定。请问下大神有什么即稳定又快速点的方法?
非阻塞模式不稳定?没有看明白。 低效的主要问题是使用的阻塞方式,异常时需要等待timeout返回 建议改成多线程和异步方式,就是把原来单个线程循环连接server的工作 分到多个线程中去,并行处理。
赵4老师 2016-03-10
  • 打赏
  • 举报
回复
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
    FILE *f;
    char fn[40];
    char ln[80];
    char yn;
    int n;

    yn='N';
    sprintf(fn,"d:\\ping%d.txt",k);
    f=fopen(fn,"r");
    if (NULL!=f) {
        n=0;
        while (1) {
            if (NULL==fgets(ln,80,f)) break;//
            if (strstr(ln,"ms ")) {
                yn='Y';
                break;//
            }
            n++;
            if (n>=4) break;//
        }
        fclose(f);
    }
    return yn;
}
void main(int argc,char **argv) {
    char cmdstr[256];
    int i;
    int IP[3];
    char c;

    if (argc<2) {
    USAGE:
        printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
        return;
    }
    if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
        if (0<=IP[0] && IP[0]<=255
         && 0<=IP[1] && IP[1]<=255
         && 0<=IP[2] && IP[2]<=255
         && '.'==c) {
            for (i=1;i<255;i++) {
                sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
                WinExec(cmdstr,SW_HIDE);
            }
            Sleep(3000);
            for (i=1;i<255;i++) {
                printf("%c %s%d\n",YN(i),argv[1],i);
            }
            Sleep(3000);
            WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
        } else goto USAGE;
    } else goto USAGE;
}
究级邪恶 2016-03-09
  • 打赏
  • 举报
回复
我是考虑用多线程来实现,但是原本for中依次connect的代码,单独封装在线程函数中后也会不稳定,还有消息驱动大概是什么思路?能具体点吗
笨笨仔 2016-03-09
  • 打赏
  • 举报
回复
你不用线程吗? 线程+事件驱动

18,356

社区成员

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

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