winsock错误,代码10055,怎么回是?
我写了一个通讯网关,类似于一个管道,从一头获取某类请求,再根据请求内容发往不同的目的地,然后等目的地回包,若成功回包,简单地将回包信息发回给请求者,否则,给请求者发回一个错误信息。
由于请求的随机性及大量性,我做成了多线程,具体做法是,来一个请求,起一个线程,然后所有的create sock, connect, send, recv ,shutdown, close 动作都在线程内部完成。
但是奇怪的是,系统运行一段时间之后,整个程序就死掉了,查相应log,可以发现最后的错误代码是10055,这是怎么回事,难道我关闭socket不成功吗?但是log里几乎所有的信息都是显示成功,只不过最后的少许信息显示了10055,但是要知道,socket的可用句柄个数可有65535个至多喔,实在不明白。
简化后的关键性代码如下:
void MyThreadProc(LPVOID pParam)
{
........
SOCKET local_socket;
sockaddr_in remote_sockaddr;
int ErrorCode;
local_socket=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(local_socket==INVALID_SOCKET)
{
//write create socke error log here.
goto END;
}
int flag=1;
setsockopt( local_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&flag, sizeof(BOOL));
setsockopt( local_socket, SOL_SOCKET, SO_DONTLINGER, (char *)&flag, sizeof(BOOL));
remote_sockaddr=pSubGateInfo->SockAddr;
res=::connect(local_socket,(SOCKADDR*)&remote_sockaddr,sizeof(remote_sockaddr));
if(res==SOCKET_ERROR)
{
//write connect error log here.
goto END;
}
if(::send(local_socket,sendmsg,strlen(sendmsg),0)<0)
{
//write send msg error log here.
goto END;
}
::memset(recvmsg,'\0',sizeof(recvmsg));
if(::recv(local_socket,recvmsg,4,0)<0)
{
//write recv head info error here
goto END;
}
datalen=atoi(recvmsg);
::memset(recvmsg,'\0',sizeof(recvmsg));
if(::recv(local_socket,recvmsg,datalen,0)<0)
{
//write recv msg error here
goto END;
}
//recv from remote successfully!
//do what i really wanna to do.........
END:
if(::shutdown(local_socket,2)==SOCKET_ERROR)
{
//write shutdown sock error here
}
if(::closesocket(local_socket)==SOCKET_ERROR)
{
//write close sock error here
}
local_socket=INVALID_SOCKET;
delete pMsg;
}
请各位大虾不吝赐教!