📄 multisock_s.cpp
字号:
// MultiSock.cpp: implementation of the CMultiSock class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MultiSock_s.h"
//#include "MyMServerClient.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMultiSock::CMultiSock()
{
sockCM=m_sMultSock = INVALID_SOCKET;
}
CMultiSock::~CMultiSock()
{
}
int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr)
{
int opt,ret;
BOOL fFlag;
struct ip_mreq mreq;
char szOut[128];
// create socket
if((m_sMultSock=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
{
sprintf(szOut,"Create socket error code: %d.",h_errno);
ret=-1;
goto errend;
}
// reuse addr & port
opt = TRUE;
if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
(char*)&opt,sizeof(opt))==SOCKET_ERROR ){ //Set the port to reuse
sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
ret=-1;
goto errend;
}
//bind the socket
if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
sprintf(szOut,"Bind the socket error code: %d.",h_errno );
ret=-1;
goto errend;
}
//add to the multcast address
memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
memcpy(&mreq.imr_multiaddr,&m_MultAddr.sin_addr,sizeof(long));
memcpy(&mreq.imr_interface,&myAddr.sin_addr,sizeof(long));
if(setsockopt(m_sMultSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,
(char*)&mreq,sizeof(mreq))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to add multcast address error code: %d.",h_errno);
ret=-1;
goto errend;
}
opt = 1;
if (setsockopt( m_sMultSock,
IPPROTO_IP,
IP_MULTICAST_TTL,
(const char*)&opt,
sizeof(opt))==SOCKET_ERROR){
ret = WSAGetLastError();
goto errend;
}
//set the send/recv buf
opt = UDP_BUF_LEN;
if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
ret=-1;
goto errend;
}
if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
ret=-1;
goto errend;
}
return 0;
errend:
Close();
return ret;
}
int CMultiSock::SendData(LPVOID lpBuf, int iSize)
{
TRACE("ss\n");
return sendto( m_sMultSock,
(char*)lpBuf,
iSize,
0,
(const struct sockaddr*)&m_MultAddr,
sizeof(m_MultAddr));
/* return send(m_sMultSock,
(char*)lpBuf,
iSize,
0);*/
// return nll;
}
int CMultiSock::Close()
{ //struct ip_mreq mreq;
char szOut[128];
if(m_sMultSock!=INVALID_SOCKET){
// mreq.imr_multiaddr=m_MultAddr.sin_addr;
// mreq.imr_interface=myHostAddr.sin_addr;//ADDR_ANY;
if(sockCM==INVALID_SOCKET){
if(setsockopt(m_sMultSock,IPPROTO_IP,IP_DROP_MEMBERSHIP,
(char*)&m_mreq,sizeof(m_mreq))==SOCKET_ERROR){
sprintf(szOut,"Drop out the multcast addr error code:%d",h_errno);
//OutputDebugString(szOut);
}
}// sock cm
else
closesocket(sockCM);
closesocket(m_sMultSock);
}
sockCM=INVALID_SOCKET;
m_sMultSock = INVALID_SOCKET;
return 0;
}
int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr, int nTTL)
{
int opt,ret;
int nRet;
BOOL fFlag;
struct ip_mreq mreq;
char szOut[128];
// create socket
if((m_sMultSock=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
{
sprintf(szOut,"Create socket error code: %d.",h_errno);
ret=-1;
goto errend;
}
// reuse addr & port
opt = TRUE;
if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
(char*)&opt,sizeof(opt))==SOCKET_ERROR ){ //Set the port to reuse
sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
ret=-1;
goto errend;
}
//bind the socket
if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
sprintf(szOut,"Bind the socket error code: %d.",h_errno );
ret=-1;
goto errend;
}
if(connect(m_sMultSock,(struct sockaddr*)&multiAddr,sizeof(multiAddr))
==SOCKET_ERROR){
sprintf(szOut,"connect error code: %d.",h_errno );
ret=-1;
goto errend;
}
//add to the multcast address
memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
memcpy(&myHostAddr,&myAddr,sizeof(SOCKADDR_IN));
mreq.imr_multiaddr.s_addr=m_MultAddr.sin_addr.s_addr;
mreq.imr_interface.s_addr=myAddr.sin_addr.s_addr;
memcpy(&m_mreq,&mreq,sizeof(mreq));
if(setsockopt(m_sMultSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,
(char*)&mreq,sizeof(mreq))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to add multcast address error code: %d.",h_errno);
ret=-1;
goto errend;
}
opt = nTTL;
if (setsockopt( m_sMultSock,
IPPROTO_IP,
IP_MULTICAST_TTL,
(const char*)&opt,
sizeof(opt))==SOCKET_ERROR){
ret = WSAGetLastError();
goto errend;
}
//set the send/recv buf
opt = UDP_BUF_LEN;
if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
ret=-1;
goto errend;
}
if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
ret=-1;
goto errend;
}
fFlag = FALSE;
nRet = setsockopt(m_sMultSock, IPPROTO_IP,
IP_MULTICAST_LOOP, (char *)&fFlag,
sizeof(fFlag) );
if ( nRet == SOCKET_ERROR){
ret=-1;
goto errend;
}
return 0;
errend:
AfxMessageBox(szOut);
Close();
return ret;
}
int CMultiSock::Startup_(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr, int nTTL)
{ int err;
int opt,ret;
char szOut[128];
int nMCastTTL = nTTL;
unsigned long cbRet;
BOOL fReuseAddr = TRUE,bFlag;
m_sMultSock = WSASocket(AF_INET, SOCK_DGRAM, 0, (LPWSAPROTOCOL_INFO)NULL, 0,
WSA_FLAG_MULTIPOINT_C_LEAF| WSA_FLAG_MULTIPOINT_D_LEAF);
if (m_sMultSock==INVALID_SOCKET&&WSAGetLastError()==WSANOTINITIALISED)
{
ret=-1;
goto errend;
}
opt = TRUE;
if (setsockopt(m_sMultSock,SOL_SOCKET,SO_REUSEADDR,
(char*)&opt,sizeof(opt))==SOCKET_ERROR ){ //Set the port to reuse
sprintf(szOut,"Setsockopt to Reuseaddr error code: %d.",h_errno);
ret=-1;
goto errend;
}
//bind the socket
if(bind(m_sMultSock,(LPSOCKADDR)&myAddr,sizeof(myAddr))==SOCKET_ERROR){
sprintf(szOut,"Bind the socket error code: %d.",h_errno );
ret=-1;
goto errend;
}
/* set the IP TTL */
memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
err =WSAIoctl (m_sMultSock, SIO_MULTICAST_SCOPE, &nMCastTTL,
sizeof (nMCastTTL),NULL, 0, &cbRet, NULL, NULL);
if (err!=0){
err = WSAGetLastError();
ret=-1;
goto errend;
}
/* 禁止loopback,不给本机发送 */
bFlag = FALSE;
err = WSAIoctl (m_sMultSock, SIO_MULTIPOINT_LOOPBACK, &bFlag,
sizeof (bFlag), NULL, 0, &cbRet, NULL, NULL);
sockCM = WSAJoinLeaf(m_sMultSock,(PSOCKADDR)&multiAddr,
sizeof(multiAddr),NULL,NULL,NULL,NULL,JL_BOTH);
if (sockCM==INVALID_SOCKET){
err = WSAGetLastError();
ret=-1;
AfxMessageBox("socket error");
goto errend;
}
opt = UDP_BUF_LEN;
if(setsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set send buffer error code: %d.",h_errno);
ret=-1;
goto errend;
}
if( setsockopt(m_sMultSock,SOL_SOCKET,SO_RCVBUF,(char*)&opt,sizeof(opt))==SOCKET_ERROR){
sprintf(szOut,"Setsockopt to set recv buffer error code: %d ",h_errno);
ret=-1;
goto errend;
}
return 0;
errend:
closesocket(m_sMultSock);
return ret;
return err;
}
int CMultiSock::Startup(char *strMultiIP, DWORD dwMultiPort, char *strLocalIP, DWORD dwLocalPort, int nTTL)
{ SOCKADDR_IN m_HostAddr, multiAddr;
m_HostAddr.sin_family=multiAddr.sin_family=AF_INET;
if(strlen(strLocalIP)==0)
m_HostAddr.sin_addr.s_addr=INADDR_ANY;
else
m_HostAddr.sin_addr.s_addr=inet_addr(strLocalIP);
//m_HostAddr.sin_addr.s_addr=INADDR_ANY;
multiAddr.sin_addr.s_addr=inet_addr(strMultiIP);
multiAddr.sin_port=dwMultiPort;
m_HostAddr.sin_port=dwLocalPort;
return Startup(m_HostAddr,multiAddr,nTTL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -