⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shsocket.pas

📁 一套及时通讯的原码
💻 PAS
字号:
{======================================================================}
{       基本的套接字函数库,能满足基本的需求                           }
{        如果需要更具体的需求,就需要自己加代码了                      }
{        }
{        }
{        }
{       本项目完成... }
{======================================================================}
unit SHSocket;

interface

uses
  SysUtils, Windows, Winsock2;

//初始化UDP套接字
function InitUDPSocket(Port: integer = 0): TSocket;

//释放套接字资源
procedure FreeSocket(var Socket: TSocket);

//设置发送和接受缓冲区大小
function SetRecvBufSize(Socket: TSocket; const BufSize: integer): boolean;
function SetSendBufSize(Socket: TSocket; const BufSize: integer): boolean;
//得到发送和接受缓冲区大小
function GetSendBufSize(Socket: TSocket): integer;
function GetRecvBufSize(Socket: TSocket): integer;
function SetBroadCasst(const Socket: TSocket; IsBroadcast: boolean): boolean;

implementation

///////////////////////

function SetBroadCasst(const Socket: TSocket; IsBroadcast: boolean): boolean;
var
  bIsB: Bool;
  iRc: Integer;
begin
  Result:=False;
  bIsB := IsBroadCast;  //重点,否则要出错...
  iRc := setsockopt(
    Socket,
    SOL_SOCKET,
    SO_BROADCAST,
    @bIsB,
    SizeOf(bIsB));
  if iRc<>SOCKET_ERROR then
    Result:=True;
end;

///////////////////////

function SetSendBufSize(Socket: TSocket; const BufSize: integer): boolean;
var
  iRc: integer;
begin
  Result := true;
  iRc := setsockopt(
    Socket,
    SOL_SOCKET,
    SO_SNDBUF,
    @BufSize,
    SizeOf(BufSize));
  if iRc = SOCKET_ERROR then
    Result := false;
end;

///////////////////////

function GetSendBufSize(Socket: TSocket): integer;
var
  iRc, Size: integer;
begin
  Result := -1;
  Size := SizeOf(integer);
  iRc := getsockopt(
    socket,
    SOL_SOCKET,
    SO_SNDBUF,
    @Result,
    Size);
  if iRc = SOCKET_ERROR then
  begin
    Result := -1;
    Exit;
  end;
end;

///////////////////////

function GetRecvBufSize(Socket: TSocket): integer;
var
  IRc, Size: integer;
begin
  Result := -1;
  Size := SizeOf(integer);
  iRc := getsockopt(
    socket,
    SOL_SOCKET,
    SO_RCVBUF,
    @Result,
    Size);
  if iRc = SOCKET_ERROR then
  begin
    Result := -1;
    Exit;
  end;
end;

///////////////////////

function SetRecvBufSize(Socket: TSocket; const BufSize: integer): boolean;
var
  iRc: integer;
begin
  Result := false;
  iRc := setsockopt(
    socket,
    SOL_SOCKET,
    SO_RCVBUF,
    @BufSize,
    SizeOf(BufSize));
  if iRc = SOCKET_ERROR then
  begin
    Exit;
  end;
  Result := true;
end;

///////////////////////

procedure FreeSocket(var Socket: TSocket);
begin
  if Socket <> INVALID_SOCKET then
  begin
    shutdown(Socket, SD_BOTH);
    closesocket(Socket);
    Socket := INVALID_SOCKET;
  end;
end;

///////////////////////
//如果Port=0就是说明是 Client

function InitUDPSocket(Port: integer): TSocket;
var
  AddrIn: TSockAddrIn;
  bReLinten: BOOL;
begin

  Result := WSASocket(AF_INET,
    SOCK_DGRAM,
    0,
    nil,
    0,
    WSA_FLAG_OVERLAPPED);

  if Result = INVALID_SOCKET then
    Exit;


  if Port = 0 then
    Exit;
    
  {
  //设置在TIME_WAIT状态下可以再次在相同的端口上监听
  bReLinten := True;
  if SetSockOpt(
    Result,
    SOL_SOCKET,
    SO_REUSEADDR,
    @bReLinten,
    SizeOf(bReLinten)) <> 0 then
    Exit;
  }

  AddrIn.sin_family := AF_INET;
  AddrIn.sin_port := htons(Port);
  AddrIn.sin_addr.S_addr := INADDR_ANY;

  if bind(Result, @AddrIn, SizeOf(AddrIn)) = SOCKET_ERROR then
  begin
    FreeSocket(Result);
    Raise Exception.Create('Port is Used');
    Exit;
  end;

end;


///////////////////////

procedure InitWsocket;
var
  aWSAData: TWSAData;
begin
  if WSAStartup($202, aWSAData) <> 0 then
  begin
    MessageBox(0, //GetForegroundWindow(),
      '本程序需要WINSOCK2,该机上版本太低,请升级' +
      'WINSOCK到WINSOCK2',
      '错误',
      MB_ICONERROR);
  end;
end;

procedure FreeWsocket;
begin
  if WSACleanup <> 0 then
  begin
    MessageBox(0,
      '清除WS2_32.DLL失败!',
      '错误',
      MB_ICONERROR);
  end;
end;

initialization
  InitWsocket;

finalization
  FreeWsocket;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -