Subscribe: C++博客-Bugs
http://www.cppblog.com/Bugs/rss.aspx
Added By: Feedage Forager Feedage Grade B rated
Language: Chinese simplified
Tags:
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: C++博客-Bugs

C++博客-Bugs



MMORPG game develop.



Published: Sat, 20 Jan 2018 15:58:30 GMT

Last Build Date: Sat, 20 Jan 2018 15:58:30 GMT

 



我自己的blog!

Tue, 11 Nov 2008 08:15:00 GMT

欢迎大家光临我自己的Blog:http://iBugs.net (image)

Bugs 2008-11-11 16:15 发表评论



SCTP vs. TCP

Thu, 26 Jun 2008 03:28:00 GMT

  1 流控制传输协议(SCTP)发展简介   随着IP网向多业务网发展,尤其是目前IP电话、IP视频会议等业务的发展,在IP网中传送信令信息成为必然。目前IP网中信令消息的交换通常是使用TCP或UDP完成,但是这两个协议都不能满足电信运营网中信令承载的要求。   为适应IP网成为电信运营核心网的发展趋势,IETF 的信令传输工作组(SIGTRAN)一直在研究和制定IP网新一代的传输协议,并在IETF RFC 2960中定义了流控制传输协议(SCTP,Stream Control Transmission Protocol)。SCTP是面向连接的可靠传送协议,它向上层应用提供了下列服务:   · 应用数据的无错误无重复的可靠传输;   · 根据检测到的MTU长度进行数据包分段处理,避免IP层的分段;   · 在多个流间的用户消息有序递交,及单用户消息按到达顺序递交的选项;   · 通过支持关联的多宿主机特性,实现网络级容错。   SCTP是为传输信令业务流而制定的,它本身所具有的、优于TCP的一些先进协议机制,如选择性重传、无序递交和支持多种网络特性等,使得SCTP能够在一定程度上满足高性能传输的需求。而且,SCTP采用了类同TCP的流量控制机制,不存在类似基于UDP的实时媒体流对TCP性能造成的劣化干扰问题和公平性问题。因此,SCTP将有可能取代TCP,成为下一代IP网上面向连接的可靠传送层协议。 2 TCP的不足   TCP是目前Internet上应用最广泛的面向连接的传送层协议,它为通信的两端提供了可靠的数据传输,而且提供了流量控制和拥塞控制功能。由于原来IP网提供的是“尽力而为(best-effort)”的服务,因此TCP存在许多不足之处:   · TCP是面向字节流的。这意味着消息的描述必须由应用来完成,而且要在消息结束时显示通知TCP以迫使其立即发送相应的数据。   · 许多应用只需要信令信息的部分有序,例如属于同一呼叫或同一会话的消息就是这样。而TCP只提供严格的数据按序传输,这会导致不必要的队头拥塞并使消息的传输时延增大。   · TCP连接直接由一对传送层地址(IP地址和端口号)识别,无法提供对多宿主机的透明支持。   · 典型的TCP实现不允许高层应用设定协议控制参数。但是一些应用可能会需要调节传送层协议的属性以满足其要求,例如某些应用有较高的时延要求,而另一些则只要求较高的可靠性。 3 连接与关联   TCP中的连接是指两个TCP端点通过“三次握手”过程建立的由一对传送层地址(IP地址和端口号)识别的传送通道。   在SCTP中, TCP中的连接被引申为关联(associ-ation)。一个关联的两个SCTP端点都向对方提供一个SCTP端口号和一个IP地址列表,这样每个关联都由两个SCTP端口号和两个IP地址列表来识别。在一个关联内的拥塞控制机制与TCP连接的拥塞控制机制类似。   一个关联是由多个单向的流组成的。各个流之间相对独立,可以单独发送数据而不受其他流的影响,也可以共同实现用户数据的有序递交。流的建立和拆除过程相对独立、简单。而关联的建立过程相对而言就比较复杂,是个“四次握手”过程,而且其中要用到“cookie”的概念。所谓“cookie”实际就是一个含有端点初始信息和加密信息的数据块,它在关联建立时被通信的两端处理并交换。 4 SCTP的多宿主机特性及应用   SCTP支持传送层的多宿主机服务。当网络发生故障时,多宿主机服务可以增强网络的健壮性(robustness)。在某些应用场合,这个特性非常重要。SCTP对多宿主机服务的支持要求关联的一端或两端在不同的网络[...]



