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

📄 sendmsgsock.pas

📁 局域网VCD影院 用DELPHI 编写的 局域网VCD影院
💻 PAS
字号:
unit SendMsgSock;

interface

uses Windows, Messages, SysUtils, Mpeg1DataFormat, Classes, MyDef, WinSock;

procedure SendMpegHeadMark(const iMulticastGroup: integer {组播组序号});
procedure SendMsg_Refresh(const iMulticastGroup: integer {组播组序号});
procedure SendMsg_Stop(const iMulticastGroup: integer {组播组序号});
//procedure MySendMsgChar(const MsgChar:Char);

implementation

procedure MySendMsgChar(const MsgChar: Char; const iMulticastGroup: integer {组播组序号});
var
  addr_to: sockaddr_in;
  FSocket: TSocket;
  mreq: ip_mreq;
  VideoParkFrame: array[1..VideoPackSize] of byte;
  PlayBuf, SendPackbuf: PByte;
begin
  FSocket := Socket(AF_INET, SOCK_DGRAM, 0); //初始化socket
  if FSocket = SOCKET_ERROR then MessageBox(0, 'Socket() Failed', MpgServerName, MB_ICONERROR);
  mreq.imr_multiaddr.S_addr := inet_addr(TMulticastIp[iMulticastGroup]); //htonl(INADDR_ALLHOSTS_GROUP);
  mreq.imr_interface.S_addr := htonl(INADDR_ANY);
  if setsockopt(FSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, pchar(@mreq), sizeof(mreq)) = SOCKET_ERROR then
  begin
    MessageBox(0, '无法进行UDP组播', '', 0);
  end;
     //绑定要发送的Udp包的socketaddr_in结构
  ZeroMemory(@addr_to, sizeof(sockaddr_in));
  addr_to.sin_family := AF_INET;
  addr_to.sin_port := htons(TMulticastPort[iMulticastGroup]);
  addr_to.sin_addr.S_addr := inet_addr(TMulticastIp[iMulticastGroup]); //INADDR_BROADCAST;

  VideoParkFrame[1] := byte('C');
  VideoParkFrame[2] := byte('J');
  VideoParkFrame[3] := byte('T');
  VideoParkFrame[4] := byte(MsgChar);

  PlayBuf := GetMemory(MpegFrameSize); //分配读文件块要保存的内存
  ZeroMemory(PlayBuf, MpegFrameSize);
  SendPackbuf := GetMemory(VideoPackSize); //分配向网络发包的内存
  ZeroMemory(SendPackbuf, VideoPackSize);
//Move(PlayBuf^,VideoParkFrame[5],MpegFrameSize); //效率比CopyMemory高,但是占用Cpu
//Move(VideoParkFrame,SendPackbuf^,VideoPackSize);
  CopyMemory(@VideoParkFrame[5], PlayBuf, MpegFrameSize);
  CopyMemory(SendPackbuf, @VideoParkFrame, VideoPackSize);
  Sendto(FSocket, SendPackbuf^, VideoPackSize, 0, addr_to, sizeof(addr_to));
  Sleep(8);
   //释放内存
  if PlayBuf <> nil then FreeMemory(PlayBuf);
  if SendPackbuf <> nil then FreeMemory(SendPackbuf);
//关闭Socket句柄
  setsockopt(FSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, pchar(@mreq), sizeof(mreq)); //离开组播组
  if FSocket <> Invalid_SOCKET then CloseSocket(FSocket);
end;

procedure SendMpegHeadMark(const iMulticastGroup: integer {组播组序号});
begin
  MySendMsgChar('A', iMulticastGroup);
end;

procedure SendMsg_Refresh(const iMulticastGroup: integer {组播组序号});
begin
  MySendMsgChar('R', iMulticastGroup);
end;

procedure SendMsg_Stop(const iMulticastGroup: integer {组播组序号});
begin
  MySendMsgChar('E', iMulticastGroup);
end;
var
  Re: integer;
  Wsa: TWSAData;
initialization
  Re := WSAStartup($101, Wsa); //初始化Wsock32.dll,MakeWord(2,2),
  if Re <> 0 then MessageBox(0, 'WSAStartup Failed', MpgServerName, MB_ICONERROR);
finalization
  WSACleanup; //结束对WSocket32.dll调用
end.

⌨️ 快捷键说明

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