📄 sendmsgsock.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 + -