首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

linux历程能打开的最大套接字数目

2013-07-08 
linux进程能打开的最大套接字数目问题是这样子的,接到一个任务,我需要编写一个程序模拟客户端到服务器的请

linux进程能打开的最大套接字数目
问题是这样子的,接到一个任务,我需要编写一个程序模拟客户端到服务器的请求,从而测试服务器的性能;
大致思路是,每次启动一个进程,这个进程就会向服务器发起很多连接(通过命令行获取数目),用一个类来封装每一个连接,每个连接类都会有自己的读写线程,
现在问题是,每次启动时,设置的连接数目最多只能是62个,我指定是要开启100个连接
int main(int argc, char* argv[])
{
/*        ParseArgs(argc, argv);*/

        char szServerIP[16] = {0};
        short nPort = -1;
        int nConnNumber = -1;
        int nTestType = -1;
        int ch;
        while((ch = getopt(argc, argv, "s:p:m:t:")) != -1)
        {
                switch(ch)
                {
                case 's':
                        {
                                strcpy(szServerIP, optarg);
                                break;
                        }
                case 'p':
                        {
                                nPort = atoi(optarg);
                                if(nPort < 1024)
                                {
                                        LOG_1("invalid port, port=%d", nPort);


                                }
                                break;
                        }
                case 'm'://这里指定最大连接数,我启动时给的值是100
                        {
                                nConnNumber = atoi(optarg);
                                if (nConnNumber < 0)
                                {
                                        LOG_1("invalid connect number, m=%d", nConnNumber);
                                }
                                break;
                        }
                case 't':
                        {
                                nTestType = atoi(optarg);
                                if (nTestType < 0)


                                {
                                        nTestType = -1;
                                        LOG_1("invalid test type , nTestType=%d", nTestType);
                                }
                                break;
                        }
                default:
                        {
                                Usage();
                                return 0;
                        }
                }
        }
        
        if(strlen(szServerIP) == 0)
                strcpy(szServerIP, "127.0.0.1");
        if (nPort <= 0)
                nPort = 9528;
        if(nConnNumber <= 0)
                nConnNumber = 1;
        


        g_nMaxConnCount = nConnNumber;
        for (int i = 0; i < nConnNumber; i++)
        {
                CConnectInstance* pConnInstance = new CConnectInstance(i + 1, nTestType);
                pConnInstance->SetServerAddr(szServerIP, nPort);
                pConnInstance->ConnectToServer();
        }

        while(1);

        return 0;
}
复制代码
linux历程能打开的最大套接字数目  
每次需要启动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开发,很多不懂,有地方没有描述清楚,请大家指出来,不甚感激 linux? socket


[解决办法]
是不是你的局域网有限制?问问网管
[解决办法]
你可以先检查下服务端机器看是否内存耗尽,然后抓下包看是客户端没发还是服务端问题。

热点排行