📄 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()
{
WSADATA wsaData;
char szOut[128];
if(WSAStartup(0x0202,&wsaData)!=0)
// if(WSAStartup(0x0200,&wsaData)!=0)
// if(WSAStartup(0x0100,&wsaData)!=0)
{
sprintf(szOut,"WSAStartup Error Code :%d",h_errno);
MessageBox(NULL,"wsastartup error","",MB_OK);
}
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;
}
//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;
}
/* if (connect(m_sMultSock,(const struct sockaddr*)&m_MultAddr,sizeof(m_MultAddr))==SOCKET_ERROR){
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::Close()
{ struct ip_mreq mreq;
char szOut[128];
if(m_sMultSock!=INVALID_SOCKET){
mreq.imr_multiaddr=m_MultAddr.sin_addr;
mreq.imr_interface.s_addr=ADDR_ANY;
if(setsockopt(m_sMultSock,IPPROTO_IP,IP_DROP_MEMBERSHIP,
(char*)&mreq,sizeof(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 nlen=0;
return recvfrom(m_sMultSock,(char *)lpBuf,
iSize,0,NULL,NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -