SDL_net_中文教程.doc_第1页
SDL_net_中文教程.doc_第2页
SDL_net_中文教程.doc_第3页
SDL_net_中文教程.doc_第4页
SDL_net_中文教程.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

翻译来之wiki网站 ,翻译的有点烂。 黄建峰 2011年4月27日这个教程介绍如何在你的程序中使用SDL_net实现网络功能.在教程开始之前推荐您先了解下BSD Sockets。使用 TCP如果你需要一个可靠的但是有点慢的链接, TCP 符合你的需求: 此协议是面向连接的: 当你连接到一个主机,以及使用socket转换数据. 数据将无损的有序到达目的地. 在游戏中, 当你不需要很快的链接的时候TCP 是被用的最广泛的一个协议。虽然这样,但是如果你需要数据有序的无损的到达目的地,TCP是你最好的选择(UDP不是最好的选择). 在这简单的 client-server 例子中,我们将做如下的事情:服务端:1. 初始化 SDL_net 库2. 设置监听的端口3. 打开一个socket绑定端口4. 接收连接5. 接受数据6. 对数据进行处理 7. 清理,退出客户端:1. 初始化 SDL_net 库2. 解析服务器地址3. 打开一个socket 4. 从用户出读取数据5. 发送数据6. 清理,退出如果你有丰富的socket编程经验, 你会发现SDL_net是非常容易就可以上手的. 在接收到连接后, 我们将会得到关于主机的信息. 这是可选的,只是为了写本教程在这里稍微的提下. 还要注意的是服务器接收和管理的时候一次只能有一个连接,当然你可以使用这些技术来管理同时的多个连接(使用线程)。代码:这里是服务器代码: #if 0#!/bin/shgcc -Wall sdl-config -cflags tcps.c -o tcps sdl-config -libs -lSDL_netexit#endif#include #include #include #include SDL_net.hint main(int argc, char *argv)TCPsocket sd, csd; /* 定义服务端Socket ,客户端 socket */IPaddress ip, *remoteIP; /* 定义本机ip ,客户端 ip */int quit, quit2;char buffer512; /* 接收数据缓存 */if (SDLNet_Init() 0)fprintf(stderr, SDLNet_Init: %sn, SDLNet_GetError();exit(EXIT_FAILURE);/* 解析主机和端口,NULL为本机默认,端口2000 */if (SDLNet_ResolveHost(&ip, NULL, 2000) host), SDLNet_Read16(&remoteIP-port);elsefprintf(stderr, SDLNet_TCP_GetPeerAddress: %sn, SDLNet_GetError();quit2 = 0;while (!quit2)if (SDLNet_TCP_Recv(csd, buffer, 512) 0)printf(Client say: %sn, buffer);if(strcmp(buffer, exit) = 0)/* 中断连接 */quit2 = 1;printf(Terminate connectionn);if(strcmp(buffer, quit) = 0)/* 退出程序 */quit2 = 1;quit = 1;printf(Quit programn);/* 关闭客户端socket */SDLNet_TCP_Close(csd);SDLNet_TCP_Close(sd); /* 关闭服务端socket */SDLNet_Quit();return EXIT_SUCCESS;这里是客户端的代码: #if 0#!/bin/shgcc -Wall sdl-config -cflags tcpc.c -o tcpc sdl-config -libs -lSDL_netexit#endif#include #include #include #include SDL_net.hint main(int argc, char *argv)IPaddress ip;/* 服务器地址 */TCPsocket sd;/* 定义服务器socket */int quit, len;char buffer512;/* 简单的参数检查 */if (argc 3)fprintf(stderr, Usage: %s host portn, argv0);exit(EXIT_FAILURE);if (SDLNet_Init() 0)fprintf(stderr, SDLNet_Init: %sn, SDLNet_GetError();exit(EXIT_FAILURE);/* 解析主机 */if (SDLNet_ResolveHost(&ip, argv1, atoi(argv2) );scanf(%s, buffer);len = strlen(buffer) + 1;if (SDLNet_TCP_Send(sd, (void *)buffer, len) len)fprintf(stderr, SDLNet_TCP_Send: %sn, SDLNet_GetError();exit(EXIT_FAILURE);if(strcmp(buffer, exit) = 0)quit = 1;if(strcmp(buffer, quit) = 0)quit = 1;SDLNet_TCP_Close(sd);SDLNet_Quit();return EXIT_SUCCESS;edit使用UDP:大部分的游戏使用UDP,因为UDP比TCP快. 但是速度快是有代价的: UDP无法提供一个可靠的方式发送数据到目的主机, 数据包也可能发生错误. UDP 是一个无链接协议, 这意味着你不需要在本地和主机间建立一个连接, 但是你要将信息发送到一个特定的端口或者在一个端口上等待信息。不管怎么说, SDL_net 提供一个中间方法使用UDP进行连接:你能指定一个通道以及绑定一个远程主机 到UDP socket. 用这种方式,你不需要每次都指定你要发送的数据包的地址。 服务端:1. 初始化 SDL_net 库 2. 在指定的端口打开一个 socket 3. 给数据包开辟内存 4. 等待从客户端来的数据包5. 处理数据包 6. 释放内存,退出 客户端:1. 初始化 SDL_net 库 2. 在一个随机的未使用的端口打开一个socket3. 解析服务端的地址 4. 给数据包开辟内存5. 发送数据包 6. 释放内存,退出 代码:服务端代码: #if 0#!/bin/shgcc -Wall sdl-config -cflags udps.c -o udps sdl-config -libs -lSDL_netexit#endif#include #include #include #include SDL_net.hint main(int argc, char *argv)UDPsocket sd; /* 定义服务端 socket */UDPpacket *p; /* 定义数据包 */int quit;/* 初始化 SDL_net */if (SDLNet_Init() channel);printf(tData: %sn, (char *)p-data);printf(tLen: %dn, p-len);printf(tMaxlen: %dn, p-maxlen);printf(tStatus: %dn, p-status);printf(tAddress: %x %xn, p-address.host, p-address.port);/* Quit if packet contains quit */if (!strcmp(char *)p-data, quit)quit = 1;/* Clean and exit */SDLNet_FreePacket(p);SDLNet_Quit();return EXIT_SUCCESS;客户端:#if 0#!/bin/shgcc -Wall sdl-config -cflags udpc.c -o udpc sdl-config -libs -lSDL_netexit#endif#include #include #include #include SDL_net.hint main(int argc, char *argv)UDPsocket sd;IPaddress srvadd;UDPpacket *p;int quit;/* 检查参数 */if (argc 3)fprintf(stderr, Usage: %s host portn, argv0);exit(EXIT_FAILURE);if (SDLNet_Init() );scanf(%s, (char *)p-data);p-address.host = srvadd.host;/* 设置主机地址 */p-address.port = srvadd.port;/* 主机端口 */p-len = strlen(char *)p-data) + 1;SDLNet_UDP_Send(sd, -1, p); /* This sets the p-channel */* Quit if packet contains

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论