完成端口问题!使用AcceptEx后过一段时间(时间不定)就无法获得连接信息了!
投递连接事件
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->OperationType = ACCP_POST;
PerIoData->AcceptSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, SA_FLAG_OVERLAPPED);
BOOL bReuseaddr = TRUE;
setsockopt(PerIoData->AcceptSocket, SOL_SOCKET, SO_REUSEADDR, (const char *) &bReuseaddr, sizeof(BOOL));
DWORD dwBytes;
BOOL rc = lpfnAcceptEx(Listen,
PerIoData->AcceptSocket,
PerIoData->Buffer,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
&dwBytes,
&(PerIoData->Overlapped));
完成端口查询到接收事件有信号的处理
// 获得连接信息
lpfnGetAcceptExSockAddrs(PerIoData->Buffer,
0,
sizeof(SOCKADDR_IN) + 16,
sizeof(SOCKADDR_IN) + 16,
(SOCKADDR **)(&lpLocalSockAddr),
&nLocalSockAddr,
(SOCKADDR **)(&lpRemoteSockAddr),
&nRemoteSockAddr);
// 终端设备关联完成端口
//
PerTerminalHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
PerTerminalHandleData->Socket = PerIoData->AcceptSocket;
memcpy(&PerTerminalHandleData->ClientAddr, lpRemoteSockAddr, sizeof(SOCKADDR_IN));
CreateIoCompletionPort((HANDLE) PerTerminalHandleData->Socket,
hCompletionPort,
(DWORD) PerTerminalHandleData,
0);
// 投递一个接收事件
//
LPPER_IO_OPERATION_DATA PerTerminalIoData;
PerTerminalIoData = (LPPER_IO_OPERATION_DATA) GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA));
PostRecv(PerTerminalHandleData->Socket, PerTerminalIoData);
// 投递一个Accept事件
//
PostAccept(PerHandleData->Socket, PerIoData);
一共开了两个工作器线程。运行一段时间就无法获得客户端连接了,从运行到出现问题这个时间
不太固定(不知道有什么规律),有时十分钟,有时好几个小时。其实客户端连接还是可以成功的,
就是完成端口获得不了连接的信息,好像是事件没有被指定为有信号。