S端用IOCP, 将Listener_socket绑定到IOCP, 一开始先Create十个AccpetExSocket准备接收C端的连接, 同时Create一个线程监视,一旦AccpetEx用完, 则再Create十个.问题是C端测试时, 创建的线程一旦超过十个, 就会出现10061的错误, 我猜想是由于S端AccpetEx用完后,在Create新AccpetEx时,有连接到达,这时由于没有AccpetEx用于调用, 故C端出现10061的错误.不知是否正确?我的连接是长连接, 每个Socket收发完一次数据后,并不closesocket.故先Create的十个AccpetExSocket只能接受头十次连接.请问应如何解决这个问题?(即如果同时有大量的长连接,AccpetExSocket将很快用完,在新Create期间的连接应如何处理?)多谢!!!
解决方案 »
- C#生成COM组件,以供VC++调用,数组传递
- 用了连接池,还能复用连接做事务处理吗?
- 如何用ANSI程序读取UTF8编码的mysql数据库?
- 今天突然发现还有小问题不明白!请教大家了!!!!
- *******公司开表彰大会。开完会,销售人员个个都洋洋得意,好像在过年;开发人员个个都垂头丧气,好像死了娘。老板,说句心里话:我们对
- ★★★软件测试,欢迎帮忙,绝对给分★★★
- 如何改变EDIT控件的背景颜色
- 如何读出硬盘分区的序列号?
- 圣诞大餐:一道面试智力题,up有分!
- 两个edit派生类中,在edit1中移动光标,实现了所在行换背景色,如何使edit2的光标也下移一行,并所在行变背景色?
- 请教:dll中调用静态链接库的问题
- 怎么会有这样的错误?
请留个EMAIL.我给你发过去。
{
int nRet;
DWORD dwRecvNumBytes = 0;
//The context for listening socket uses the SockAccept member to store the
//socket for client connection.
if (fUpdateIOCP)
{
g_pCtxtListenSocket = UpdateCompletionPort(g_sdListen, ClientIoAccept, FALSE);
if (g_pCtxtListenSocket == NULL)
{
WriteDalError("failed to update listen socket to IOCP\n");
return(FALSE);
}
}
g_pCtxtListenSocket->pIOContext->SocketAccept = CreateSocket();
if (INVALID_SOCKET == g_pCtxtListenSocket->pIOContext->SocketAccept)
{
WriteDalError("failed to create new accept socket\n");
return(FALSE);
}
// pay close attention to these parameters and buffer lengths
nRet = AcceptEx(
g_sdListen,
g_pCtxtListenSocket->pIOContext->SocketAccept,
(LPVOID)(g_pCtxtListenSocket->pIOContext->Buffer),
//DEFAULT_IOCP_BUFF_SIZE - (2 * (sizeof(SOCKADDR_IN) + 16)),
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwRecvNumBytes,
(LPOVERLAPPED) &(g_pCtxtListenSocket->pIOContext->Overlapped)
);
if (nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()))
{
WriteError("AcceptEx Failed: %d\n", WSAGetLastError());
return(FALSE);
}
return(TRUE);
}
如果你是出于学习的目的,那别人把bug找出来,对你未必有什么提高。