服务器用soket监听(没用MFC),终端定时向服务器发送数据,数据量很小,发送完毕后即断开连接,服务器接收到连接请求后即处理接收的数据然后断开连接。
现在问题来了:
在终端少的情况下没问题,终端数很多(70个以上,每个终端同时有三个线程向服务器发起连接并发送数据然后断开连接),这时过一段时间服务器但无法接收到数据包,终端连接也会失败。
分析知道是服务器端的socket关闭需要时间,正处于TIME_WAIT状态,由于同一时间连接请求太多导致没有连接资源可用,通过setsocketoption使socket关闭时不经历TIME_WAIT状态,似乎问题解决了,但自己经过测试后发现,在连接请求数超过17万个左右之后会出现WSAENOBUF的问题,表现为终端无法连接,服务器Accept返回WSAENOBUF。
这是怎么回事呢?我看了程序该释放的资源都释放了,socket也关闭了,怎么办啊?请各位高手帮帮忙!
现在问题来了:
在终端少的情况下没问题,终端数很多(70个以上,每个终端同时有三个线程向服务器发起连接并发送数据然后断开连接),这时过一段时间服务器但无法接收到数据包,终端连接也会失败。
分析知道是服务器端的socket关闭需要时间,正处于TIME_WAIT状态,由于同一时间连接请求太多导致没有连接资源可用,通过setsocketoption使socket关闭时不经历TIME_WAIT状态,似乎问题解决了,但自己经过测试后发现,在连接请求数超过17万个左右之后会出现WSAENOBUF的问题,表现为终端无法连接,服务器Accept返回WSAENOBUF。
这是怎么回事呢?我看了程序该释放的资源都释放了,socket也关闭了,怎么办啊?请各位高手帮帮忙!
TIME_WAIT是不能彻底取消的。系统需要它。
SOCKET需要消耗系统的不可分片内存,大约是主内存的一半可以用来分配
不够就会出现这样的问题
我更改内存大小试试。
但是即使更改内存也会有“用尽”的时候啊,如何使得程序“永久”运行而不出现内存不足呢?
你的socket是不是用的指针?那么这个socket最后销毁了吗?是在哪里销毁的?在不在创建它的线程内?
另外不明白终端为什么要断开连接而不是连接上了以后一直重用socket,才70多个而已啊
频繁connect也是很耗费资源的
-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
fantiyu(fantiyu):谢谢,我也觉得应该是哪儿的内存没释放,但始终不看不明白。
对于为什么要断开连接是因为最初程序设计考虑到远程,可能网络状况很不好随时可能会断,所以才采用连接后传输数据后就断开的设计。此外由于终端是随时登录随时传输数据,然后又可能随时断开,即终端具有不确定性。因此才有上述的设计。
但我现在始终找不到问题在哪儿,难道socket的内存清除除了shutdown、closesocket还有其它什么地方要注意吗?
void ForceCloseSocket(SOCKET &s,bool bClose)
{
bool bDontLinger=false;
setsockopt(s,
SOL_SOCKET,
SO_DONTLINGER,
(char *)&bDontLinger,
sizeof(bool)); linger InternalLinger;
InternalLinger.l_onoff=1;
InternalLinger.l_linger=0;
setsockopt(s,
SOL_SOCKET,
SO_LINGER,
(const char*)&InternalLinger,
sizeof(linger));
if(bClose)
{
closesocket(s);
s=INVALID_SOCKET;
}
}