首页
社区
课程
招聘
[求助]完成端口模型数据收发错误(HTTP代理服务器)
发表于: 2009-6-30 18:37 5431

[求助]完成端口模型数据收发错误(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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//