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

📄 cstreamsocket2.cpp

📁 最近在学习directshow, Directshow实务精选的源代码
💻 CPP
字号:
// 
// CStreamSocket2.cpp
// 

/*-----------------------------------------------------*\
			HQ Tech, Make Technology Easy!       
 More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/

#include <streams.h>
#include "CStreamSocket2.h"
#include "CMediaController.h"
#include "defines.h"

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

//////////////////////////////////////////////////////////////////////////////
CStreamSocket2::CStreamSocket2()
{
	mSocket      = INVALID_SOCKET;
	mIsReceiving = FALSE;
	mRcvThread   = NULL;
	mController  = NULL;
}

CStreamSocket2::~CStreamSocket2()
{
	Detach();
	StopReceiving();
}

void CStreamSocket2::SetController(CMediaController * inController)
{
	mController = inController;
}

BOOL CStreamSocket2::Attach(SOCKET inSocket)
{
	if (mSocket != INVALID_SOCKET)
	{
		return FALSE;
	}

	mSocket = inSocket;
	return TRUE;
}

void CStreamSocket2::Detach(void)
{
	if (mSocket != INVALID_SOCKET)
	{
		closesocket(mSocket);
		mSocket = INVALID_SOCKET;
	}
}

BOOL CStreamSocket2::StartReceiving(void)
{
	if (mSocket != INVALID_SOCKET)
	{
		if (mIsReceiving)
		{
			return TRUE;
		}

		DWORD threadID = 0;
		mRcvThread = CreateThread(NULL, 0, ReceivingThrd, 
			this, 0, &threadID);
		return (mRcvThread != NULL);
	}
	return FALSE;
}

void CStreamSocket2::StopReceiving(void)
{
	if (mIsReceiving)
	{
		mIsReceiving = FALSE;
		Detach();
		
		if (mRcvThread != NULL) 
		{
            WaitForSingleObject(mRcvThread, INFINITE);
			mRcvThread = NULL;
		}
	}
}

DWORD WINAPI CStreamSocket2::ReceivingThrd(void * pParam)
{
	CStreamSocket2 * pSock = (CStreamSocket2 *) pParam;
	if (pSock)
	{
		pSock->mIsReceiving = TRUE;
		pSock->ReceivingLoop();
		return 1;
	}	
	return 0;
}

// Main work here!
void CStreamSocket2::ReceivingLoop(void)
{
	char   buf[PACK_SIZE];
	int    toread = PACK_SIZE;
	int    bytes  = 0;

	while (mIsReceiving)
	{
		bytes = recv(mSocket, buf, toread, 0);
		if (bytes == 0)
		{
		//	TRACE("socket closed\n");
			mIsReceiving = FALSE;
			break;
		}
		else if (bytes == SOCKET_ERROR)
		{
		//	TRACE("recv socket error, code:%d\n", WSAGetLastError());
			mIsReceiving = FALSE;
			break;
		}

		mIsReceiving = mController->AddData(buf, bytes);
	}

	mController->EndOfStream();
}

⌨️ 快捷键说明

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