客户端使用
        m_socket = socket(AF_INET, SOCK_STREAM, 0);
        return INVALID_SOCKET == m_socket ? false : true ;
创建了1万个套接字,确保每次都是成功的,然后用
        sockaddr_in addSvr;
addSvr.sin_family = AF_INET;
addSvr.sin_addr.s_addr = inet_addr(pchIp);
addSvr.sin_port = htons(iPort);
int iReturnValue = connect(m_socket, (SOCKADDR *)&addSvr, sizeof(addSvr));
if (SOCKET_ERROR == iReturnValue)
{
return false;
}
return true;
进行连接,如果这个套接字连接失败的话,会有机制等一会在这个套接字上重新connect,直到客户端这1万个套接字全部连接成功,可为什么服务端accept统计的数量却总达不到一万呢。我自己初步研究了一下,如果服务端只要进行了listen调用,就算不调用任何accept,客户端也有那么几个是可以connect成功的,这说明connect的返回值和accept并没有直接关系,也就是说connect返回成功了,但并不代表服务端就已经accept。大家帮忙分析一下这种现象正常不,正常和不正常分别是因为什么。
如果正常,那么为什么成功connect了1万个,而服务端却accept不到一万个呢,丢失的这些链接是什么情况。
有什么办法确保我确实是创建了1万个TCP连接呢,当然在应用层进行一次send/recv,在recv之后计数应该比较准确,有没有其它的什么办法呢。另外,listen(m_listenSocket, 5)如果我把listen的第二个参数填大一点,比如100,上面的现象会好很多,连着测了几次没问题,而且会很快,但感觉这是个经验值,Svr跑在不同的环境下总不会总需要调吧。

解决方案 »

  1.   


    connect 成功。最好的办法是回传点数据。比如连接成功,服务器发送给客户端一个conn连接数。这个才是你实际accept成功的连接数
      

  2.   

    一 不同的windows操作系统下每个进程能支持的最大连接数是不同的,即使是Linux/Unix也有个上限,除非你编译系统的时候调整参数
    二 如果是server 2008以上版本,系统tcp/ip协议栈有个辅助处理功能,也就是系统提前在ip层自动进行了连接成功处理,即使实际上对应的套接字进程还没有被应用层accept
    三 如果你对没有连接成功的套接字没有及时reset,那么会很快耗光系统资源,主要是不可分片内存
      

  3.   

    调用connect成功只能说明三次握手成功,对方成功回复你connect的ACK包,与accept无关