📄 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::SendData(LPVOID lpBuf, int iSize)
{
// TRACE("ss\n");
WSABUF stWSABuf;
DWORD cbRet;
if(!m_bisConnected){
stWSABuf.buf = (char*)lpBuf;
stWSABuf.len = iSize;
int nRet = WSASendTo (m_sMultSock, &stWSABuf, 1, &cbRet, 0,
(struct sockaddr*)&m_MultAddr, sizeof(struct sockaddr),
NULL, NULL);
if(nRet==SOCKET_ERROR) return -1;
else return cbRet;
/*return sendto( m_sMultSock,
(char*)lpBuf,
iSize,
0,
(const struct sockaddr*)&m_MultAddr,
sizeof(m_MultAddr)); */
}
else
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;
}
m_bisConnected=true;
//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(g_bIsAddMember){
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);
AfxMessageBox(szOut);
ret=-1;
goto errend;
}
// AfxMessageBox("add member");
}
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
if(g_nSndBuf>=0){
opt = g_nSndBuf*1024;
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;
}
/* opt = g_nSndBuf*1024;
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;
}*/
} // end set buffer
// get snd buffer
opt=sizeof(int);
if(getsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,
(char*)&g_nGetSndBuf,&opt)==SOCKET_ERROR){
sprintf(szOut,"getsockopt to set send buffer error code: %d.",h_errno);
ret=-1;
goto errend;
}
fFlag = g_bIsLoopBack;
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,nRet;
int opt,ret;
char szOut[128];
int nMCastTTL = nTTL;
unsigned long cbRet;
BOOL fReuseAddr = TRUE,bFlag;
m_sMultSock = WSASocket(AF_INET, SOCK_DGRAM, 0,NULL, 0,
WSA_FLAG_MULTIPOINT_C_LEAF|
WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);
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;
}
m_bisConnected=false;
/* set the IP TTL */
memcpy(&m_MultAddr,&multiAddr,sizeof(SOCKADDR_IN));
err =WSAIoctl (m_sMultSock, SIO_MULTICAST_SCOPE, &nMCastTTL,
sizeof (int),NULL, 0, &cbRet, NULL, NULL);
if (err!=0){
err = WSAGetLastError();
ret=-1;
goto errend;
}
/* 禁止loopback,不给本机发送 */
bFlag =g_bIsLoopBack;
nRet = WSAIoctl (m_sMultSock, SIO_MULTIPOINT_LOOPBACK, &bFlag, sizeof (bFlag),
NULL, 0, &cbRet, NULL, NULL);
if(g_bIsAddMember){
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;
}
// AfxMessageBox("was jion");
}
if(g_nSndBuf>=0){
opt = g_nSndBuf*1024;;
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;
}*/
}// end set buffer
opt=sizeof(int);
if(getsockopt(m_sMultSock,SOL_SOCKET,SO_SNDBUF,
(char*)&g_nGetSndBuf,&opt)==SOCKET_ERROR){
sprintf(szOut,"getsockopt to set send buffer error code: %d.",h_errno);
ret=-1;
goto errend;
}
return 0;
errend:
closesocket(m_sMultSock);
return ret;
}
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(strcmp(strLocalIP,"127.0.0.1")==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);
//m_HostAddr.sin_addr.s_addr=INADDR_ANY;
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 + -