谁能把下面的C++转换成Delphi  寻C++、Delphi全能高手,200分(之一)请看
http://community.csdn.net/expert/Topicview2.asp?id=3336211int isWriteable(int nFD) {  fd_set rfds;
  struct timeval tv;
  int retval;
  
  FD_ZERO(&rfds);
  FD_SET(nFD, &rfds);
  tv.tv_sec = 0;
  tv.tv_usec = 500;  retval = select(nFD+1, NULL, &rfds, NULL, &tv);  if (retval) {
    return 0;
  }
   
 return -1;}HEXPACKET *recvData(int nFD) {
  
  HEXPACKET *pPacket;
  const unsigned int MAX_PACKET_SIZE = 1024;  pPacket = (HEXPACKET *) malloc( sizeof(HEXPACKET) );
  pPacket->data = (unsigned char *) malloc ( MAX_PACKET_SIZE );
  pPacket->size = 0;  pPacket->size = recv(nFD, pPacket->data, MAX_PACKET_SIZE, 0);  /* no data */
  if ( pPacket->size == 0 ) {
    free(pPacket->data);
    return NULL;
  }  return pPacket;
}int connectSocket(char *pIP, int nPort) {
  
  int nFD = -1;
  struct sockaddr_in sock;  #ifdef WIN32
  WORD wVersionRequested = 0;
  WSADATA wsaData;  wVersionRequested = MAKEWORD(1, 1);
  WSAStartup(wVersionRequested, &wsaData);
  #endif  nFD = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);  /* An error occured */
  if ( nFD == -1 ) {
    fprintf(stderr, "ERROR: Creating socket...\n");
  }  sock.sin_addr.s_addr = inet_addr(pIP);
  sock.sin_family = AF_INET;
  sock.sin_port = htons(nPort);  connect(nFD, (struct sockaddr *) &sock, sizeof(sock));  return nFD;}

解决方案 »

  1.   

    type
     pHexPacket=^THexPacket;
     THexPacket=packed Record  //用不用packed 看 c的pragma pack是否为1
      size:uint;
      data:PChar;
     end;
    function isWriteable(nFD:integer):integer;
    var
      rfds:Tfdset ;
      tv:timeval;
      retval:integer;
    begin
      FD_ZERO(rfds);
      FD_SET(nFD, rfds);
      tv.tv_sec:= 0;
      tv.tv_usec:= 500;
      retval:= select(nFD+1, nil, @rfds, Nil, @tv);
      if (retval>0)  then
        result:=0
      else
       result:=-1;
    end;
    function recvData(nFD:integer):pHexPacket ;
    var
      pPacket:pHexPacket;
      const  MAX_PACKET_SIZE = 1024;
    begin
      new(pPacket);
      pPacket^.data := StrAlloc(MAX_PACKET_SIZE );
     // pPacket^.size := 0;
       pPacket^.size:= recv(nFD, pPacket^.data[0], MAX_PACKET_SIZE, 0);  if ( pPacket^.size = 0 ) then
      begin
        Dispose(pPacket^.data);
        Result:=nil;
      end else
        Result:=pPacket;
    end;function connectSocket(pIP:PChar; nPort:integer):integer;
    var
      nFD:integer;
      sock:sockaddr_in;
      wVersionRequested:WORD;
      wsaData:TWSADATA ;
     begin
      wVersionRequested:= MAKEWORD(1, 1);
      WSAStartup(wVersionRequested, wsaData);
      nFD:= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if ( nFD = -1 ) then
        writeln(2,'ERROR: Creating socket...');  sock.sin_addr.s_addr := inet_addr(pIP);
      sock.sin_family := AF_INET;
      sock.sin_port := htons(nPort);
      connect(nFD, sock, sizeof(sock));
      result:=nFD;
    end;
      

  2.   


    function isWriteable(nFD: Integer):Integer;
    var
      rfds: fd_set;
      tv: timeval;
      retval: Integer;
    begin
      Result := -1;
      FD_ZERO(@rfds);
      FD_SET(nFD, @rfds);
      tv.tv_sec = 0;
      tv.tv_usec = 500;  retval = select(nFD+1, 0, @rfds, 0, @tv);
      if retval <> 0 then // CPP 中 if (n) 只要n != 0  if(n) 就为True
        Result := 0;
    end;
      

  3.   

    FD_ZERO(@rfds);
      FD_SET(nFD, @rfds);
    仔细看看定义吧
      

  4.   

    再来寻C++、Delphi全能高手,200分(之三) 
    http://community.csdn.net/Expert/topic/3337/3337311.xml?temp=.4542658
      

  5.   

    function isWriteable(nFD: Integer): Integer;
    var
      rfds: fd_set;
      tv: timeval;
      retval: Integer;
    begin
      FD_ZERO(@rfds);
      FD_SET(nFD, @rfds);
      tv.tv_sec  := 0;
      tv.tv_usec := 500;  retval = select(nFD + 1, nil, @rfds, nil, @tv);
      if retval <> 0 then
        Result := 0
      else
        Result := -1;
    end;type
      PHEXPACKET = ^HEXPACKET;
    function recvData(nFD: Integer): PHEXPACKET;
    const
      MAX_PACKET_SIZE: Cardinal = 1024;
    var
      pPacket: PHEXPACKET;
    begin
      New(pPacket);
      GetMem(pPacket.data, MAX_PACKET_SIZE);
      pPacket.size := 0;  pPacket.size := recv(nFD, pPackt.data, MAX_PACKET_SIZE, 0);  // no data
      if pPacket.size = 0 then
      begin
        FreeMem(pPacket.data);
        Dispose(pPacket);     // added
        Result := nil;
      end
      else
        Result := pPacket;
    end;type
      PSockAddr = ^SockAddr;function connectSocket(pIP: PChar; nPort: Integer): Integer;
    var
      nFD: Integer;
      sock: sockaddr_in;
    {#ifdef WIN32}
      wVersionRequested: WORD;
      wsaData: WSADATA;
    {#endif}
    begin
      nFD := -1;{#ifdef WIN32}
      // wVersionRequested := 0; // no use
      wVersionRequested = $0101;
      WSAStartup(wVersionRequested, @wsaData);
    {#endif}  nFD := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if nFD = -1 then
      begin
        Writeln('ERROR: Creating socket...');
      end;  sock.sin_addr.s_addr := inet_addr(pIP);
      sock.sin_family      := AF_INET;
      sock.sin_port        := htons(nPort);  connect(nFD, PSockAddr(@sock), SizeOf(sock));  Result := nFD;
    end;