?? 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 + -