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

📄 clientsocket.cpp

📁 一个SGIP网关的程序源码.vc代码
💻 CPP
字号:
// ClientSocket.cpp: implementation of the CClientSocket class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SGIPGateWay.h"
#include "ClientSocket.h"

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

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

CClientSocket::CClientSocket()
{
	mSocket = INVALID_SOCKET;
	mstrIP = "";
	mnPort = 0;
	
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD( 2, 2 );
 
	WSAStartup( wVersionRequested, &wsaData );
}

CClientSocket::~CClientSocket()
{
	WSACleanup();
}
void CClientSocket::CloseSocket()
{
	if( mSocket == INVALID_SOCKET )
		return;
	closesocket(mSocket);
	mSocket = INVALID_SOCKET;
}
BOOL CClientSocket::ConnectServer()
{
	return ConnectServer(mstrIP, mnPort);
}
#include "childview.h"
BOOL CClientSocket::ConnectServer(LPCTSTR strServerIP, int nPort)
{
	struct sockaddr_in sockAddr;
	unsigned int addr;

	mstrIP = strServerIP;
	mnPort = nPort;

	addr = inet_addr(strServerIP);
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_port = htons(nPort);
	*(int*)&(sockAddr.sin_addr) = addr;

	if( sockAddr.sin_port == 0 )
	{
		CloseSocket();
		return FALSE;
	}

	mSocket = socket(AF_INET, SOCK_STREAM, 0);
	if( mSocket == INVALID_SOCKET )
		return FALSE;
	// 连接
	if( connect(mSocket, (struct sockaddr*)&sockAddr, sizeof(struct sockaddr)) == SOCKET_ERROR )
	{
		int nret = WSAGetLastError();
		CString str;
		str.Format("错误:%d", nret);
		if( gpView )
			gpView->ShowLockMsg((char*)(LPCTSTR)str);
		CloseSocket();
		return FALSE;
	}
	// 启动接收线程
	DWORD id;
	CreateThread(NULL, NULL, ReadDataThread, (LPVOID)this, 0, &id);
	return TRUE;
}
DWORD WINAPI CClientSocket::ReadDataThread(LPVOID lpParam)
{
	CClientSocket *pClient = (CClientSocket*)lpParam;
	int nRet;

	while(pClient->mSocket != INVALID_SOCKET)
	{
		nRet = recv(pClient->mSocket, (char *)pClient->mBuffer, sizeof(pClient->mBuffer), 0);
		if( nRet <= 0 )
		{
			nRet = WSAGetLastError();
			pClient->CloseSocket();
			pClient->OnError(nRet);
			break;
		}
		pClient->OnReceiveData(pClient->mBuffer, nRet);
	}
	return 0;
}
void CClientSocket::OnError(int nErrorCode)
{
}
int CClientSocket::Send(BYTE *lpBuffer, int nSize)
{
	int nRet = send(mSocket, (char *)lpBuffer, nSize, 0);
	if( nRet == 0 )
	{
		CloseSocket();
		OnError(-1);
	}
	if( nRet < 0 )
	{
		nRet = WSAGetLastError();
		CloseSocket();
		OnError(nRet);
	}
	return nRet;
}
int CClientSocket::OnReceiveData(BYTE *lpBuffer, int nSize)
{
	return 0;
}

BOOL CClientSocket::SetSocket(SOCKET skt)
{
	if( mSocket != INVALID_SOCKET )
		return FALSE;
	mSocket = skt;
	return TRUE;
}
SOCKET CClientSocket::GetSocket()
{
	return mSocket;
}
BOOL CClientSocket::IsConnected()
{
	if( mSocket == INVALID_SOCKET )
		return FALSE;
	return TRUE;
}

⌨️ 快捷键说明

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