www.pudn.com > QQ2004_Source_0.01.rar > QQSocket.cpp


// ServerSocket.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "QQSocket.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CQQSocket 
CQQSocket::CQQSocket() 
{ 
} 
 
CString CQQSocket::IPAddrToString(const sockaddr_in &addr) 
{ 
	CString result; 
	result.Format("%d.%d.%d.%d", addr.sin_addr.S_un.S_un_b.s_b1, 
								 addr.sin_addr.S_un.S_un_b.s_b2, 
								 addr.sin_addr.S_un.S_un_b.s_b3, 
								 addr.sin_addr.S_un.S_un_b.s_b4); 
	return result; 
} 
 
HRESULT CQQSocket::stringToIPAddr(LPCTSTR serverAddr, sockaddr_in &addr) 
{ 
	_ASSERTE(serverAddr != NULL); 
	if (serverAddr == NULL) 
		return E_INVALIDARG; 
 
	CString addrString = serverAddr; 
	int pos = 0; 
	 
	int S_addr_b[4] = {0, 0, 0, 0}; 
	for(int i = 0; i < 4; i++) 
	{ 
		int oldPos = pos; 
		pos = addrString.Find(_T('.'), pos); 
		if (pos == -1) 
		{ 
			if (i < 3) 
				return E_FAIL; 
			else 
				pos = addrString.GetLength(); 
		} 
 
		CString field = addrString.Mid(oldPos, pos - oldPos); 
		S_addr_b[i] = _ttoi(field); 
		pos++; 
	} 
	::ZeroMemory(&addr, sizeof(sockaddr_in)); 
 
	addr.sin_addr.S_un.S_un_b.s_b1 = (BYTE)S_addr_b[0]; 
	addr.sin_addr.S_un.S_un_b.s_b2 = (BYTE)S_addr_b[1]; 
	addr.sin_addr.S_un.S_un_b.s_b3 = (BYTE)S_addr_b[2]; 
	addr.sin_addr.S_un.S_un_b.s_b4 = (BYTE)S_addr_b[3]; 
 
	addr.sin_family = AF_INET; 
	 
	return S_OK; 
} 
 
CQQSocket::~CQQSocket() 
{ 
} 
 
 
// Do not edit the following lines, which are needed by ClassWizard. 
/*BEGIN_MESSAGE_MAP(CQQSocket, CSocket) 
	//{{AFX_MSG_MAP(CQQSocket) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP()*/ 
 
///////////////////////////////////////////////////////////////////////////// 
// CQQSocket member functions 
BOOL CQQSocket::create(short port) 
{ 
	return CSocket::Create(port, SOCK_DGRAM); 
} 
 
HRESULT CQQSocket::sendToHost(SOCKADDR *addrHost, BYTE *buffer, INT_PTR bufferSize) 
{ 
	_ASSERTE(addrHost != NULL && buffer != NULL); 
	if (addrHost == NULL || buffer == NULL) 
		return E_INVALIDARG; 
 
	int res = SendTo(buffer, 
			         bufferSize, 
			         addrHost, 
			         sizeof(sockaddr_in)); 
 
	if(res == SOCKET_ERROR) 
	{ 
		int error = WSAGetLastError(); 
		TRACE("ERROR: Failed to send the data to the host (%d).\n", error); 
		return E_FAIL; 
	} 
 
	return S_OK; 
} 
 
BOOL CQQSocket::receive(void) 
{ 
	DWORD dataInBuffer = 0; 
	BOOL ret = CAsyncSocket::IOCtl(FIONREAD, &dataInBuffer); 
	if (ret != TRUE) 
	{ 
		DWORD error = GetLastError(); 
		TRACE("IOCtl() failed (%d)\n", error); 
		return FALSE; 
	} 
 
	if( dataInBuffer == 0 ) 
		return FALSE ; 
 
	_receivedIn.RemoveAll(); 
	_receivedIn.SetSize(dataInBuffer); 
	BYTE *receiveBuffer = _receivedIn.GetData(); 
	_ASSERTE(receiveBuffer != NULL); 
	if (receiveBuffer == NULL) 
		return E_UNEXPECTED; 
 
	int addrLen = sizeof(sockaddr_in); 
	::ZeroMemory(&_addrFrom, addrLen); 
	int actualReceived = ReceiveFrom(receiveBuffer, 
									dataInBuffer, 
									(SOCKADDR*)&_addrFrom, 
									&addrLen); 
	if (actualReceived == SOCKET_ERROR) 
	{ 
		DWORD error = GetLastError(); 
		TRACE("Failed to receive the response (%d).\n", error); 
		return FALSE ; 
	} 
 
/* 
	TRACE("MESSAGE: Received %d bytes from %3d.%3d.%3d.%3d\n", actualReceived, 
																_addrFrom.sin_addr.S_un.S_un_b.s_b1, 
																_addrFrom.sin_addr.S_un.S_un_b.s_b2, 
																_addrFrom.sin_addr.S_un.S_un_b.s_b3, 
																_addrFrom.sin_addr.S_un.S_un_b.s_b4); 
*/ 
 
	return TRUE; 
}