免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1964 | 回复: 1
打印 上一主题 下一主题

[C] linux一个客户端进程只能模拟到服务器的62个连接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-29 17:02 |只看该作者 |倒序浏览
问题是这样子的,接到一个任务,我需要编写一个程序模拟客户端到服务器的请求,从而测试服务器的性能;
大致思路是,每次启动一个进程,这个进程就会向服务器发起很多连接(通过命令行获取数目),用一个类来封装每一个连接,每个连接类都会有自己的读写线程,
现在问题是,每次启动时,设置的连接数目最多只能是62个,我指定是要开启100个连接
  1. int main(int argc, char* argv[])
  2. {
  3. /*        ParseArgs(argc, argv);*/

  4.         char szServerIP[16] = {0};
  5.         short nPort = -1;
  6.         int nConnNumber = -1;
  7.         int nTestType = -1;
  8.         int ch;
  9.         while((ch = getopt(argc, argv, "s:p:m:t:")) != -1)
  10.         {
  11.                 switch(ch)
  12.                 {
  13.                 case 's':
  14.                         {
  15.                                 strcpy(szServerIP, optarg);
  16.                                 break;
  17.                         }
  18.                 case 'p':
  19.                         {
  20.                                 nPort = atoi(optarg);
  21.                                 if(nPort < 1024)
  22.                                 {
  23.                                         LOG_1("invalid port, port=%d", nPort);
  24.                                 }
  25.                                 break;
  26.                         }
  27.                 case 'm'://这里指定最大连接数,我启动时给的值是100
  28.                         {
  29.                                 nConnNumber = atoi(optarg);
  30.                                 if (nConnNumber < 0)
  31.                                 {
  32.                                         LOG_1("invalid connect number, m=%d", nConnNumber);
  33.                                 }
  34.                                 break;
  35.                         }
  36.                 case 't':
  37.                         {
  38.                                 nTestType = atoi(optarg);
  39.                                 if (nTestType < 0)
  40.                                 {
  41.                                         nTestType = -1;
  42.                                         LOG_1("invalid test type , nTestType=%d", nTestType);
  43.                                 }
  44.                                 break;
  45.                         }
  46.                 default:
  47.                         {
  48.                                 Usage();
  49.                                 return 0;
  50.                         }
  51.                 }
  52.         }
  53.        
  54.         if(strlen(szServerIP) == 0)
  55.                 strcpy(szServerIP, "127.0.0.1");
  56.         if (nPort <= 0)
  57.                 nPort = 9528;
  58.         if(nConnNumber <= 0)
  59.                 nConnNumber = 1;
  60.        
  61.         g_nMaxConnCount = nConnNumber;
  62.         for (int i = 0; i < nConnNumber; i++)
  63.         {
  64.                 CConnectInstance* pConnInstance = new CConnectInstance(i + 1, nTestType);
  65.                 pConnInstance->SetServerAddr(szServerIP, nPort);
  66.                 pConnInstance->ConnectToServer();
  67.         }

  68.         while(1);

  69.         return 0;
  70. }
复制代码

每次需要启动100个连接,都只会停在62个,就停止向服务器发起新的连接了
我按照网上方法做了很多配置修改:
-----第一种方法-------------------------------------------------
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
  speng soft nofile 10240
  speng hard nofile 10240
  其中speng指定了要修改哪个用户的打开文件数限制,可用'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
  第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
  session required /lib/security/pam_limits.so
  这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
  第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
  [speng@as4 ~]$ cat /proc/sys/fs/file-max
  12158
---------第二种方法-----------------------------------------------------------------------------------------------
sysctl net.ipv4.tcp_max_syn_backlog=40960
sysctl net.core.netdev_max_backlog=40960
sysctl net.core.somaxconn=40960
sysctl net.ipv4.tcp_window_scaling=0
sysctl net.ipv4.ip_local_port_range="10000 61000"
ulimit -n80000
ulimit -c1000000000
----------------------------------------------------------------------------------------------------
修改之后都重启了,并且关闭了防火墙,还是不行,注意我修改都是服务器机器和客户端机器同时修改配置
然后,我自己写了一个简单的服务器程序,当这个服务器程序和客户端运行在同一台linux机器上时,不会出现这个问题,但是把这个简单服务器移到另外一台机器上,就出现了上述同样的问题;
希望各位给出一点建议,这个问题到底需要怎么解决?????初次接触linux开发,很多不懂,有地方没有描述清楚,请大家指出来,不甚感激

论坛徽章:
0
2 [报告]
发表于 2013-06-29 18:37 |只看该作者
补充一下,linux系统是CentOS5.0,不要沉了啊  请知道的前辈现身!!!!!!!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP