SHSocket.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:4k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {======================================================================}
  2. {       基本的套接字函数库,能满足基本的需求                           }
  3. {        如果需要更具体的需求,就需要自己加代码了                      }
  4. {        }
  5. {        }
  6. {        }
  7. {       本项目完成... }
  8. {======================================================================}
  9. unit SHSocket;
  10. interface
  11. uses
  12.   SysUtils, Windows, Winsock2;
  13. //初始化UDP套接字
  14. function InitUDPSocket(Port: integer = 0): TSocket;
  15. //释放套接字资源
  16. procedure FreeSocket(var Socket: TSocket);
  17. //设置发送和接受缓冲区大小
  18. function SetRecvBufSize(Socket: TSocket; const BufSize: integer): boolean;
  19. function SetSendBufSize(Socket: TSocket; const BufSize: integer): boolean;
  20. //得到发送和接受缓冲区大小
  21. function GetSendBufSize(Socket: TSocket): integer;
  22. function GetRecvBufSize(Socket: TSocket): integer;
  23. function SetBroadCasst(const Socket: TSocket; IsBroadcast: boolean): boolean;
  24. implementation
  25. ///////////////////////
  26. function SetBroadCasst(const Socket: TSocket; IsBroadcast: boolean): boolean;
  27. var
  28.   bIsB: Bool;
  29.   iRc: Integer;
  30. begin
  31.   Result:=False;
  32.   bIsB := IsBroadCast;  //重点,否则要出错...
  33.   iRc := setsockopt(
  34.     Socket,
  35.     SOL_SOCKET,
  36.     SO_BROADCAST,
  37.     @bIsB,
  38.     SizeOf(bIsB));
  39.   if iRc<>SOCKET_ERROR then
  40.     Result:=True;
  41. end;
  42. ///////////////////////
  43. function SetSendBufSize(Socket: TSocket; const BufSize: integer): boolean;
  44. var
  45.   iRc: integer;
  46. begin
  47.   Result := true;
  48.   iRc := setsockopt(
  49.     Socket,
  50.     SOL_SOCKET,
  51.     SO_SNDBUF,
  52.     @BufSize,
  53.     SizeOf(BufSize));
  54.   if iRc = SOCKET_ERROR then
  55.     Result := false;
  56. end;
  57. ///////////////////////
  58. function GetSendBufSize(Socket: TSocket): integer;
  59. var
  60.   iRc, Size: integer;
  61. begin
  62.   Result := -1;
  63.   Size := SizeOf(integer);
  64.   iRc := getsockopt(
  65.     socket,
  66.     SOL_SOCKET,
  67.     SO_SNDBUF,
  68.     @Result,
  69.     Size);
  70.   if iRc = SOCKET_ERROR then
  71.   begin
  72.     Result := -1;
  73.     Exit;
  74.   end;
  75. end;
  76. ///////////////////////
  77. function GetRecvBufSize(Socket: TSocket): integer;
  78. var
  79.   IRc, Size: integer;
  80. begin
  81.   Result := -1;
  82.   Size := SizeOf(integer);
  83.   iRc := getsockopt(
  84.     socket,
  85.     SOL_SOCKET,
  86.     SO_RCVBUF,
  87.     @Result,
  88.     Size);
  89.   if iRc = SOCKET_ERROR then
  90.   begin
  91.     Result := -1;
  92.     Exit;
  93.   end;
  94. end;
  95. ///////////////////////
  96. function SetRecvBufSize(Socket: TSocket; const BufSize: integer): boolean;
  97. var
  98.   iRc: integer;
  99. begin
  100.   Result := false;
  101.   iRc := setsockopt(
  102.     socket,
  103.     SOL_SOCKET,
  104.     SO_RCVBUF,
  105.     @BufSize,
  106.     SizeOf(BufSize));
  107.   if iRc = SOCKET_ERROR then
  108.   begin
  109.     Exit;
  110.   end;
  111.   Result := true;
  112. end;
  113. ///////////////////////
  114. procedure FreeSocket(var Socket: TSocket);
  115. begin
  116.   if Socket <> INVALID_SOCKET then
  117.   begin
  118.     shutdown(Socket, SD_BOTH);
  119.     closesocket(Socket);
  120.     Socket := INVALID_SOCKET;
  121.   end;
  122. end;
  123. ///////////////////////
  124. //如果Port=0就是说明是 Client
  125. function InitUDPSocket(Port: integer): TSocket;
  126. var
  127.   AddrIn: TSockAddrIn;
  128.   bReLinten: BOOL;
  129. begin
  130.   Result := WSASocket(AF_INET,
  131.     SOCK_DGRAM,
  132.     0,
  133.     nil,
  134.     0,
  135.     WSA_FLAG_OVERLAPPED);
  136.   if Result = INVALID_SOCKET then
  137.     Exit;
  138.   if Port = 0 then
  139.     Exit;
  140.     
  141.   {
  142.   //设置在TIME_WAIT状态下可以再次在相同的端口上监听
  143.   bReLinten := True;
  144.   if SetSockOpt(
  145.     Result,
  146.     SOL_SOCKET,
  147.     SO_REUSEADDR,
  148.     @bReLinten,
  149.     SizeOf(bReLinten)) <> 0 then
  150.     Exit;
  151.   }
  152.   AddrIn.sin_family := AF_INET;
  153.   AddrIn.sin_port := htons(Port);
  154.   AddrIn.sin_addr.S_addr := INADDR_ANY;
  155.   if bind(Result, @AddrIn, SizeOf(AddrIn)) = SOCKET_ERROR then
  156.   begin
  157.     FreeSocket(Result);
  158.     Raise Exception.Create('Port is Used');
  159.     Exit;
  160.   end;
  161. end;
  162. ///////////////////////
  163. procedure InitWsocket;
  164. var
  165.   aWSAData: TWSAData;
  166. begin
  167.   if WSAStartup($202, aWSAData) <> 0 then
  168.   begin
  169.     MessageBox(0, //GetForegroundWindow(),
  170.       '本程序需要WINSOCK2,该机上版本太低,请升级' +
  171.       'WINSOCK到WINSOCK2',
  172.       '错误',
  173.       MB_ICONERROR);
  174.   end;
  175. end;
  176. procedure FreeWsocket;
  177. begin
  178.   if WSACleanup <> 0 then
  179.   begin
  180.     MessageBox(0,
  181.       '清除WS2_32.DLL失败!',
  182.       '错误',
  183.       MB_ICONERROR);
  184.   end;
  185. end;
  186. initialization
  187.   InitWsocket;
  188. finalization
  189.   FreeWsocket;
  190. end.