如果投递第一个WSARecv时出现的不是ERROR_IO_PENDING,是否说明不能正常激活完成端口进行运作?
经过bind,listen,WSAAccept之后,投递了第一个WSARecv激活完成端口,可总是出现10045错误:
for(;;)
{
SOCKADDR saRemote;
int RemoteLen = sizeof(saRemote); if((Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen, NULL, NULL))==SOCKET_ERROR)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while accept the connection.\n"));
return;
} if((PerHandleData = (LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while alloc memory for PerHandleData.\n"));
return;
}
PerHandleData->Socket = Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen); if(CreateIoCompletionPort((HANDLE)Accept, CompletionPort, (DWORD)PerHandleData, 0)==NULL)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while creating I/O completion port.\n"));
return;
} if((PerIoData=(LPPER_IO_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_DATA)))==NULL)
{
/*
* error occurs while allocating memory for PerIoData.
*/
MYTRACE(TEXT("Error occurs while allocating memory for PerIoData.\n"));
return;
} ZeroMemory(&(PerIoData->Overlapped), sizeof(WSAOVERLAPPED));
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = DATA_BUFSIZE;
if(WSARecv(Accept, &(PerIoData->DataBuf), 1, &dwBytes, &dwFlags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=ERROR_IO_PENDING)
{
sprintf(szDebugString, "%d\n", WSAGetLastError());
MYTRACE(TEXT("Errors not on I/O pending.BAD LUCK!! \n"));
MYTRACE(TEXT(szDebugString));
//就是总是执行到这里
return;
}
}
}//for(;;)
经过bind,listen,WSAAccept之后,投递了第一个WSARecv激活完成端口,可总是出现10045错误:
for(;;)
{
SOCKADDR saRemote;
int RemoteLen = sizeof(saRemote); if((Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen, NULL, NULL))==SOCKET_ERROR)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while accept the connection.\n"));
return;
} if((PerHandleData = (LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while alloc memory for PerHandleData.\n"));
return;
}
PerHandleData->Socket = Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen); if(CreateIoCompletionPort((HANDLE)Accept, CompletionPort, (DWORD)PerHandleData, 0)==NULL)
{
/*
* error occurs.
*/
MYTRACE(TEXT("Error occurs while creating I/O completion port.\n"));
return;
} if((PerIoData=(LPPER_IO_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_DATA)))==NULL)
{
/*
* error occurs while allocating memory for PerIoData.
*/
MYTRACE(TEXT("Error occurs while allocating memory for PerIoData.\n"));
return;
} ZeroMemory(&(PerIoData->Overlapped), sizeof(WSAOVERLAPPED));
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = DATA_BUFSIZE;
if(WSARecv(Accept, &(PerIoData->DataBuf), 1, &dwBytes, &dwFlags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=ERROR_IO_PENDING)
{
sprintf(szDebugString, "%d\n", WSAGetLastError());
MYTRACE(TEXT("Errors not on I/O pending.BAD LUCK!! \n"));
MYTRACE(TEXT(szDebugString));
//就是总是执行到这里
return;
}
}
}//for(;;)
解决方案 »
- MFC消息的若干问题
- 请问十六进制的字符串00 00 64 65可否转化为十进制数12呢?
- 在线性链表中,delete一个节点,是否要delete 这个节点内存,如果不delete,整个运用程序的内存是不是一直占据这些内存
- 用select语句执行后,怎么样使用得到的数据啊?
- 我用MFC写了一个ActiveX控件,在Win2000下可用,在98下就不好用!!谢谢!!在线等,急急!!
- 我做了一个对话框,加入了picture control,然后希望显示我的一张bitmap,如何做?(在先给分,分不够再加!)
- 如何实现TAPI的.wav声音播放
- 位图问题!!
- 这是为什么?C++中特别简单的问题
- 问个问题!
- Viaual C++ 数字图像处理(第二版)
- 请问《vc技术内幕》应该怎么看啊?
MSDN上说要么因为设了OOB,要么就是这个SOCKET是单向的。
谢谢各位了。