📄 cscphysvr.h
字号:
#ifndef CSCPHYSVR_H#define CSCPHYSVR_H/***@author *//*eth0 Link encap:Ethernet HWaddr 00:E0:4C:4F:BC:FFinet addr:192.168.1.9 Bcast:192.168.1.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:4371 errors:0 dropped:0 overruns:0 frame:0TX packets:4951 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:100RX bytes:2819762 (2.6 Mb) TX bytes:658194 (642.7 Kb)Interrupt:5 Base address:0x7000*///route add -net 236.8.8.0 netmask 255.255.255.0 dev eth0/*Response #1 30 from FE01A8C0 server: 00 1F 00 1A 0F 00 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00Response #2 33 from FE01A8C0 server: 00 1F 00 1D 0F 00 30 07 01 00 00 4B 02 00 80 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Response #3 33 from FE01A8C0 server: 00 1F 00 1D 0F 00 30 07 01 00 00 4B 02 00 80 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Response #4 30 from FE01A8C0 server: 00 1F 00 1A 0F 00 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00Response #5 33 from FE01A8C0 server: 00 1F 00 1D 0F 00 30 07 01 00 00 4B 02 00 80 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00Response #6 33 from FE01A8C0 server: 00 1F 00 1D 0F 00 30 07 01 00 00 4B 02 00 80 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00* listen.c - An IP multicast client *///dd if=0s2.2.16 of=/dev/hdc#include "msystem.h"class CIPMulticastClient{public: CIPMulticastClient(int nPort,char * pszHostName) { m_nPort = nPort; strcpy(m_szHostName,pszHostName); } bool Init() { bool bRet = true; int loop = 1; /* 多播循环 */// int iter = 0;// int sin_len; struct sockaddr_in sin; struct hostent *server_host_name; if ((server_host_name = gethostbyname(m_szHostName)) == 0) { perror("gethostbyname"); return false; } if ((socket_descriptor = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); return false; } /* 调用bind之前,设置套接口选项启用多播IP支持*/ loop = 1; if (setsockopt(socket_descriptor,SOL_SOCKET, SO_REUSEADDR,&loop,sizeof(loop)) < 0) { perror("setsockopt:SO_REUSEADDR"); bRet = false; } else { /*bzero(&sin, sizeof(sin));*/ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(m_nPort); if(bind(socket_descriptor,(struct sockaddr *)&sin, sizeof(sin)) >= 0) { /* 在同一个主机上进行广播设置套接口, 作用是方便单个开发系统上测试多播IP广播 */ loop = 0;//1 if(setsockopt(socket_descriptor,IPPROTO_IP, IP_MULTICAST_LOOP,&loop,sizeof(loop)) >= 0) { /* 加入一个广播组。进一步告诉Linux内核, 特定的套接口即将接受广播数据*/ struct ip_mreq command; command.imr_multiaddr.s_addr = inet_addr(m_szHostName); command.imr_interface.s_addr = htonl(INADDR_ANY); if (command.imr_multiaddr.s_addr == (unsigned) -1) { perror("236.8.8.8 not a legal multicast address"); bRet = false; } else { if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP,&command, sizeof(command)) < 0) { perror("setsockopt:IP_ADD_MEMBERSHIP"); bRet = false; } } } else { perror("setsockopt:IP_MULTICAST_LOOP"); bRet = false; } } else { perror("bind"); bRet = false; } } if (!bRet) { close(socket_descriptor); socket_descriptor = 0; } return bRet; } void Destroy() { if (socket_descriptor>0) { struct ip_mreq command; command.imr_multiaddr.s_addr = inet_addr(m_szHostName); command.imr_interface.s_addr = htonl(INADDR_ANY); setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP,&command, sizeof(command)); close(socket_descriptor); } socket_descriptor = 0; } int Recv(DWORD& dwPeerIPAddr,unsigned char* pbyBuf,int nBufSize=1024) { int nRecvSize = 0; if (socket_descriptor>0) { struct sockaddr_in sin; int sin_len = sizeof(sin); if ((nRecvSize = recvfrom(socket_descriptor, pbyBuf, nBufSize, 0, (struct sockaddr *)&sin, (socklen_t *)&sin_len)) > 0) { dwPeerIPAddr = sin.sin_addr.s_addr;// printf("Response %d from %x server: ", nRecvSize,dwPeerIPAddr);// for (int iii=0; iii<nRecvSize; iii++)// printf("%02X ", (unsigned char)(pbyBuf[iii]));// printf("\n"); } } else usleep(10000); return nRecvSize; }protected: char m_szHostName[16]; int m_nPort; int socket_descriptor;};class CIPBreadcastServer{public: CIPBreadcastServer(int nPort) { m_nPort = nPort; } bool Init() { socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0); if (socket_descriptor == -1) return false; int on=1; setsockopt(socket_descriptor, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); return true; } bool Write(unsigned char* pbyBuf,int nBufSize,DWORD dwIPAddr) { bool bRet = false; if (socket_descriptor>0) { struct sockaddr_in address; memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = dwIPAddr;//inet_addr("236.8.8.8"); address.sin_port = htons(m_nPort); if (sendto(socket_descriptor, pbyBuf,nBufSize, 0,(struct sockaddr *)&address, sizeof(address)) >= 0) {/* cout << dwIPAddr<<"->{" <<nBufSize << '}'; for (int nnn=0; nnn<nBufSize; nnn++) { char c[16]; sprintf(c," %02x ",pbyBuf[nnn]); cout << c; } cout << endl;*/ bRet = true; } } return bRet; } void Destroy() { if (socket_descriptor>0) close(socket_descriptor); socket_descriptor = 0; }protected: int socket_descriptor; int m_nPort;};class CCSCPhySvr {public: CCSCPhySvr(int nPort = 1888,char * pszHostName = "236.8.8.8",int nSvrPort=1889); ~CCSCPhySvr(); int Status()//-1:Disconnect,0:Idle,1:Busy { if (m_nStatus == -1) Connect(); return m_nStatus; } bool Write(BYTE *pData,WORD wSize,DWORD dwIPAddr = 0x90909ec) { bool bRet = false; if ((Status()==0) && m_server.Write(pData,wSize,dwIPAddr)) { bRet = true; } return bRet; } bool Connect() ; void Disconnect(); bool Reset(); CDQue *GetRecvQueue(int b) { return m_pool.GetRecvQueue(b); }protected: CIPMulticastClient m_client; CIPBreadcastServer m_server; int m_nStatus; pthread_t m_hThread; CPeerPool m_pool; char *m_pszDevName; friend void *Listen(void *);};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -