我用完成例程的重叠IO模型,,,
步骤如下:
1、投递一个WSARecv请求,然后WSAWaitForMultipleEvents等待。
2、在回调函数里,处理完数据后,再投递一个WSARecv请求,结果程序就阻塞在了这里,WHY???另外,,,,再请教一下,
在完成例程里,如何管理多个套接字?WSAWaitForMultipleEvents是可以等待64个套接字,但是每次IO完成后返回的都是WAIT_IO_COMPLETION,而不是像事件选择机制那样返回索引序号,,,,如何区分返回的是哪个套接字?不可能为每个套接字都调用一次WSAWaitForMultipleEvents吧如果哪位有采用完成例程序的重叠IO例子更好,谢谢/
void CALLBACK WorkRoutine(DWORD Error, DWORD ByteTransferred, LPWSAOVERLAPPED Overlapped, DWORD inFlags)
{
DWORD SendBytes, RecvBytes;
DWORD Flags;

if (Error!=0 || ByteTransferred ==0)
{
AfxMessageBox("Socket Error!!");
closesocket(AcceptSocket);
return;
}

Flags = 0;
ZeroMemory(&Overlapped, sizeof(WSAOVERLAPPED));
ZeroMemory(AfxBuffer,1024);
strcpy(AfxBuffer,DataBuf.buf); ZeroMemory(DataBuf.buf,DataBuf.len);

if (WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, Overlapped, WorkRoutine) == SOCKET_ERROR)
{
int icode = WSAGetLastError();
if (icode != WSA_IO_PENDING)
{
::MessageBox(NULL, "出错~~!!", "提示", MB_ICONINFORMATION);
char buff[10];
ZeroMemory(buff,10);
itoa(icode,buff,10);
AfxMessageBox(buff);

return;
}
} return;
}
void COverloadDlg::OnButton1() 
{
// TODO: Add your control notification handler code here WSAOVERLAPPED Overlapped;
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);

SOCKET fdServer = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); if (fdServer == INVALID_SOCKET)
{
::MessageBox(NULL, "出错,程序返回", "提示", MB_ICONINFORMATION);

return;
}


struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("192.168.1.177");
server.sin_port = htons(8000);

int ret = bind(fdServer, (sockaddr*)&server,sizeof(server));
ret = listen(fdServer,4); int iAddrSize = sizeof(server); AcceptSocket = accept(fdServer,(sockaddr*)&server,&iAddrSize); if (AcceptSocket == INVALID_SOCKET)
{
::MessageBox(NULL, "出错,程序返回1", "提示", MB_ICONINFORMATION); return;
}
DWORD Flags = 0; ZeroMemory(&Overlapped,sizeof(WSAOVERLAPPED));
DataBuf.len = DATA_BUFSIZE;
ZeroMemory(buffer,1024);
DataBuf.buf = buffer; DWORD RecvBytes;
if (WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &Overlapped, WorkRoutine)\
== SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
::MessageBox(NULL, "出错,程序返回", "提示", MB_ICONINFORMATION);

return;
}
} WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
EventArray[0] = WSACreateEvent(); int Index = 0;

while (TRUE)
{
Index = WSAWaitForMultipleEvents(1, EventArray, FALSE, WSA_INFINITE, TRUE); if (Index == WAIT_IO_COMPLETION)
{
MessageBox(DataBuf.buf);
}
else
{
AfxMessageBox("error");

return;
}
}
}