这段代码是用在完成端口上的typedef struct 
{
  LPWSAOVERLAPPED OVerlapped;
  WSABUF DATABuf;
  CHAR Buffer[8192];
  DWORD BytesSend,BytesRecv;
}PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;LPPER_IO_OPERATION_DATA PerIOData;    ZeroMemory(&(PerIOData->OVerlapped),sizeof(LPWSAOVERLAPPED));  //这为什么老过不去啊
    PerIOData->BytesRecv = 0;
    PerIOData->BytesSend = 0;
    PerIOData->DATABuf.len = 8192;
    PerIOData->DATABuf.buf = PerIOData->Buffer;if (WSARecv(Server,&(PerIOData->DATABuf),1,&RecvBytes,&Flags,PerIOData->OVerlapped,NULL) == SOCKET_ERROR)
{
     if (WSAGetLastError() != ERROR_IO_PENDING)
     {
       Memo1->Lines->Add("WSARecv() failed with error"+GetLastError());
       return;
     }
}

解决方案 »

  1.   

    sizeof(LPWSAOVERLAPPED)----------->
    sizeof(WSAOVERLAPPED)
      

  2.   

    没给PerIOData 分配空间,你要么就不要用指针对象。直接把PerIOData声明为对象。
    例如 PER_IO_OPERATION_DATA PerIOData; 当然这样下面的语句也要把-> 改成 .要么就分配空间
    LPPER_IO_OPERATION_DATA PerIOData = new PER_IO_OPERATION_DATA; 但记得使用完后释放空间。
    delete PerIOData;
      

  3.   

    LPWSAOVERLAPPED是指针,sizeof(LPWSAOVERLAPPED)永远等于32,应该使用strlen(LPWSAOVERLAPPED)