Linux下设置Shell的颜色!

Tue, 24 Jun 2008 03:06:00 GMT

  首先使用一个例子来说明如何实现Shell彩色:
    PS1="\[ \033[0;32;40m\u@\h:\w\$ \033[0m \]"


   在上面命令中,“\033[0;32;40m”表示定义后面文本的颜色,“\033”表示启动一个转义序列,“[”定义开始颜色定义,“0”定义默认的字体颜色,其它部分稍后定义。
    “32”定义文本的前景色,这里32表示绿色;“40”定义文本的背景色,40表示黑色。
    在字符串的最后定义了“ \033[0m”,它是用来恢复了默认的文本颜色设置,这样就只会得到一个彩色提示符,而不会影响命令和其输出的颜色显示(即黑底白字)。

    我们一共有8种字体颜色可供选择,它们分别是30 (黑色)、31 (红色)、32 (绿色)、33 (黄色)、34 (蓝色)、35 ( 紫红色)、36 (青色)和37 (白色)。
    对于底色也有8种颜色可供选择,只需要将字体颜色的3修改为4即可,例如40、41、42、43、44、45、46、47。 

    文本属性

    我们前面提到,转义序列符后面的“0”表示定义文本的颜色设置。
    除了颜色设置以外,还可以设置文本的其它属性。
    转义序列符后可以跟以下数值:0、1、22、4、24、5、25、7、27,分别定义颜色、黑体、非黑体、下画线、非下画线、闪烁、非闪烁、翻转、非翻转。

(image)

Bugs 2008-06-24 11:06 发表评论



Epoll笔记!

Mon, 23 Jun 2008 02:17:00 GMT

epoll的接口非常简单,一共就三个函数:1. int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:struct epoll_event {  __uint32_t events;  /* Epoll events */  epoll_data_t data;  /* User data variable */};events可以是以下几个宏的集合:EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);EPOLLOUT:表示对应的文件描述符可以写;EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);EPOLLERR:表示对应的文件描述符发生错误;EPOLLHUP:表示对应的文件描述符被挂断;EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认另外,当使用epoll的ET模型来工作时,当产生了一个EPOLLIN事件后,读数据的时候需要考虑的是当recv()返回的大小如果等于请求的大小,那么很有可能是缓冲区还有数据未读完,也意味着该次事件还没有处理完,所以还需要再次读取:while(rs){  buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);  if(buflen < 0)  {    // 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读    // 在这里就当作是该次事件已处理处.    if(errno == EAGAIN)     break;    else     return;   }   else if(buflen == 0)   {     // [...]



【转载】使用异步 I/O 大大提高应用程序的性能

Thu, 19 Jun 2008 09:53:00 GMT

出处:http://www.ibm.com/developerworks/cn/linux/l-async/ 使用异步 I/O 大大提高应用程序的性能 学习何时以及如何使用 POSIX AIO API 文档选项 将此页作为电子邮件发送 级别: 中级 M. Tim Jones (mtj@mtjones.com), 顾问工程师, Emulex 2006 年 9 月 28 日 Linux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。在本文中,我们将对这个 API 概要进行介绍,并来了解一下如何使用它。 AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。 I/O 模型 在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O 模型。这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些模型来解释它们与异步 I/O 之间的区别。图 1 给出了同步和异步模型,以及阻塞和非阻塞的模型。 图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。本节将简要对其一一进行介绍。 同步阻塞 I/O I/O 密集型与 CPU 密集型进程的比较 I/O 密集型进程所执行的 I/O 操作比执行的处理操作更多[...]



初次使用linux下的异步I/O

Thu, 19 Jun 2008 09:50:00 GMT

   1#include  2#include  3#include  4#include  5 6 7int main(int argc, char *argv[]) 8{ 910  int fd, ret;11  struct aiocb my_aiocb;1213  fd = open( "file.txt", O_RDONLY );14  if (fd < 0) perror("open");1516  /**//* Zero out the aiocb structure (recommended) */17  bzero( (char *)&my_aiocb, sizeof(struct aiocb) );1819  /**//* Allocate a data buffer for the aiocb request */20  my_aiocb.aio_buf = malloc(BUFSIZE+1);21  if (!my_aiocb.aio_buf) perror("malloc");2223  /**//* Initialize the necessary fields in the aiocb */24  my_aiocb.aio_fildes = fd;25  my_aiocb.aio_nbytes = BUFSIZE;26  my_aiocb.aio_offset = 0;2728  ret = aio_read( &my_aiocb );29  if (ret < 0) perror("aio_read");3031  while ( aio_error( &my_aiocb ) == EINPROGRESS ) ;3233  if ((ret = aio_return( &my_iocb )) > 0) {34      printf("%s\n", my_aiocb.aio_buf);35    /**//* got ret bytes on the read */36  } else {37    /**//* read failed, consult errno */38  }394041} g++ test.cpp -lrt Bugs 2008-06-19 17:50 发表评论[...]



RamDisk好处!

Mon, 16 Jun 2008 03:37:00 GMT

如果你有足够大的内存(4G),你可以采用RamDisk这个技术。

何谓RamDisk,就是内存映射成硬盘,
有什么好处呢?
访问速度快
      可用于频发存取,大吞吐量磁盘操作
掉电后即消失

       临时文件


linux下的/tmp就是ramdisk

windows下需要安装软件,推荐一个(gavotte ramdisk)
(image)

Bugs 2008-06-16 11:37 发表评论



配置文件类!

Mon, 26 May 2008 07:25:00 GMT

从台北出差回来,完成了Settings类,参考了词法分析和语言分析。////////////////////////////// file : test.confa = 1;b = 123;c = hi you;d = "hi you" boy 110;e = "\\=\\ \"test\"";        //  \=\"test"/* end */////////////////////////////其中:// 和 /* */是注释; \\ 转义为\ , \*转义为*;每个值空格分隔,如果使用了引号",则" "之间的就为值;转义符,必须用在""形式的值中;分号;为结束符号。载入配置文件: 1bool Open(const char *filename); 获取指定key的value: 1const char *GetValue(const char *key, int idx=0); 下面是一个使用demo:  1#include "../src/Common/Settings.h" 2 3int main(int argc, char *argv[]) 4{ 5 6    Settings s; 7    if( s.Open("test.conf") ) 8    { 9        LOGI("load file succed!");1011        LOGE("%s",  s.GetValue("c", 3) );12    }13    else14    {15        LOGE("load file failed!");16    }17    return 0;18}19 //代码:http://code.google.com/p/bugs1111 里面查找settgings.h settgings.cpp Bugs 2008-05-26 15:25 发表评论[...]



网络编程 心得2

Thu, 24 Apr 2008 10:33:00 GMT

如果客户端必须使用绑定端口,
那么在关闭的时候,会经历TIME_WAIT的过程,一般windows下是2分钟,这段时间,客户端connect的时候,会出错(WSAEADDRINUSE:10048),
怎么不经历这个状态呢?
使用下面代码:

  // 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
  BOOL bDontLinger = FALSE;
  if (setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL))< 0) {
   wsaperror("setsockopt");
   break;
  }
(image)

Bugs 2008-04-24 18:33 发表评论



网络编程 心得1

Tue, 08 Apr 2008 06:43:00 GMT



以前项目里发现一个这样的问题,当网络服务进程关掉的时候,在立即启动该服务,会有错误提示说port被占用了,监听失败。

最近在看《unix 网络编程》,在里面了解到了 链接时的三次握手 和 关闭时的四次握手,
在关闭时最后会有一个TIME_WAIT状态,这个状态时间是TCP里最长的,是二倍MSL时间,大约在1-4分钟。
至于为什么要保留这个状态和这么长的时间,请参考《unix 网络编程》第二章 2.7.

但这样的问题是可以解决的,使用SO_REUSEADDR    enables local address reuse,可以在TIME_WAIT状态下使用相同的PORT。

int reuser_addr = 1;
 ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&reuse_addr, sizeof(reuse_addr));

SO_REUSEADDR 的用途除了上面这种情况,还有三种分别是:
*)在多网卡的时候,多进程可以使用不同IP,相同PORT。
*)与上条差不多,在单进程使用使用不同IP,相同PORT。
*)在UDP广播的时候,可以在相同IP和PORT下使用,TCP则不行。
(image)

Bugs 2008-04-08 14:43 发表评论