DTcpClient.pas 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. unit DTcpClient;
  2. interface
  3. uses
  4. SysUtils, Classes, DRawSocket;
  5. type
  6. TDTcpClient = class(TComponent)
  7. private
  8. FActive: Boolean;
  9. FHost: String;
  10. FPort: Integer;
  11. FRawSocket: TDRawSocket;
  12. FReadTimeOut: Integer;
  13. procedure SetActive(const Value: Boolean);
  14. public
  15. constructor Create(AOwner: TComponent); override;
  16. destructor Destroy; override;
  17. procedure Connect;
  18. procedure Disconnect;
  19. /// <summary>
  20. /// recv buffer
  21. /// </summary>
  22. procedure recv(buf: Pointer; len: cardinal);
  23. function RecvBuffer(buf: Pointer; len: cardinal): Integer;
  24. function sendBuffer(buf: Pointer; len: cardinal): Integer;
  25. property Active: Boolean read FActive write SetActive;
  26. published
  27. property Host: String read FHost write FHost;
  28. property Port: Integer read FPort write FPort;
  29. /// <summary>
  30. /// unit ms
  31. /// </summary>
  32. property ReadTimeOut: Integer read FReadTimeOut write FReadTimeOut;
  33. end;
  34. implementation
  35. constructor TDTcpClient.Create(AOwner: TComponent);
  36. begin
  37. inherited Create(AOwner);
  38. FRawSocket := TDRawSocket.Create;
  39. FReadTimeOut := 30000;
  40. end;
  41. destructor TDTcpClient.Destroy;
  42. begin
  43. FRawSocket.Free;
  44. inherited Destroy;
  45. end;
  46. procedure TDTcpClient.Connect;
  47. var
  48. lvIpAddr:String;
  49. begin
  50. if FActive then exit;
  51. FRawSocket.createTcpSocket;
  52. //FRawSocket.setReadTimeOut(FReadTimeOut);
  53. //lvIpAddr := FHost;
  54. // may domain name
  55. lvIpAddr := FRawSocket.GetIpAddrByName(FHost);
  56. FActive := FRawSocket.connect(lvIpAddr, FPort);
  57. if not FActive then
  58. begin
  59. RaiseLastOSError;
  60. end;
  61. end;
  62. procedure TDTcpClient.Disconnect;
  63. begin
  64. if not FActive then Exit;
  65. FRawSocket.close;
  66. FActive := false;
  67. end;
  68. procedure TDTcpClient.recv(buf: Pointer; len: cardinal);
  69. var
  70. lvTempL :Integer;
  71. lvReadL :Cardinal;
  72. lvPBuf:Pointer;
  73. begin
  74. lvReadL := 0;
  75. lvPBuf := buf;
  76. while lvReadL < len do
  77. begin
  78. lvTempL := FRawSocket.RecvBuf(lvPBuf^, len - lvReadL);
  79. if lvTempL = -1 then
  80. begin
  81. RaiseLastOSError;
  82. end else
  83. begin
  84. lvPBuf := Pointer(IntPtr(lvPBuf) + Cardinal(lvTempL));
  85. lvReadL := lvReadL + Cardinal(lvTempL);
  86. end;
  87. end;
  88. end;
  89. function TDTcpClient.RecvBuffer(buf: Pointer; len: cardinal): Integer;
  90. begin
  91. Result := FRawSocket.RecvBuf(buf^, len);
  92. if Result = SOCKET_ERROR then
  93. begin
  94. RaiseLastOSError;
  95. end;
  96. end;
  97. function TDTcpClient.sendBuffer(buf: Pointer; len: cardinal): Integer;
  98. begin
  99. Result := FRawSocket.SendBuf(buf^, len);
  100. if Result = SOCKET_ERROR then
  101. begin
  102. RaiseLastOSError;
  103. end;
  104. end;
  105. procedure TDTcpClient.SetActive(const Value: Boolean);
  106. begin
  107. if FActive <> Value then
  108. begin
  109. if Value then
  110. begin
  111. Connect;
  112. end else
  113. begin
  114. Disconnect;
  115. end;
  116. end;
  117. end;
  118. end.