ENet网络库教程翻译(一)

2014-11-24 02:30:41 · 作者: · 浏览: 6
初始化:
使用enet时你需要include,如果include 在某些 系统中可能会造成一些文件名冲突。
在使用ENet之前,你必须调用enet_initialize()来初始化库。当程序退出时,你需要调用enet_deinitialize()这样库可以清理释放之前用过的资源。
#include
int
main (int argc,char ** argv)
{
if (enet_initialize () != 0)
{
fprintf (stderr, "An error occurred while initializing ENet.\n");
return EXIT_FAILURE;
}
atexit (enet_deinitialize);
...
...
...
}
创建一个ENet服务器
ENet的服务器使用enet_host_create()来创建的。你必须指定一个接收数据和接收新连接的地址和每个端的最大的连接数。你可以选择指定闯入传出带宽以位/秒为单位,这样ENet会尝试在已连接的对象中静态管理带宽资源而不是他的动态节流算法;两个参数都指定0的话将使得Enet完全依赖他的动态节流算法来管理带宽。
当使用完这个主机,主机可能需要用enet_host_destroy()来销毁。所有连接上这个主机的玩家都将被重制,主机使用的资源将被释放。
ENetAddress address;
ENetHost * server;
/* Bind the server to the default localhost. */
/* A specific host address can be specified by */
/* enet_address_set_host (& address, "x.x.x.x"); */
address.host = ENET_HOST_ANY;
/* Bind the server to port 1234. */
address.port = 1234;
server = enet_host_create (& address /* the address to bind the server host to */,
32 /* allow up to 32 clients and/or outgoing connections */,
2 /* allow up to 2 channels to be used, 0 and 1 */,
0 /* assume any amount of incoming bandwidth */,
0 /* assume any amount of outgoing bandwidth */);
if (server == NULL)
{
fprintf (stderr,
"An error occurred while trying to create an ENet server host.\n");
exit (EXIT_FAILURE);
}
...
...
...
enet_host_destroy(server);
创建一个ENet客户端
Enet的客户端同样也是用enet_host_create() 来创建,但是没有地址,特别是绑定主机。依照上面的例子客户端主机的带宽可能会指定。peer count控制连接其他同时打开的服务器主机的最大连接数。
ENetHost * client;
client = enet_host_create (NULL /* create a client host */,
1 /* only allow 1 outgoing connection */,
2 /* allow up 2 channels to be used, 0 and 1 */,
57600 / 8 /* 56K modem with 56 Kbps downstream bandwidth */,
14400 / 8 /* 56K modem with 14 Kbps upstream bandwidth */);
if (client == NULL)
{
fprintf (stderr,
"An error occurred while trying to create an ENet client host.\n");
exit (EXIT_FAILURE);
}
...
...
...
enet_host_destroy(client);
管理一个ENet主机
ENet使用轮询事件模型来通知程序员重大的事情。ENet主机使用 enet_host_service()来轮询事件,其中有个以毫秒为单位的时间参数将控制多久ENet轮询一次;如果参数是0,enet_host_service()将会立刻返回如果他没有事件分派的话。如果事件在指定的时间内被分发 enet_host_service()将会返回1。
当前ENet只有四种类型的事件
ENET_EVENT_TYPE_NONE 类型:如果没有事件在指定时间内发生将返回此类型
ENET_EVENT_TYPE_CONNECT 类型:当一个新的客户端主机连接上服务端主机或者当成功建立了与一个外部主机的连接时返回此类型。event数据结构中只有“peer”数据是有效的,并且包含了新连接的peer。
ENET_EVENT_TYPE_RECEIVE当数据包从连接的peer接收,返回此类型。“peer”数据域包含数据包的发送者,“channelID”是数据包发送的通道,“packet”是发送的数据包。当检查完它的内容后“packet”中的数据包必须用enet_packet_destroy()销毁。
ENET_EVENT_TYPE_DISCONNECT :当连接的peer显示的断开连接或者超时断开时返回此类型。事件数据结构中只有“peer”数据域是有效的并且包含失去连接的端口。断开连接的事件中只有“data”数据域是依然有效的并且必须显示的重制。
ENetEventevent;
/* Wait up to 1000 milliseconds for an event. */
while (enet_host_service (client, & event, 1000) > 0)
{
switch (event.type)
{
caseENET_EVENT_TYPE_CONNECT:
printf ("A new client connected from %x:%u.\n",
event.peer -> address.host,
event.peer -> address.port);
/* Store any relevant client information here. */
event.peer -> data ="Client information";
break;
caseENET_EVENT_TYPE_RECEIVE:
printf ("A packet of length %u containing %s was received from %s on channel %u.\n",
event