完成端口问题!使用AcceptEx后过一段时间(时间不定)就无法获得连接信息了!

Hxy129 2005-12-17 12:16:41
投递连接事件

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);

一共开了两个工作器线程。运行一段时间就无法获得客户端连接了,从运行到出现问题这个时间
不太固定(不知道有什么规律),有时十分钟,有时好几个小时。其实客户端连接还是可以成功的,
就是完成端口获得不了连接的信息,好像是事件没有被指定为有信号。
...全文
316 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fine10000 2005-12-19
  • 打赏
  • 举报
回复
学习ing
Hxy129 2005-12-19
  • 打赏
  • 举报
回复
高手都不在?

客户端连接成功说明监听socket还在工作,只是完成端口无法获得连接事件!

用AcceptEx获得客户端连接信息后马上在这个连接socket上投递一个WSARecv事件有时候
会失败,错误代码为10038,这是怎么回事?
freemme 2005-12-17
  • 打赏
  • 举报
回复
顶一下

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