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

📄 cstreamsocket.cpp

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

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

#include "stdafx.h"
#include "CStreamSocket.h"

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

//////////////////////////////////////////////////////////////////////////////
CStreamSocket::CStreamSocket()
{
	mSocket      = INVALID_SOCKET;
	mIsConnected = FALSE;

	mIsReceiving = FALSE;
	mIsSending   = FALSE;
	mRcvThread   = NULL;
	mSndThread   = NULL;
}

CStreamSocket::~CStreamSocket()
{
	Detach();
	StopSending();
	StopReceiving();
}

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

	mSocket      = inSocket;
	mIsConnected = TRUE;
	return TRUE;
}

void CStreamSocket::Detach(void)
{
	if (mSocket != INVALID_SOCKET)
	{
		closesocket(mSocket);
		mSocket = INVALID_SOCKET;
		mIsConnected = FALSE;
	}
}

BOOL CStreamSocket::ConnectTo(const char * inTarget, WORD inPort)
{
	return ConnectTo(ntohl(inet_addr(inTarget)), inPort);
}

BOOL CStreamSocket::ConnectTo(long inTarget, WORD inPort)
{
//	if (mIsConnected)
//	{
//		return TRUE;
//	}
	Detach();

	mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (mSocket != INVALID_SOCKET)
	{
		BOOL sopt = TRUE;
		setsockopt(mSocket, IPPROTO_TCP, TCP_NODELAY, 
			(char *)&sopt, sizeof(BOOL));
		setsockopt(mSocket, SOL_SOCKET, SO_DONTLINGER, 
			(char *)&sopt, sizeof(BOOL));

		SOCKADDR_IN   saddr;
		memset(&saddr, 0, sizeof(SOCKADDR_IN));
		saddr.sin_addr.S_un.S_addr = htonl(inTarget);
		saddr.sin_family           = AF_INET;
		saddr.sin_port             = htons((WORD)inPort);
		if (connect(mSocket, (SOCKADDR *)&saddr, sizeof(SOCKADDR_IN)) != 0) 
		{
			Detach();
			return FALSE;
		}
		mIsConnected = TRUE;
		return TRUE;
	}
	return FALSE;
}

BOOL CStreamSocket::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 CStreamSocket::StopReceiving(void)
{
	if (mIsReceiving)
	{
	//	Detach();
		mIsReceiving = FALSE;
		if (mRcvThread != NULL) 
		{
            WaitForSingleObject(mRcvThread, INFINITE);
			mRcvThread = NULL;
		}
	}
}

BOOL CStreamSocket::StartSending(void)
{
	if (mSocket != INVALID_SOCKET)
	{
		if (mIsSending)
		{
			return TRUE;
		}

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

void CStreamSocket::StopSending(void)
{
	if (mIsSending)
	{
	//	Detach();
		mIsSending = FALSE;
		if (mSndThread != NULL) 
		{
            WaitForSingleObject(mSndThread, INFINITE);
			mSndThread = NULL;
		}
	}
}

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

DWORD WINAPI CStreamSocket::SendingThrd(void * pParam)
{
	CStreamSocket * pSock = (CStreamSocket *) pParam;
	if (pSock)
	{
		pSock->mIsSending = TRUE;
		pSock->SendingLoop();
		return 1;
	}	
	return 0;
}

void CStreamSocket::ReceivingLoop(void)
{
}

void CStreamSocket::SendingLoop(void)
{
}

⌨️ 快捷键说明

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