[ENet-discuss] sorry for the post...
    Eduardo Del Balso 
    e_delbalso at hotmail.com
       
    Thu Mar 24 22:31:03 PST 2005
    
    
  
Hey guys,
I hate to post a "Please help me" email to a discussion list, but I'm really 
at my wit's end. I'm wrapping the enet library into a class so that it'll 
fit within the architecture of my program, but the functionality is off, and 
I just can't figure out why.
If anybody has the heart to read through this, I can't see what I've done 
wrong. What happens is when I launch this as the server, it just polls for 
packets (using enet_host_service()). I then launch another instance as the 
client, which tries to connect. Now what happens is that the connect from 
the client receives the connect event as a reply from the server, but the 
server never generates the local CONNECT event, so my server loop doesn't 
detect a connected client, which is bad. I can't figure out why my 
enet_host_service( ... ) doesn't read the connect event on the server side.
I will paste my code below. It's really simple, I stripped it to the bare 
bones to try and find the problem. PLEASE, if anybody has any 
advice/remarks, throw me a bone, I'm at my wit's end.
Thanks!
here is my main():
#include "NetworkEngine.h"
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
int main()
{
	char Input;
	cout << "s or c? ";
	cin >> Input;
	CNetworkEngine::Instance()->init( (Input=='s'?NE_SERVER:NE_CLIENT) );
	switch( Input )
	{
	case 'c':
		CNetworkEngine::Instance()->connect( "127.0.0.1" );
		break;
	case 's':
		while( true )
		{
			CNetworkEngine::Instance()->receive();
		}
		break;
	default:
		break;
	};
	CNetworkEngine::Instance()->shutdown();
	return 0;
}
**********************
here is my NetworkEngine.h
#pragma once
#include "singleton.h"
#include "enet.h"
enum NEError
{
	NE_SUCCESS,
	NE_ERROR
};
enum NEType
{
	NE_CLIENT,
	NE_SERVER
};
#define NE_SERVER_PORT 1234;
class CNetworkEngine  : public CSingleton<CNetworkEngine>
{
    friend CSingleton<CNetworkEngine>;
public:
	CNetworkEngine(void);
	~CNetworkEngine(void);
	NEError init( NEType );
	NEError shutdown();
	NEError connect( char * );
	NEError disconnect();
	NEError receive();
private:
	bool m_initialized;
	bool m_hostCreated;
	bool m_isConnectedToServer;
	NEType m_type;
	ENetHost * m_client;
	ENetHost * m_server;
    ENetPeer *m_peer;
};
****************************
here is my NetworkEngine.cpp
#include ".\networkengine.h"
#include "enet.h"
#include <iostream>
using std::cout;
using std::endl;
CNetworkEngine::CNetworkEngine(void)
{
	m_initialized = false;
	m_hostCreated = false;
	m_isConnectedToServer = false;
}
CNetworkEngine::~CNetworkEngine(void)
{
	shutdown();
}
NEError CNetworkEngine::init( NEType type )
{
	if( enet_initialize() != 0 )
		return NE_ERROR;
	m_initialized = true;
	m_type = type;
	if( type == NE_SERVER )
	{
		cout << "Creating Server...\n";
		ENetAddress address;
		cout << "Setting host to " << (int)ENET_HOST_ANY;
		address.host = ENET_HOST_ANY;
		address.port = 1235;
		m_server = enet_host_create( &address, 5, 0, 0 );
		if( m_server == NULL )
		{
			return NE_ERROR;
		}
		m_hostCreated = true;
	}
	else if( type == NE_CLIENT )
	{
		cout << "Creating client...\n";
		m_client = enet_host_create( NULL, 1, 57600/8, 14400/8 );
		if( m_client == NULL )
		{
			return NE_ERROR;
		}
		m_hostCreated = true;
	}
	else
	{
		return NE_ERROR;
	}
	return NE_SUCCESS;
}
NEError CNetworkEngine::shutdown()
{
	cout << "Shutting down...\n";
	if( m_isConnectedToServer )
		disconnect();
	if( m_hostCreated )
		enet_host_destroy( (m_type == NE_CLIENT ? m_client : m_server) );
	if( m_initialized )
		enet_deinitialize();
	return NE_SUCCESS;
}
NEError CNetworkEngine::connect( char * add )
{
	if( m_type != NE_CLIENT )
	{
		cout << "Cannot connect if not client...\n";
		return NE_ERROR;
	}
	ENetAddress address;
    ENetEvent event;
	enet_address_set_host( & address, "127.0.0.1" );
	address.port = NE_SERVER_PORT;
	m_peer = enet_host_connect( m_client, & address, 2);
	if( m_peer == NULL )
	{
		cout << "connect failed!\n";
		return NE_ERROR;
	}
	/* Wait up to 5 seconds for the connection attempt to succeed. */
	if (enet_host_service (m_client, & event, 5000) > 0 &&
		event.type == ENET_EVENT_TYPE_CONNECT)
	{
		cout << "Connection to " << add << ":1234 succeeded.";
		m_isConnectedToServer = true;
	}
	else
	{
		enet_peer_reset (m_peer);
		cout << "Connection to some.server.net:1234 failed.";
	}
	return NE_SUCCESS;
}
NEError CNetworkEngine::disconnect()
{
	if( m_type != NE_CLIENT )
	{
		cout << "Cannot disconnect if not client\n";
		return NE_ERROR;
	}
	ENetEvent event;
	cout << "Disconnecting...\n";
	enet_peer_disconnect( &m_client -> peers[0] );
	while (enet_host_service (m_client, & event, 3000) > 0)
	{
		switch (event.type)
		{
		case ENET_EVENT_TYPE_RECEIVE:
			cout << "Dropping received packets...\n";
			enet_packet_destroy (event.packet);
			break;
		case ENET_EVENT_TYPE_DISCONNECT:
			cout << "Disconnection succeeded.";
			return NE_SUCCESS;
		}
	}
	cout << "Disconnect failed. Forcing reset.\n";
	enet_peer_reset(& m_client -> peers [0] );
	return NE_SUCCESS;
}
NEError CNetworkEngine::receive()
{
	ENetEvent event;
	int ret = 1;
	while( ret > 0 )
	{
		ret = enet_host_service( m_server, &event, 3000 );
		switch( event.type )
		{
		case ENET_EVENT_TYPE_CONNECT:
			cout << "A new client connected from "
				<< event.peer -> address.host << ":"
				<< event.peer -> address.port << ".\n";
			/* Store any relevant client information here. */
			event.peer -> data = "Client information";
			break;
		case ENET_EVENT_TYPE_RECEIVE:
			cout << "A packet of length "
				<< event.packet -> dataLength
				<< " containing "
				<< event.packet -> data
				<< " was received from "
				<< event.peer -> data
				<< " on channel "
				<< event.channelID
				<< ".\n";
				/* Clean up the packet now that we're done using it. */
				enet_packet_destroy (event.packet);
			break;
		case ENET_EVENT_TYPE_DISCONNECT:
			cout << event.peer -> data << " disconected.\n";
			/* Reset the peer's client information. */
			event.peer -> data = NULL;
			break;
		case ENET_EVENT_TYPE_NONE:
			cout << "Waiting...\n";
			break;
		}
	}
	return NE_SUCCESS;
}
    
    
More information about the ENet-discuss
mailing list