首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

高手,WSAENOBUF的有关问题如何解决

2012-03-13 
请教各位高手,WSAENOBUF的问题怎么解决?服务器用soket监听(没用MFC),终端定时向服务器发送数据,数据量很小

请教各位高手,WSAENOBUF的问题怎么解决?
服务器用soket监听(没用MFC),终端定时向服务器发送数据,数据量很小,发送完毕后即断开连接,服务器接收到连接请求后即处理接收的数据然后断开连接。
现在问题来了:
  在终端少的情况下没问题,终端数很多(70个以上,每个终端同时有三个线程向服务器发起连接并发送数据然后断开连接),这时过一段时间服务器但无法接收到数据包,终端连接也会失败。
  分析知道是服务器端的socket关闭需要时间,正处于TIME_WAIT状态,由于同一时间连接请求太多导致没有连接资源可用,通过setsocketoption使socket关闭时不经历TIME_WAIT状态,似乎问题解决了,但自己经过测试后发现,在连接请求数超过17万个左右之后会出现WSAENOBUF的问题,表现为终端无法连接,服务器Accept返回WSAENOBUF。
  这是怎么回事呢?我看了程序该释放的资源都释放了,socket也关闭了,怎么办啊?请各位高手帮帮忙!

[解决办法]
加内存
SOCKET需要消耗系统的不可分片内存,大约是主内存的一半可以用来分配
不够就会出现这样的问题
[解决办法]
你的根本问题可能在代码:
你的socket是不是用的指针?那么这个socket最后销毁了吗?是在哪里销毁的?在不在创建它的线程内?
[解决办法]
在服务器端处理客户端断开时,把Socket采用Dot Linger的方式,使得不出现Time_Wait.

//强行关闭一个socket
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;
}
}
[解决办法]
是不是客户端你也是在本机?如果是的话,客户端也需要ForceCloseSocket.

热点排行