-
-
[求助]完成端口模型数据收发错误(HTTP代理服务器)
-
发表于: 2009-6-30 18:37 5431
-
偶写一个HTTP数据包转发软件,采用的是完成端口模型,但是 在收发数据的过程中总是出现错误,请高手指点
下面是 完成端口 线程函数
DWORD WINAPI CompletionServer(LPVOID hCompletionPortID)
{
static int Count=0;
HANDLE hCompletionPort=(HANDLE)hCompletionPortID;
PerHandleData *perHandleData=NULL;
DWORD BytesSend=0,BytesRecv=0;
PerIoData *perIoData=NULL;
DWORD Flags=0;
while(TRUE)
{
DWORD BytesTransfered=0;
int ReturnValue=GetQueuedCompletionStatus(hCompletionPort,&BytesTransfered,(LPDWORD)&perHandleData,(LPOVERLAPPED*)&perIoData,INFINITE);
if(BytesTransfered==0 && (perIoData->OperationType==OP_RecvFromServer || perIoData->OperationType==OP_RecvFromClient)) //A Socket Closed
{
//发生严重错误,释放资源
printf("Socket Closed....\n");
closesocket(perHandleData->SocketFromClient);
closesocket(perHandleData->SocketFromServer);
GlobalFree(perIoData->buffer.buf);
GlobalFree(perIoData);
GlobalFree(perHandleData);
continue;
}
switch(perIoData->OperationType)
{
case OP_RecvFromClient: //收到来自客户端的数据
// printf("Data From CLient: %s\n",(perIoData->buffer.buf));
if(SOCKET_ERROR==WSASend(perHandleData->SocketFromServer,&(perIoData->buffer),1,&BytesSend,Flags,&(perIoData->overLapped),NULL))
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
WSAGetOverlappedResult(perHandleData->SocketFromServer,&(perIoData->overLapped),&BytesRecv,FALSE,0);
int Ret=WSAGetLastError();
printf("Data From Client :WSASend Failed....Code: %d\n",Ret);
}
}
//=============================
memset(&(perIoData->overLapped),0,sizeof(OVERLAPPED));
memset((perIoData->buffer.buf),0,1024);
perIoData->buffer.len=1024;
perIoData->OperationType=OP_RecvFromClient;
if(SOCKET_ERROR==WSARecv(perHandleData->SocketFromClient,&(perIoData->buffer),1,&BytesRecv,&Flags,&(perIoData->overLapped),NULL))
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
WSAGetOverlappedResult(perHandleData->SocketFromClient,&(perIoData->overLapped),&BytesRecv,FALSE,0);
int Ret=WSAGetLastError();
printf("Data From Client : WSARecv Failed....Code: %d\n",Count,Ret);
}
}
break;
case OP_RecvFromServer: //收到来自服务器端的数据
printf("Count : %d Data From Server: %s\n",BytesTransfered,(perIoData->buffer.buf));
if(SOCKET_ERROR==WSASend(perHandleData->SocketFromClient,&(perIoData->buffer),1,&BytesSend,Flags,(LPOVERLAPPED)perIoData,NULL))
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
WSAGetOverlappedResult(perHandleData->SocketFromClient,&(perIoData->overLapped),&BytesRecv,FALSE,0);
int Ret=WSAGetLastError();
if(Ret==996) //对应Windows错误的10055
{
//这里不知道怎么解决
printf("1055 Error:%s\n",tmpBufferForRecv);
}
}
}
//Sleep(1000); //Wait For A While(网上有人是这么说解决的,可是结果也是不行)
//================================
memset(&(perIoData->overLapped),0,sizeof(OVERLAPPED));
memset((perIoData->buffer.buf),0,1024);
perIoData->buffer.len=1024;
perIoData->OperationType=OP_RecvFromServer;
if(SOCKET_ERROR==WSARecv(perHandleData->SocketFromServer,&(perIoData->buffer),1,&BytesRecv,&Flags,&(perIoData->overLapped),NULL))
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
WSAGetOverlappedResult(perHandleData->SocketFromServer,&(perIoData->overLapped),&BytesRecv,FALSE,0);
int Ret=WSAGetLastError();
if(Ret==996)
{
/*运行不到一分钟的时间,这里的错误就会出现,10055的windows错误,错误描述为:
由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
请高手指点
*/
printf("Data From Server WSARecv Failed...Code: %d \n",Ret);
}
}
}
break;
}
}
}
请高手不吝赐教啊
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
- [翻译]老外挑战360加固--实战分析(很详细) 41072
- [翻译]LLVM代码混淆分析及逻辑还原 14459
- [翻译]逆向平台Binary Ninja介绍 25302
看原图
赞赏
雪币:
留言: