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


  这里两个步骤分别对前面所作的创建初始化进行了相应释放。

  接下来看看服务器端的一个网络执行处理,这里我们假设服务器端已经创建好一个Socket供使用,我们要做的就是让这个Socket变成监听网络连接请求的专用接口,看看下面代码片段:

SOCKADDR_IN addr;
memset( &addr, 0, sizeof(addr) );
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( INADDR_ANY );
addr.sin_port = htons( Port );  // Port为要监听的端口号
// 绑定socket
if( bind( sSocket, (SOCKADDR*)&addr, sizeof(addr) ) == SOCKET_ERROR )
{
 Failed( "WinSocket Bind Error!");
}
// 进行监听
if( listen( sSocket, SOMAXCONN ) == SOCKET_ERROR )
{
 Failed( "WinSocket Listen Error!");
}


  这里使用的是阻塞式通讯处理,此时程序将处于等待玩家用户连接的状态,倘若这时候有客户端连接进来,则通过accept()来创建针对此玩家用户的Socket连接,代码片段如下:

sockaddraddrServer;
int nLen sizeof( addrServer );
SOCKET sPlayerSocket accept( sSocket, &addrServer, &nLen );
if( sPlayerSocket == INVALID_SOCKET )
{
 Failed( WinSocket Accept Error!");
}


  这里我们创建了sPlayerSocket连接,此后ucbug游戏网服务器与这个玩家用户的通讯全部通过此Socket进行,到这里为止,我们服务器已经有了接受玩家用户连接的功能,现在让我们来看看ucbug游戏网客户端是如何连接到ucbug游戏网服务器上,代码片段如下:

SOCKADDR_IN addr;
memset( &addr, 0, sizeof(addr) );
addr.sin_family = AF_INET;// 要连接的ucbug游戏网服务器端口号
addr.sin_addr.s_addr = inet_addr( IP );// 要连接的ucbug游戏网服务器IP地址,
addr.sin_port = htons( Port );//到此,客户端和服务器已经有了通讯的桥梁,
//接下来就是进行数据的发送和接收:
connect( sSocket, (SOCKADDR*)&addr, sizeof(addr) );
if( send( sSocket, pBuffer, lLength, 0 ) == SOCKET_ERROR )
{
 Failed( "WinSocket Send Error!");
}


  这里的pBuffer为要发送的数据缓冲指针,lLength为需要发送的数据长度,通过这支Socket API函数,我们无论在客户端或者服务端都可以进行数据的发送工作,同时,我们可以通过recv()这支Socket API函数来进行数据接收:

if( recv( sSocket, pBuffer, lLength, 0 ) == SOCKET_ERROR )
{
 Failed( "WinSocket Recv Error!");
}


  其中pBuffer用来存储获取的网络数据缓冲,lLength则为需要获取的数据长度。

  现在,我们已经了解了一些网络互连的基本知识,但作为网络ucbug游戏网,如此简单的连接方式是无法满足网络ucbug游戏网中百人千人同时在线的,我们需要更合理容错性更强的网络通讯处理方式,当然,我们需要先了解一下网络ucbug游戏网对网络通讯的需求是怎样的。

大家知道,ucbug游戏网需要不断循环处理ucbug游戏网中的逻辑并进行ucbug游戏网世界的绘制,上面所介绍的Winsock处理方式均是以阻塞方式进行,这样就违背了ucbug游戏网的执行本质,可以想象,在客户端连接到服务器的过程中,你的ucbug游戏网不能得到控制,这时如果玩家想取消连接或者做其他处理,甚至显示一个最基本的动态连接提示都不行。

  所以我们需要用其他方式来处理网络通讯,使其不会与ucbug游戏网主线相冲突,可能大家都会想到: 创建一个网络线程来处理不就可以了?没错,我们可以创建一个专门用于网络通讯的子线程来解决这个问题。当然,我们ucbug游戏网中多了一个线程,我们就需要做更多的考虑,让我们来看看如何创建网络通讯线程。

  在Windows系统中,我们可以通过CreateThread()函数来进行线程的创建,看看下面的代码片段:

DWORD dwThreadID;
HANDLE hThread = CreateThread( NULL, 0, NetThread/*网络线程函式*/, sSocket, 0, &dwThreadID );
if( hThread == NULL )
{
 Failed( "WinSocket Thread Create Error!");
}
 

  这里我们创建了一个线程,同时将我们的Socket传入线程函数:

DWORD WINAPINetThread(LPVOID lParam)


{
 SOCKET sSocket (SOCKET)lParam;
 ...
 return 0;
}
 

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