设为首页 | 收藏本站 | 每日归档
当前位置:ucbug游戏网 > 新闻中心 > 游戏开发 >
网络游戏通讯模型初探(5)
作者:admin来源:未知发布时间:2009-10-09 15:56

  NetThread就是我们将来用于处理网络通讯的网络线程。那么,我们又如何把Socket的处理引入线程中?

  看看下面的代码片段:

HANDLE hEvent;
hEvent = CreateEvent(NULL,0,0,0);
// 设置异步通讯
if( WSAEventSelect( sSocket, hEvent,
FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE ) ==SOCKET_ERROR )
{
 Failed( "WinSocket EventSelect Error!");
}


  通过上面的设置之后,WinSock API函数均会以非阻塞方式运行,也就是函数执行后会立即返回,这时网络通讯会以事件方式存储于hEvent,而不会停顿整支程式。

  完成了上面的步骤之后,我们需要对事件进行响应与处理,让我们看看如何在网络线程中获得网络通讯所产生的事件消息:

WSAEnumNetworkEvents( sSocket, hEvent, &SocketEvents );
if( SocketEvents.lNetworkEvents != 0 )
{
 switch( SocketEvents.lNetworkEvents )
 {
  case FD_ACCEPT:
   WSANETWORKEVENTS SocketEvents;
   break;
  case FD_CONNECT:
  {
   if( SocketEvents.iErrorCode[FD_CONNECT_BIT] == 0)
   // 连接成功  
   {
   // 连接成功后通知主线程(ucbug游戏网线程)进行处理
   }
  }
   break;
  case FD_READ:
  // 获取网络数据
  {
   if( recv( sSocket, pBuffer, lLength, 0) == SOCKET_ERROR )
   {
    Failed( "WinSocket Recv Error!");
   }
  }
   break;
  case FD_WRITE:
   break;
  case FD_CLOSE:
   // 通知主线程(ucbug游戏网线程), 网络已经断开
   break;
  default:
   break;
 }


  这里仅对网络连接(FD_CONNECT) 和读取数据(FD_READ) 进行了简单模拟操作,但实际中网络线程接收到事件消息后,会对数据进行组织整理,然后再将数据回传给我们的ucbug游戏网主线程使用,ucbug游戏网主线程再将处理过的数据发送出去,这样一个往返就构成了我们网络ucbug游戏网中的数据通讯,是让网络ucbug游戏网动起来的最基本要素。

  最后,我们来谈谈关于网络数据包(数据封包)的组织,网络ucbug游戏网的数据包是ucbug游戏网数据通讯的最基本单位,网络ucbug游戏网一般不会用字节流的方式来进行数据传输,一个数据封包也可以看作是一条消息指令,在ucbug游戏网进行中,服务器和客户端会不停的发送和接收这些消息包,然后将消息包解析转换为真正所要表达的指令意义并执行。

声明:本站所有资源均来自网络,版权归原公司及个人所有。如有版权问题,请及时与我们联系,我们在第一时间予以删除,谢谢!
ucbug游戏网
关于我们 | 下载帮助 | 广告&合作 | 下载声明 | 版权声明
Copyright © 2010-2016 ucbug.com. All Rights Reserved ucbug游戏网
皖ICP备15003425号 适度游戏娱乐,沉迷游戏伤身。