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

📄 dsocket.cpp

📁 windows下实现的FFT算法的实现
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////////
//    File description : 
//    Name    : DSocket.cpp
//    Details : Datagram Socket for communication
//		 ***  Control Packet Format ***
//		 Type				: 1 byte
//		 Length of hostname : 1 byte
//		 Hostname			: <var>
//
//		 ***  Text packet format ***
//       Type               : 1 byte
//		 Length of hostname	: 1 byte
//		 Hostname           : < var>
//       Length of message  : 2 byte
//		 Message            : <var>
//
//		 ***  Audio packet format ***
//       Type				  : 1 byte
//		 Length of hostname	  : 1 byte
//		 Hostname             : < var>
//       size of audio data   : 2 byte
//		 Audio data           : <var>
//	
//		 ***  Video packet format ***
//       Type                 : 1 byte
//		 Length of hostname	  : 1 byte
//		 Hostname             : < var>
//       size of video data   : 2 byte
//		 Video data           : <var>
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DSocket.h"
#include "AudioTestDlg.h"
#include "AudioTest.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DSocket::DSocket()
{
	m_dlen=0;
	m_data = new char[80257];
	Temp = new char[256];
	if(!m_data) AfxMessageBox("DSocket::DSocket 分配缓冲失败");
	else m_dlen=80257;
	remoteaddress="192.168.0.211";
}

DSocket::~DSocket()
{
	if(m_data)	delete []m_data;
	m_dlen=0;
}

BOOL DSocket::CreateSocket(int port,int dtype)
{
	type=dtype;
	localname="Currahee";
	rmtport=port;
	return Create(port,SOCK_DGRAM);
}

void DSocket::SetParent(CDialog *dlg)
{
	pDlg=dlg;
}

void DSocket::OnReceive(int errcode)
{
	CString address,tmp;
	BOOL	ret=TRUE;
//	char hname[512],str[1024],mesg[512];
	unsigned int port=0,retvalue=SOCKET_ERROR;
	int n=0,len=0;
	int ulen=0;
	retvalue= ReceiveFrom(m_data,m_dlen,address,port);

	if((retvalue==SOCKET_ERROR)||(m_data=="")||(!m_data))
	{
		return;
	}

	type=m_data[0];

	if (type==TYPE_ENERGY)
	{
		rmtport=port;
		if (( (CAudioTestDlg*) pDlg )->m_LocalJudge!=1) return;

		int NameLength=m_data[1];
		int UserinList=m_data[2]-'A';
		double Energy;
		CopyMemory(&Energy,m_data+m_data[1]+2,8);
		for (int i=Prelude-1;i>0;i--)
			( (CAudioTestDlg*) pDlg )->m_WeightValue[UserinList][i]=( (CAudioTestDlg*) pDlg )->m_WeightValue[UserinList][i-1];
		( (CAudioTestDlg*) pDlg )->m_WeightValue[UserinList][0]=Energy;
		( (CAudioTestDlg*) pDlg )->m_TotalValue[UserinList]=0;
		for (i=Prelude-1;i>=0;i--)
			( (CAudioTestDlg*) pDlg )->m_TotalValue[UserinList]+=( (CAudioTestDlg*) pDlg )->m_WeightValue[UserinList][i]*( (CAudioTestDlg*) pDlg )->m_Coefficient[i];
		( (CAudioTestDlg*) pDlg )->CheckTop();
	}
}

BOOL DSocket::SendControlMessage(int type,char *address)
{
	unsigned int n;
	BOOL	ret;
	m_data[0]=TYPE_CONTROL;
	m_data[1]=type;				

	// Length of hostname
	n=strlen(localname);
	m_data[2]=n;
	
	// Name of the sender host

	memcpy(&m_data[3],localname,n);
/*
	TRACE("DSocket::SendControlMessage ");
	switch(type)
	{
	case MESG_CONNECT:
		TRACE("MESG_CONNECT");
		break;
	case MESG_DISCONNECT:
		TRACE("MESG_DISCONNECT");
		break;
	case MESG_ACCEPT:
		TRACE("MESG_ACCEPT");
		break;
	case MESG_REJECT:
		TRACE("MESG_REJECT");
		break;
	default:
		TRACE("MESG_UNKNOWN");
		break;
	}
*/
//	SendTo(data,n+2,PORT_CONTROL,address);
	ret=SendTo(m_data,n+3,rmtport,address);

	return (ret!=SOCKET_ERROR);
}

void DSocket::SendAudioData(unsigned char *data,int length)
{
//	TRACE("DSocket::SendAudioData %d Bytes\n",length);
//	SendTo(data,length,PORT_AUDIO,remoteaddress);
//	if(strlen(remoteaddress)<=1)
//	{
	//	CopyMemory(remoteaddress,((CAudioTestDlg *)pDlg)->dcontrol .remoteaddress,sizeof(remoteaddress));
	//	CopyMemory(remotename,((CAudioTestDlg *)pDlg)->dcontrol .remotename,sizeof(remotename));
//	}
	*(data-1)=TYPE_AUDIO;
	SendTo(data-1,length+1,rmtport,remoteaddress);
}

void DSocket::SendVideoData(unsigned char *data,int length)
{
//	SendTo(data,length,PORT_VIDEO,remoteaddress);
//	if(strlen(remoteaddress)<=1)
//	{
//		CopyMemory(remoteaddress,((CGraghDialogDlg *)pDlg)->dcontrol .remoteaddress,sizeof(remoteaddress));
//		CopyMemory(remotename,((CGraghDialogDlg *)pDlg)->dcontrol .remotename,sizeof(remotename));
//	}
	*(data-1)=TYPE_VIDEO;
	SendTo(data-1,length+1,rmtport,remoteaddress);
//	TRACE("DSocket::SendVideoData %s %d Bytes\n",remoteaddress,length);
}

void DSocket::SendEnergyData(double Energy)
{
//	char* Temp=new char[256];
	ZeroMemory(Temp, 256);
	Temp[0]=TYPE_ENERGY;
	Temp[1]=((CAudioTestDlg *)pDlg)->m_UserName.GetLength();
	CopyMemory(Temp+2,((CAudioTestDlg *)pDlg)->m_UserName,((CAudioTestDlg *)pDlg)->m_UserName.GetLength());
	CopyMemory(Temp+Temp[1]+2,&Energy,8);
	Temp[Temp[1]+10]='\0';
	SendTo(Temp,Temp[1]+10,rmtport,remoteaddress);
}

void DSocket::CloseSocket()
{
	DSocket::Close();
}

⌨️ 快捷键说明

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