服务器和客户端都使用单进程,单线程,目标是客服两端建立50000个套接口后通讯//服务器
           ........................
while( 1 ){
//等待建立一个连接
sAccept=accept(sListen,(sockaddr*)&cli,&iLen);
if(sAccept==INVALID_SOCKET){
printf("链接失败!accept\n");
printf("ERROR:%d\n",WSAGetLastError());
return 0;
                       }
                    ........................
                 }
//客户端
        ...................
ser.sin_family = AF_INET;
ser.sin_port = htons( iPort);
ser.sin_addr.s_addr = inet_addr(p_char_ip);
while(1){
if(connect(g_p_socket_list[i],(sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET){
int i_last_error = WSAGetLastError();
printf("连接服务器 失败:%d\n",i_last_error);
                       }
                     .......................
                }
本机连接本机测试,连接建立到50000没有任何问题,
但用我的机器做服务器与局域网中的两台机器连接,一台到3976,另外一台到20100左右,客户端connect返回WSAENOBUFS错误,然后再也连不起了,必须重启服务器再连
哪位高手帮我解决一下啊!

解决方案 »

  1.   

    如果您尝试建立 TCP 连接从大于 5000 的端口,本地计算机将响应以下 WSAENOBUFS (10055) 错误消息: 
    由于系统缺少缓冲区空间不足或队列已满,无法执行套接字上的操作。默认最大的临时 TCP 端口的数是 5000 。 要提高临时端口的上限,请按照下列步骤操作: 
    启动注册表编辑器。 
    在的注册表中找到以下子项,然后单击 参数 : 
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    在 编辑 菜单上单击 新建 ,然后添加下面的注册表项:
    数值名称: MaxUserPort 
    值类型: DWORD
    值数据: 65534
    有效范围: 5000-65534 (十进制)
    默认值: 0x1388 (5000 十进制)
    说明: 此参数将控制程序从系统请求任何可用的用户端口时使用的最大端口数。 通常,1024 的值和包含的 5000 之间分配临时的 (短) 端口。 
    退出注册表编辑器,并重新启动计算机。 
    请注意 其他的 TCPTimedWaitDelay 注册表参数确定在多长时间关闭的端口等可重复使用已关闭的端口。