一段完成端口的代码,帮忙看看哪里有错啊

xiao_xiao_zi 2005-05-10 01:36:05
typedef struct _OverLapedPlus
{
OVERLAPPED ol;
SOCKET s;
int opCode;
WSABUF buf;
DWORD dwBytes;
DWORD dwFlag;
} OVERLAPPEDPLUS;

UINT WorkerThread(LPVOID lParam)
{
DWORD dwBytestrans;
OVERLAPPEDPLUS *olp;
OVERLAPPED *OverLap;
while (true)
{
int ret;
ret = GetQueuedCompletionStatus(hIocp, &dwBytestrans, 0, &OverLap, INFINITE);
if (ret != 0)
{
olp = CONTAINING_RECORD(OverLap, OVERLAPPEDPLUS, ol);

switch (olp->opCode)
{
case OP_READ:
/* memset(&olp->ol, 0, sizeof(OVERLAPPED));
olp->buf.buf = new char[1000];
olp->buf.len = 999;
olp->opCode = OP_WRITE;
ret = WSARecv(olp->s, &olp->buf, 999,
&olp->dwBytes, &olp->dwFlag, &olp->ol, NULL);
*/
memset(&olp->ol, 0, sizeof(OVERLAPPED));
strcpy(olp->buf.buf, "12");
olp->buf.len = 2;
olp->opCode = OP_OVER;
ret = WSASend(olp->s, &olp->buf, 999, &olp->dwBytes, 0, &olp->ol, NULL);
break;
case OP_WRITE:
memset(&olp->ol, 0, sizeof(OVERLAPPED));
strcpy(olp->buf.buf, "12");
olp->buf.len = 2;
olp->opCode = OP_OVER;
ret = WSASend(olp->s, &olp->buf, 999, &olp->dwBytes, 0, &olp->ol, NULL);
break;
case OP_OVER:
closesocket(olp->s);
delete olp;
break;
default:
break;
}
}
}

return 0;
}

void CMy91MCPDlg::OnButton1()
{
// TODO: Add your control notification handler code here
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
SOCKET sListen = WSASocket(AF_INET, SOCK_STREAM,
IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
sockaddr_in sadd;
sadd.sin_family = AF_INET;
sadd.sin_addr.s_addr = htonl(INADDR_ANY);
sadd.sin_port = htons(6666);

bind(sListen, (sockaddr*)&sadd, sizeof(sockaddr));

listen(sListen, 5);

hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);

AfxBeginThread(WorkerThread, NULL);

while (true)
{
SOCKET s = accept(sListen, NULL ,NULL);
OVERLAPPEDPLUS *olp = new OVERLAPPEDPLUS;
olp->opCode = OP_READ;
olp->s = s;
olp->buf.buf = new char[1000];
olp->buf.buf[0]=0;
olp->buf.len = 999;
CreateIoCompletionPort((HANDLE)s, hIocp, (DWORD)olp, 0);
WSARecv(s, &olp->buf, 999, &olp->dwBytes, &olp->dwFlag, &olp->ol, NULL);
}
}

运行就死住了,线程调用GetQueuedCompletionStatus总是返回0
好象是I/O失败
哪里有错啊?
跟踪了下,client连接上了,也发送了数据(client是同步的)
...全文
115 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao_xiao_zi 2005-05-11
  • 打赏
  • 举报
回复
绑定完成端口的时候传了OverLapped结构的指针进去,如果释放了不就不能读了吗?

我已经解决了,不过还不太明白是什么原因而已
smartcomplier 2005-05-10
  • 打赏
  • 举报
回复
SOCKET s = accept(sListen, NULL ,NULL);
OVERLAPPEDPLUS *olp = new OVERLAPPEDPLUS;
olp->opCode = OP_READ;
olp->s = s;
olp->buf.buf = new char[1000];
olp->buf.buf[0]=0;
olp->buf.len = 999;
CreateIoCompletionPort((HANDLE)s, hIocp, (DWORD)olp, 0);
WSARecv(s, &olp->buf, 999, &olp->dwBytes, &olp->dwFlag, &olp->ol, NULL);


你NEW的东西没释放啊.

dongfa 2005-05-10
  • 打赏
  • 举报
回复
这部分不对吧?
while (true)
{
SOCKET s = accept(sListen, NULL ,NULL);
OVERLAPPEDPLUS *olp = new OVERLAPPEDPLUS;
olp->opCode = OP_READ;
olp->s = s;
olp->buf.buf = new char[1000];
olp->buf.buf[0]=0;
olp->buf.len = 999;
CreateIoCompletionPort((HANDLE)s, hIocp, (DWORD)olp, 0);
WSARecv(s, &olp->buf, 999, &olp->dwBytes, &olp->dwFlag, &olp->ol, NULL);
}
xiao_xiao_zi 2005-05-10
  • 打赏
  • 举报
回复
WSAGetLastError返回10045
nuaawenlin 2005-05-10
  • 打赏
  • 举报
回复
使用WSAGetLastError()看返回值是多少?
nuaawenlin 2005-05-10
  • 打赏
  • 举报
回复
使用WSAGetLastError()看返回值是多少?
elssann 2005-05-10
  • 打赏
  • 举报
回复
在CSDN里好好看看GetQueuedCompletionStatus的返回值说明。
再把MS 的 PLATFROM SDK里的那个例子好好看一遍。
xiao_xiao_zi 2005-05-10
  • 打赏
  • 举报
回复
up
xiao_xiao_zi 2005-05-10
  • 打赏
  • 举报
回复
怎么最近CSDN人气这么差啊
都没人来解答一下
xiao_xiao_zi 2005-05-10
  • 打赏
  • 举报
回复
GetLastError返回998

18,356

社区成员

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

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