当多个客户端连接到服务器端后,中间由于网络问题,客户端的数据迟迟不能发送到数据端,这个时候,服务器判断,当一定的时间某一个客户端的数据还没有传递上来,就closesocket()掉该创建的套接字,但运行中发现,下次该客户端连接服务器端的socket值一直不断的增加,(也就是说:多个客户端一定的时间都没有传递上来数据,那么就closesocket()多个已经建立的socket,等到多个客户端再与服务器端建立socket连接的时候,发现socket的id值就增加了)。
我想前面的closesocket()好像没有起到关闭的作用?

解决方案 »

  1.   

    socket的id跟你关闭不关闭没啥具体联系吧。这取决与操作系统的socket句柄的算法。
      

  2.   

      SOCKET  connected_skt=INVALID_SOCKET;
      connected_skt=accept(skt,(struct sockaddr *)&clientaddr,&Len);
    上面是服务器端接收到一个客户端(假如只有一个客户端)的链接信息,建立一个SOCKET。
    假如这个客户端一定时间没有通讯,那么,我就
     closesocket(connected_skt);请问我这样做对吗?
      

  3.   


    谁告诉你客户1的socket被断开后,客户1再连接上来的socket的id就一定和原来的一样的?socket的分配是系统自动分配的,同一时间也不是同一个程序接收或向外连接而要系统分配socket,socket被断开后也要在一定时间系统才会释放掉资源和可以再重新使用。先补习下些基础知识吧。
      

  4.   

    可是我发现,下次客户端连接服务器端的时候,这个connected_skt的值就增加了,如果时间一长的话,那么这个socket有可能溢出?
      

  5.   

    你误解了我的意思,我的意思是:这个socket值一直要增加(断了之后再连接),当增加到一定值后,是否会溢出?
      

  6.   

    假如刚连接后的socket值是465,过一段时间不通讯,则就closesocket(465);
    再连接,那么系统分配的socket的值是476,
    那么这个时候,465什么时候才能得到应用?
    =======================================
    我现在发现的问题是多个客户端端连接到服务器端后,当每个客户端一定时间不通讯,都要closesocket(socket);
    结果下一轮连接的socket值都增加了(这是系统分配),当时我发现,这个socket值一直关闭了再连接socket的值一直是增加的,这样势必会出现溢出(假如存储这个socket的变量)。
      

  7.   

    应该不会,如果到了最大值,那再申请时,应该会真正释放前面你closesocket后的id了。
      

  8.   

    问题是前面被断开socket资源好像一直没有释放?这是怎么回事?
      

  9.   

    我持怀疑态度(个人观点)。
    因为我这里有一个程序,经过测试(基本运行了两天两夜),socket的值一直是增加的。当超过这个时间段后,程序好像处于死机状态,只有强行关闭该程序的进程,重新启动该程序才运行正常。但操作系统没有死掉。
      

  10.   

    是不是每次断开一个客户端closesocket((SOCKET)wParam)之后,都要执行一下 WSACleanup()???
      

  11.   

    超过这个时间段指的是什么,是达到Socket最大值么?建议你将每次申请的socket值输出。看看达到最大值后会怎么样
      

  12.   

    关闭之后,下次再连接的话,系统分配socket的值变大,周而复始,socket值会越来越大吗?不知道大到什么程度?
      

  13.   


    你有点杞人忧天了,32位值最大允许到42亿多,就算是SOCKET值一直在长,啥时候才能长到42亿?就更不说溢出了。算你一天有100万次连接,也要4200多天。况且SOCKET值也不是一直在长,当关闭SOCKET一段时间后,被关闭的SOCKET值是有可能被复用的。
      

  14.   

    最近应用socket,有些问题比较模糊,所以就
    非常感谢!