为什么WSARecv成了阻塞函数???

ppyy 2003-11-19 01:47:50
我用完成例程的重叠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;
}
}
}
...全文
162 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mahatma_cn 2003-11-19
  • 打赏
  • 举报
回复
回答你的另外问题:
WSAGetOverlappedResult();
Semigod 2003-11-19
  • 打赏
  • 举报
回复
哎,我的程序想block都block不了

18,356

社区成员

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

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