随笔 - 96  文章 - 255  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

E-mail:zbln426@163.com QQ:85132383 长期寻找对战略游戏感兴趣的合作伙伴。

常用链接

留言簿(21)

随笔分类

随笔档案

SDL相关网站

我的个人网页

我的小游戏

资源下载

搜索

  •  

积分与排名

  • 积分 - 485013
  • 排名 - 37

最新评论

阅读排行榜

评论排行榜

06 2010 档案
彻底解密C++宽字符:6、国际化策略(完)      摘要: 硬编码的硬伤——补救——Windows的策略——Linux的策略——跨平台策略——gettext策略——更多  阅读全文
posted @ 2010-06-26 19:55 lf426 阅读(3469) | 评论 (4)  编辑
彻底解密C++宽字符:5、利用fstream转换      摘要: C++的流和本地化策略集——basic_filebuf——利用fstream实现宽窄转换  阅读全文
posted @ 2010-06-26 16:40 lf426 阅读(3033) | 评论 (0)  编辑
彻底解密C++宽字符:4、利用codecvt和use_facet转换      摘要: locale和facet——codecvt——内部编码和外部编码——CodecvtFacet的in()和out()——演示程序源代码——use_facet  阅读全文
posted @ 2010-06-26 13:39 lf426 阅读(8592) | 评论 (2)  编辑
彻底解密C++宽字符:3、利用C运行时库函数转换      摘要: std::locale——mbstowcs()和wcstombs()——宽窄转换函数:string和wstring之间的转换。  阅读全文
posted @ 2010-06-26 11:17 lf426 阅读(2913) | 评论 (1)  编辑
彻底解密C++宽字符:2、Unicode和UTF      摘要: Unicode和UCS——Unicode和UTF——UTF-8和Windows GB2312——UTF-16和UCS-2——UTF-32和UCS-4——BOM  阅读全文
posted @ 2010-06-25 21:51 lf426 阅读(3533) | 评论 (1)  编辑
彻底解密C++宽字符:1、从char到wchar_t      摘要: 从字符到整数——本地化策略集(locale)——C/C++的编译策略——宽字符 wchar_t  阅读全文
posted @ 2010-06-25 14:41 lf426 阅读(20873) | 评论 (6)  编辑
socket 编程入门教程(六)UDP应用:2、UDP版的Echo Client      摘要: 我们将UDP版的doEcho()也设计成返回bool:true表示循环继续;false表示关闭客户端。  阅读全文
posted @ 2010-06-12 12:11 lf426 阅读(3653) | 评论 (2)  编辑
socket 编程入门教程(六)UDP应用:1、UDP版的Echo Server      摘要: 这里跟TCP有些细微的差别。在TCP中,recv()返回0表示连接正常断开,而UDP中没有连接和断开的概念,recv()或者recvfrom()返回0表示收到一个0字节大小数据的数据报。另外,因为TCP是一对一连接的,所以一旦连接上,TCP服务器只能处理来自一个客户端的echo请求(后面会讲到多线程的使用,就可以让TCP同时处理多个客户端了);而UDP服务器则可以处理来自任何客户端的echo请求,为了返回信息到正确的客户端,我们的策略是,接收一个UDP数据包后,马上刷新发送目标地址为上一次接收地址,然后再回发数据,所以这里每次多了一个重新指定发送目的地的函数。  阅读全文
posted @ 2010-06-12 11:16 lf426 阅读(2428) | 评论 (2)  编辑
socket 编程入门教程(五)UDP原理:5、预读MSG_PEEK      摘要: 因为UDP是按数据包接收的,我们在接收之前并不知道这个数据包有多大。一个策略是,我们准备足够大的应用程序缓存以免出错,但是这个“足够大”的概念是建立在我们对传送的数据事先有了解的情况下,比如是我们自己设计服务器端和客户端并且制定应用层协议;另外一种策略是,将一个数据包的相关信息记录在数据包的前面的一些字节中,比如说大小,这样,我们可以通过预读数据包的前面一段,得到这个数据包的相关信息,比如说大小,然后再安排缓存。  阅读全文
posted @ 2010-06-11 13:30 lf426 阅读(5238) | 评论 (1)  编辑
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP      摘要: 虽然UDP是无连接的,但是也可以通过调用connect()将本地的UDP socket FD与一个远程的UDP socket FD连接起来。  阅读全文
posted @ 2010-06-11 11:51 lf426 阅读(2157) | 评论 (0)  编辑
socket 编程入门教程(五)UDP原理:3、UDP的系统缓存队列      摘要: UDP的系统缓存队列与TCP的相比,有两点显著的不同:
1、UDP没有SendQ。UDP的数据包不会被处理,通过调用sendto()(或者在connect()之后也可以调用send())将数据直接发送。
2、UDP的数据在缓存队列中是有边缘保证的。  阅读全文
posted @ 2010-06-11 11:18 lf426 阅读(2994) | 评论 (0)  编辑
socket 编程入门教程(五)UDP原理:2、设计UDP client类      摘要: TCP之所以有个服务器,是因为TCP的客户端只能和自己的服务器端通讯。而UDP的客户端可以与任何一个UDP端口通讯——只要知道对方的地址(IP地址和UDP端口)就可以发送数据包。  阅读全文
posted @ 2010-06-10 19:37 lf426 阅读(1686) | 评论 (0)  编辑
socket 编程入门教程(五)UDP原理:1、设计UDP server类      摘要: 人们通常用电话连线来说明TCP协议,而UDP协议,则常常用邮递来做比喻。与TCP有连接的信息传输方式不同,UDP协议被认为是对底层IP协议简单的扩展:协议并不保证每个数据包都会到达目的地,也不保证到达的顺序,而仅仅就是“尽力”的发送每一个数据包。  阅读全文
posted @ 2010-06-10 12:16 lf426 阅读(2869) | 评论 (0)  编辑
迭代器(iterator)“擦”(erase)出的错误      摘要: 在我们遍历查找对等值的循环中,一开始v.end()指向第10个元素(数值为9)的后面一个位置(不存在的第11个元素的位置)。当迭代器指向第10个元素(数值为9)的时候,v.erase()生效运行;下一轮循环中,迭代器本来应该指向第11个元素的位置,并且等于v.end()并结束循环。但是,因为我们擦掉了vector中的一个元素,v.end()指向的是现在的最后一个元素——第9个元素的后面,也就是第10个元素的位置。这样,迭代器到了11,而判断确是其是否到10,这将永远无法实现,形成了一个逻辑bug,所以系统抛出错误了。  阅读全文
posted @ 2010-06-10 11:03 lf426 阅读(1633) | 评论 (1)  编辑
socket 编程入门教程(四)TCP应用:2、构建echo客户端      摘要: echo客户端的工作原理也很简单:
1、向服务器端发送一个字符串;
2、接收服务器的返回信息(如果是echo服务器就会返回发送出去的字符串本身)。
3、在标准输出中回显服务器返回的信息。  阅读全文
posted @ 2010-06-08 11:49 lf426 阅读(2233) | 评论 (1)  编辑
socket 编程入门教程(四)TCP应用:1、构建echo服务器      摘要: echo服务器的工作原理很简单:
1、接收客户端传来的信息;
2、将接收到的信息原封不动的返回给客户端。  阅读全文
posted @ 2010-06-08 10:56 lf426 阅读(3107) | 评论 (3)  编辑
socket 编程入门教程(三)TCP原理:7、TCP连接的关闭      摘要: TCP的连接建立需要3次握手,而正常关闭则需要4次握手。  阅读全文
posted @ 2010-06-07 20:58 lf426 阅读(2903) | 评论 (0)  编辑
socket 编程入门教程(三)TCP原理:6、字节流的发送与接收      摘要: 在socket机制中,应用层的程序以send()函数将数据首先发送到本机系统的发送缓存中,我们称之为SendQ,意指这是一个FIFO(先进先出)的队列。这个缓存是系统决定的,并不是在我们的程序中指定的。然后socket机制负责将SendQ中的数据以字节为单位,按照顺序发送给对方的接收缓存RecvQ中。RecvQ也是一个属于系统的FIFO缓存队列。在收信息的另外一边,当RecvQ没有数据时,recv()就会阻塞(默认情况下),每当有数据可接收,recv()就会返回实际接收到的数据长度。  阅读全文
posted @ 2010-06-07 20:09 lf426 阅读(3974) | 评论 (1)  编辑
socket 编程入门教程(三)TCP原理:5、TCP的三次握手(three-way handshake)      摘要: TCP的三次握手过程如下:
1、第一个SYN连接请求由客户端发起,这个数据报将SYN设置为1表示是一个连接请求,并且包含着这次连接的ISN,我们假设其值为n。
2、服务器端收到第一次握手请求的数据报后开始构建反馈的数据报。反馈数据报包括两个部分:第一部分是将连接请求的序号反馈回去,因为SYN本身占了一个字节,所以反馈回去的序号就是n+1;第二部分是自己也向客户端发起SYN连接请求,也将SYN设置为1,并包含这个新连接的ISN,我们设其值为m。
3、客户端回应服务器端的SYN连接请求,将服务器端到客户端连接的序号反馈回去,因为SYN占了一个字节,所以反馈给服务器端的序号是m+1。  阅读全文
posted @ 2010-06-07 13:16 lf426 阅读(2994) | 评论 (0)  编辑
socket 编程入门教程(三)TCP原理:4、设计TCP socket的类(下)      摘要: TCPClientSock的建立和第三次握手。  阅读全文
posted @ 2010-06-07 00:46 lf426 阅读(1814) | 评论 (1)  编辑
socket 编程入门教程(三)TCP原理:3、设计TCP socket的类(中)      摘要: TCPServerSock的建立和“第二次握手”。  阅读全文
posted @ 2010-06-06 23:46 lf426 阅读(1655) | 评论 (0)  编辑
socket 编程入门教程(三)TCP原理:2、设计TCP socket的类(上)      摘要: socket是一个int的文件描述符(WinSock中直接是一种抽象的描述符),我们通过对这个描述符发出指令操作socket。这是C语言的思想,在面向对象的思想中,最好socket本身是一种对象,各种方法由对象本身发出。用面向对象的思想封装socket并不困难,而且,对于描述socket的概念可能更加直观,这一节,我们边介绍socket和TCP的概念边对socket进行OO封装。
(上)基类和监听socket。  阅读全文
posted @ 2010-06-06 22:24 lf426 阅读(3832) | 评论 (1)  编辑
socket 编程入门教程(三)TCP原理:1、socket异常信息      摘要: sokcet本身属于系统(OS),是系统对TCP/IP的实现,也就是说,socket发出的异常信息不代表程序出错,甚至不代表系统出错,而仅仅就是代表socket本身的各种异常情况。  阅读全文
posted @ 2010-06-06 21:07 lf426 阅读(3922) | 评论 (0)  编辑
用对象的成员函数引出线程,还是在线程中创建对象?      摘要: 所以,如果我们设想构造一个类,这个类的对象可以调用包含this的线程,那么这个对象一定不能是局部变量,或者说,我们必须在循环的{}对之前先把这些对象构造出来。或者说,如果我们希望用类来封装线程,那么这些可以调用线程的对象必须是全局的。  阅读全文
posted @ 2010-06-05 21:06 lf426 阅读(766) | 评论 (0)  编辑
在多线程中抛出的异常出错?      摘要: 所以,一个解决方法是,凡是遇到新的线程,必须在新线程中重新写异常处理。不然,就如google代码标准里所说的那样,不使用C++的异常机制。毕竟C++没有定义多线程的标准,所以也就无从说起多线程中异常处理的标准。  阅读全文
posted @ 2010-06-05 20:16 lf426 阅读(2598) | 评论 (2)  编辑
socket 编程入门教程(二)win32下使用socket:WinSock      摘要: 接下来的教程我会兼顾winsock的代码,这主要是因为winsock本身对socket几乎是兼容的。所以,这里有必要先说明在VC环境中使用socket的一些简单设置,以及与Linux环境下的细微差别。  阅读全文
posted @ 2010-06-03 10:37 lf426 阅读(6508) | 评论 (0)  编辑