📄 multsock.cpp
字号:
// MultiSock.cpp: implementation of the CMultiSock class.
//
//////////////////////////////////////////////////////////////////////
#include "Winsock2.h"
#include <ws2tcpip.h>
#include "MultSock.h"
//#include "myMserverClient.h"
#include "stdio.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMultiSock::CMultiSock()
{
m_sMultSock = INVALID_SOCKET;
}
CMultiSock::~CMultiSock()
{
Close();
// WSACleanup();
}
int CMultiSock::Startup(SOCKADDR_IN myAddr, SOCKADDR_IN multiAddr)
{
int opt,ret;
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;
}
//set the send/recv buf
opt = 128*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;
}
return 0;
errend:
Close();
return ret;
}
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;
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);
}
closesocket(m_sMultSock);
}
m_sMultSock = INVALID_SOCKET;
return 0;
}
int CMultiSock::RecvData(LPVOID lpBuf, int iSize)
{ /* int nAddrLen;
struct sockaddr_in fromAddr;
nAddrLen = sizeof(fromAddr);*/
return recv(m_sMultSock,(char *)lpBuf,
iSize,0);
/*return recvfrom(m_sMultSock,(char *)lpBuf,
iSize,0,NULL,NULL);
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -