请教一个Socket池的问题
听说一些TCP服务端里有Socket池这样的设计,按照我的理解,池的概念就是预先创建好一定数量的资源,然后重复使用这些资源,当资源暂时不用时,就将资源标记为空闲,而不是销毁资源,这样就可以避免反复创建和销毁资源带来的开销。
把上面的概念套到Socket池上来,就是预先用socket/WSASocket创建好一定数量的SOCKET句柄,当有客户端连接时,从Socket池里取一个空闲的SOCKET句柄来分配给新连接的客户端,当客户端关闭时,就将对应SOCKET句柄标记为空闲,而不是用closesocket去关闭SOCKET句柄。
如果上面的Socket池理解正确,那我有两个问题不是很明白:
1、服务端接受连接时是不是只能用AcceptEx函数,因为只有AcceptEx才能自己指定接受连接的SOCKET句柄,而accept/WSAAccept则会自动创建一个新的SOCKET句柄,这样就没法用Socket池里已创建好的SOCKET句柄。
2、当客户端关闭时,服务端不能调用closesocket去关闭句柄。既然服务端不能调用closesocket,那服务端怎么主动去断开和客户端的连接,发消息给客户端吗?如果客户端也不closesocket呢,这个SOCKET句柄不就是关不了了吗?
如果上面的Socket池理解不正确,那正确的Socket池应该是怎样设计的呢?