📄 cstreamsocket.cpp
字号:
//
// CStreamSocket.cpp
//
/*-----------------------------------------------------*\
HQ Tech, Make Technology Easy!
More information, please go to http://hqtech.nease.net.
/*-----------------------------------------------------*/
#include "stdafx.h"
#include "CStreamSocket.h"
#include "UNetwork.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)
{
if (mIsConnected)
{
return TRUE;
}
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 = inet_addr(inTarget);
saddr.sin_family = AF_INET;
saddr.sin_port = htons((WORD)inPort);
if (connect(mSocket, (SOCKADDR *)&saddr, sizeof(SOCKADDR_IN)) != 0)
{
#ifdef _DEBUG
UNetwork::DumpSocketError();
#endif
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();
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();
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 + -