一段完成端口的代码,帮忙看看哪里有错啊
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是同步的)