|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UDP<EFBFBD>鲥<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
ʹ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>windows<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
|
|
|
|
|
VS2008 VS2010 VS2013
|
|
|
|
|
|
|
|
|
|
Ӧ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
CMulticastSocket m_multiSocket;
|
|
|
|
|
|
|
|
|
|
2. <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ִ<EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>2 <EFBFBD><EFBFBD> 3 <EFBFBD><EFBFBD>4
|
|
|
|
|
|
|
|
|
|
3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m_multiSocket.SetCallBack();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4. ͨ<EFBFBD><EFBFBD><EFBFBD>鲥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
m_Serial.SendTo(buffer,10); // <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
5. <EFBFBD>뿪<EFBFBD>鲥<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>Դ
|
|
|
|
|
m_Serial.LeaveGroup();
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>á<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD>⼰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
......
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ļ<EFBFBD>¼:
|
|
|
|
|
<EFBFBD>汾 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ע
|
|
|
|
|
V1.0 2016/12/28 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ԭ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>ע<EFBFBD><EFBFBD>
|
|
|
|
|
----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
#if !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)
|
|
|
|
|
#define AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_
|
|
|
|
|
|
|
|
|
|
#if _MSC_VER >= 1000
|
|
|
|
|
#pragma once
|
|
|
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
|
|
|
|
|
|
#include <afxsock.h>
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>ջص<D5BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|
|
|
|
typedef void ( CALLBACK *RevNetDataCALLBACK )(const void* buffer, int length);
|
|
|
|
|
|
|
|
|
|
class CMulticastSocket : public CAsyncSocket
|
|
|
|
|
{
|
|
|
|
|
// Operations
|
|
|
|
|
public:
|
|
|
|
|
CMulticastSocket();
|
|
|
|
|
virtual ~CMulticastSocket();
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
/* <20><>1<EFBFBD><31>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UDP<EFBFBD>鲥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
DataCallBack<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void SetCallBack( RevNetDataCALLBACK DataCallBack)
|
|
|
|
|
{
|
|
|
|
|
m_RevData = DataCallBack;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>2<EFBFBD><32>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
1. strGroupIP<EFBFBD><EFBFBD><EFBFBD>鲥IP
|
|
|
|
|
2. nGroupPort<EFBFBD><EFBFBD><EFBFBD>鲥<EFBFBD>˿ں<EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>True, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>False
|
|
|
|
|
*/
|
|
|
|
|
BOOL CreateReceivingSocket(LPCTSTR strGroupIP, UINT nGroupPort);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>3<EFBFBD><33>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
1. nTTL<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Time to Live<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
2. bLoopBack<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>True, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>False
|
|
|
|
|
*/
|
|
|
|
|
BOOL CreateSendingSocket(UINT nTTL = 5, BOOL bLoopBack = FALSE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>4<EFBFBD><34>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
1. strMessage<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|
|
|
|
2. nSize<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD><EFBFBD><EFBFBD>ͳɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>True, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>False
|
|
|
|
|
*/
|
|
|
|
|
BOOL SendTo(const void* strMessage, int nSize);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>5<EFBFBD><35>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 + <EFBFBD><EFBFBD><EFBFBD><EFBFBD>3
|
|
|
|
|
*/
|
|
|
|
|
BOOL JoinGroup(CString GroupIP, UINT nGroupPort, UINT nTTL = 5, BOOL bLoopback = FALSE);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>6<EFBFBD><36>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD>˳<EFBFBD><EFBFBD>鲥
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:<EFBFBD>˳<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>True, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>False
|
|
|
|
|
*/
|
|
|
|
|
BOOL LeaveGroup();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
RevNetDataCALLBACK m_RevData;
|
|
|
|
|
char m_strBuffer[10240]; // Receiving buffer for the packet that has arrived
|
|
|
|
|
SOCKADDR_IN m_saHostGroup; // SOCKADDR structure to hold IP/Port of the Host group to send data to it
|
|
|
|
|
ip_mreq m_mrMReq; // Contains IP and interface of the host group
|
|
|
|
|
UINT m_nSendersPort; // Holds Port No. of the socket from which last packet was received
|
|
|
|
|
CString m_strSendersIP; // Hold IP of the socket from which the last packet was received
|
|
|
|
|
UINT m_nLocalPort; // Ephemeral port number of the sending port
|
|
|
|
|
CString m_strLocalIP; // IP Address of the local host or your machine
|
|
|
|
|
BOOL bForceNoLoopback; // If interface does not support lopback and the service is required, the bool is set to true
|
|
|
|
|
CAsyncSocket m_SendSocket; // Socket for sending data to the host group
|
|
|
|
|
private:
|
|
|
|
|
void SetLoopBack(BOOL);
|
|
|
|
|
BOOL SetTTL(UINT nTTL);
|
|
|
|
|
protected:
|
|
|
|
|
virtual void OnReceive(int nErrorCode);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)
|