⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysocket.cpp

📁 一个局域网内语音会议的代码。此代码使用网络的广播地址实现所有客户端语音的聚合。
💻 CPP
字号:
// mysocket.cpp: implementation of the mysocket class.
//
//////////////////////////////////////////////////////////////////////
#include<afxwin.h>
#include<afxsock.h>
#include "mysocket.h"
#include"Display.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

mysocket::mysocket()
{
	log.Open("socket.txt",CFile::modeCreate | CFile::modeWrite);
	closeflag=0;
	name="";
}




void mysocket::setparent(CDialog *dialog)
{
dlg=dialog;
closeflag=0;
}

//////////////////////////////////////////////
//
// Create Sending and receiving socket using Multicast group address
// and port..
//

BOOL mysocket::createSocket(char gaddr[],int gport)
{
int ttl=8;  //any arbitrary value greater than 1 
char str[200];
	
sprintf(str,"\n Creating socket... %s   ,  port= %d ",gaddr,gport);
log.WriteString(str);


//Create Receiver socket
	if(!Create(gport,SOCK_DGRAM, FD_READ) )
	{
		
		sprintf(str,"\nError %d ",GetLastError());
		log.WriteString("\n JOIN : Create failed");
		log.WriteString(str);
		
		AfxMessageBox("Join:: Create failed");
		
		return FALSE;
	}

	
	BOOL bMultipleApps = TRUE;		/* allow reuse of local port if needed */
	SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(BOOL), SOL_SOCKET);

    
	log.WriteString("\n Receiving socket create successfully");

	/* Join the multicast group */
	mreq.imr_multiaddr.s_addr = inet_addr(gaddr);	/* group addr */ 
	mreq.imr_interface.s_addr = htons(INADDR_ANY);		/* use default */ 


	if(setsockopt(m_hSocket,IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&mreq,sizeof(mreq))!=0 )
	{
	
		sprintf(str,"got error %d",WSAGetLastError());
		log.WriteString(str);
		
		log.WriteString("\n JOIN :Adding member failed");
		AfxMessageBox("Join:: Adding member failed");
		return FALSE;
	}

//Prepare for sending     
	//Create sending hostgroup
	memset(&hgroup, 0, sizeof(hgroup));
	hgroup.sin_family = AF_INET;
	hgroup.sin_addr.s_addr = inet_addr(gaddr);
	hgroup.sin_port = htons((USHORT)gport);

	if(!send.Create(0, SOCK_DGRAM, 0 ) )		// Create an connectionless UDP socket
	{
		AfxMessageBox("Join :: Creation of sending socket failed");
		return FALSE;
	}
	
	GetSockName(myaddr,myport);

	sprintf(str,"\n Created from address %s  %d",(LPCTSTR)myaddr,myport);
	log.WriteString(str);

	
	if(!setTTL(ttl))								// Set Time to Live as specified by user
	{
		AfxMessageBox("Joing :: Error Setting TTL");
		return FALSE;

	}
	
	//setLoopBack(lback);							// Enable/Disable Loopback
	return TRUE;
}

//////////////////////////////////////////////
//
//  Set the TTL value for multicast packet...
//

BOOL mysocket::setTTL(int ttl)
{
	BOOL lback=TRUE;

	/* Set Time to Live to parameter TTL */
	if(send.SetSockOpt(IP_MULTICAST_TTL, &ttl, sizeof(int), IPPROTO_IP) == 0)
		return FALSE;		/* Error Setting TTL */
	
	return TRUE;
}



//
// This function will be invoked when the client receives message
// from remote socket
// Display class's receive function will process the message

void mysocket::OnReceive(int errcode)
{

	if(errcode==0)
	((Display*)dlg)->Receive();


	CAsyncSocket::OnReceive(errcode);
}


////////////////////////////////////////
//
// If group is closed then close the application
//

void mysocket::OnClose(int errcode)
{
	closeflag=1;
	log.Close();
	((Display*)dlg)->OnCancel();
	
}

//Not used......
void mysocket::sendMesg(char *mesg,int len)
{
 


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -