 c7b4b9f819
			
		
	
	
		c7b4b9f819
		
	
	
	
	
		
			
			git-svn-id: http://mc-server.googlecode.com/svn/trunk@6 0a769ca7-a7f5-676a-18bf-c427514a06d6
		
			
				
	
	
		
			139 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "cBlockingTCPLink.h"
 | |
| #include "packets/cPacket.h"
 | |
| #include "MCSocket.h"
 | |
| #include <string>
 | |
| 
 | |
| #include "cMCLogger.h"
 | |
| 
 | |
| #ifndef _WIN32
 | |
| #include <cstring>
 | |
| #include <errno.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef _WIN32
 | |
| #define MSG_NOSIGNAL (0)
 | |
| #endif
 | |
| #ifdef __MACH__
 | |
| #define MSG_NOSIGNAL (0)
 | |
| #endif
 | |
| 
 | |
| cBlockingTCPLink::cBlockingTCPLink()
 | |
| 	: m_Socket( 0 )
 | |
| {
 | |
| }
 | |
| 
 | |
| cBlockingTCPLink::~cBlockingTCPLink()
 | |
| {
 | |
| 	CloseSocket();
 | |
| }
 | |
| 
 | |
| void cBlockingTCPLink::CloseSocket()
 | |
| {
 | |
| 	if( m_Socket )
 | |
| 	{
 | |
| 		m_Socket.CloseSocket();
 | |
| 		m_Socket = 0;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| bool cBlockingTCPLink::Connect( const char* a_Address, unsigned int a_Port )
 | |
| {
 | |
| 	if( m_Socket )
 | |
| 	{
 | |
| 		LOGWARN("WARNING: cTCPLink Connect() called while still connected. ALWAYS disconnect before re-connecting!");
 | |
| 	}
 | |
| 
 | |
| 	struct hostent *hp;
 | |
| 	unsigned int addr;
 | |
| 	struct sockaddr_in server;
 | |
| 
 | |
| #ifdef _WIN32
 | |
| 	WSADATA wsaData;
 | |
| 	int wsaret=WSAStartup(/*0x101*/ MAKEWORD(2, 2),&wsaData);
 | |
| 
 | |
| 	if(wsaret!=0)
 | |
| 	{
 | |
| 		LOGERROR("cTCPLink: WSAStartup returned error");
 | |
| 		return false;
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| 	m_Socket=socket(AF_INET,SOCK_STREAM,0);
 | |
| #ifdef _WIN32
 | |
| 	if( m_Socket==INVALID_SOCKET )
 | |
| #else
 | |
| 	if( m_Socket < 0 )
 | |
| #endif
 | |
| 	{
 | |
| 		LOGERROR("cTCPLink: Invalid socket");
 | |
| 		m_Socket = 0;
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	addr=inet_addr( a_Address );
 | |
| 	hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
 | |
| 	if(hp==NULL)
 | |
| 	{
 | |
| 		//LOGWARN("cTCPLink: gethostbyaddr returned NULL");
 | |
| 		hp = gethostbyname( a_Address );
 | |
| 		if( hp == NULL )
 | |
| 		{
 | |
| 			LOGWARN("cTCPLink: Could not resolve %s", a_Address);
 | |
| 			CloseSocket();
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);
 | |
| 	server.sin_family=AF_INET;
 | |
| 	server.sin_port=htons( (unsigned short)a_Port );
 | |
| 	if( connect( m_Socket, (struct sockaddr*)&server, sizeof(server) ) )
 | |
| 	{
 | |
| 		LOGWARN("cTCPLink: No response from server (%i)", errno);
 | |
| 		CloseSocket();
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| int cBlockingTCPLink::Send( char* a_Data, unsigned int a_Size, int a_Flags /* = 0 */ )
 | |
| {
 | |
| 	if( !m_Socket )
 | |
| 	{
 | |
| 		LOGWARN("cBlockingTCPLink: Trying to send data without a valid connection!");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	return cPacket::SendData( m_Socket, a_Data, a_Size, a_Flags );
 | |
| }
 | |
| 
 | |
| int cBlockingTCPLink::SendMessage( const char* a_Message, int a_Flags /* = 0 */ )
 | |
| {
 | |
| 	if( !m_Socket )
 | |
| 	{
 | |
| 		LOGWARN("cBlockingTCPLink: Trying to send message without a valid connection!");
 | |
| 		return -1;
 | |
| 	}
 | |
| 	return cPacket::SendData( m_Socket, a_Message, strlen(a_Message), a_Flags );
 | |
| }
 | |
| 
 | |
| std::string cBlockingTCPLink::ReceiveData()
 | |
| {
 | |
| 	if( !m_Socket ) return "";
 | |
| 
 | |
| 	int Received = 0;
 | |
| 	char Buffer[256];
 | |
| 	std::string Data;
 | |
| 	while( (Received = recv(m_Socket, Buffer, 256, 0) ) > 0 )
 | |
| 	{
 | |
| 		//LOGINFO("Recv: %i", Received);
 | |
| 		//LOG("%s", Buffer );
 | |
| 		Data.append( Buffer, Received );
 | |
| 		memset( Buffer, 0, 256 );
 | |
| 	}
 | |
| 
 | |
| 	//LOGINFO("Received returned: %i", Received );
 | |
| 	return Data;
 | |
| }
 |