📄 netcomputer_generic.h
字号:
/* $Id: netcomputer_generic.h,v 1.20 2003/12/01 13:35:54 mbn Exp $
**
** ClanLib Game SDK
** Copyright (C) 2003 The ClanLib Team
** For a total list of contributers see the file CREDITS.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef header_netcomputer_generic
#define header_netcomputer_generic
#if _MSC_VER > 1000
#pragma once
#endif
#include "API/Core/System/mutex.h"
#include "API/Core/System/thread.h"
#include "API/Core/System/event_trigger.h"
#include "API/Network/Socket/socket.h"
#include "API/Network/NetSession/netpacket.h"
#include <map>
#include <string>
#include <queue>
class CL_NetStream_Generic;
class CL_NetSession_Generic;
class CL_NetPacket_Generic;
class CL_NetPacket;
class CL_EventListener;
class CL_NetComputer_Generic
{
//! Construction:
public:
//: Sync connect constructor.
CL_NetComputer_Generic(
const CL_Socket &tcp_sock,
CL_NetSession_Generic *netsession,
bool server,
const std::string &server_port);
//: ASync connect constructor.
CL_NetComputer_Generic(
const std::string &hostname,
const std::string &port,
CL_NetSession_Generic *netsession);
virtual ~CL_NetComputer_Generic();
//! Attributes:
public:
//: Return current reference count.
int get_ref() const;
//: TCP socket connection to the network computer.
CL_Socket tcp_sock;
//: If true, UDP connection has been established
bool udp_available;
//: UDP IP/Port pair for the remote network computer.
CL_IPAddress udp_address;
//; Cached dest address of remote computer.
//: (we cache it because it seems linux forget about the dest peer when a
//: socket is closed)
CL_IPAddress address;
//: True if computer has disconnected.
bool disconnected;
//: String describing reason why computer was disconnected.
std::string disconnect_reason;
//: Pointer to netsession owner of netcomputer.
CL_NetSession_Generic *netsession;
//: Syncronized data access to netcomputer.
CL_Mutex mutex;
//! Operations:
public:
//: Increase reference count.
void add_ref();
//: Decrease reference count. Delete object if reaching zero.
int release_ref();
//: Received udp packet.
void received_udp_packet(CL_NetPacket &packet);
//: Send packet to computer.
void send_packet(const std::string &packet_channel, CL_NetPacket_Generic *packet);
//: Send packet to computer using udp.
void send_packet_udp(const std::string &packet_channel, CL_NetPacket_Generic *packet);
//: Send stream connect packet to computer. Returns the channel_id of the new connection.
int send_stream_connect(const std::string &stream_channel, CL_NetStream_Generic *stream);
//: Send stream message to computer.
void send_stream_message(unsigned int channel_id, const std::string &data);
//: Send stream close message to computer.
void send_stream_close(int channel_id);
//: Disconnects from everything
void disconnect(std::string reason);
//: Shuts down the netcomputer instance.
//- <p>Used by CL_NetSession_Generic to close down all connections when the netsession is destroyed.</p>
void do_shutdown();
//! Implementation:
private:
//: Send udp info to computer.
void send_udp_info();
//: Worker thread for this netcomputer. Basically calls update_socket() on activity.
void worker_thread();
//: Updates socket. Dispatches new available data and writes queued data to socket.
void update_socket();
//: Bytes left of current data transfer chunk.
int data_left;
//: Netstream receiving current data transfer.
CL_NetStream_Generic *netstream;
//: Netpacket receiving current data transfer.
CL_NetPacket netpacket;
//: Netpacket destination for current data transfer.
int dest_netpacket_atom;
//: Atom map used to map from strings to atom ints.
std::map<std::string, int> local_atoms;
//: Next free local atom.
int local_atom_counter;
//: Atom map used to map from atom ints to strings.
std::map<int, std::string> remote_atoms;
//: Queue of messages to be sent across reliable TCP socket.
std::queue<std::string> send_tcp_queue;
//: Data sent position in topmost send queue message.
int send_pos;
//: Reference counter.
int ref;
//: Basic message types used over socket.
enum
{
cmd_create_atom = 0,
cmd_udp_info,
cmd_udp_connect,
cmd_netstream_connect = 32,
cmd_netstream_msg,
cmd_netstream_closed,
cmd_netpacket_msg = 64,
};
//: Asyncronous connect. If true, the worker thread will do the socket
//: connect. Otherwise the connect has already been done from the main
//: thread.
bool async_boot;
//: Asyncronous connect. Hostname to connect to.
std::string async_hostname;
//: Asyncrounous connect. Port used in connect.
std::string async_port;
//: Worker thread handle.
CL_Thread thread;
//: Trigger that will wake up sockets worker thread.
CL_EventTrigger wakeup_trigger;
//: List of channel connections currently active over this connection.
std::map<int, CL_NetStream_Generic *> streams;
//: Local stream channel ID counter.
int channel_id_counter;
//: If true, worker thread is asked to shut itself down.
volatile bool shutdown;
//: If true, this netcomputer generic object acts as the server in udp connect sequence.
bool server;
//: Port that server is listening on.
std::string server_port;
//: Connect secret to be sent to server in response to a cmd_udp_info.
unsigned short udp_connect_secret;
//: To allow CL_NetSession_Generic to access the message types for UDP connection
friend class CL_NetSession_Generic;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -