Chinaunix首页 | 论坛 | 博客
  • 博客访问: 326187
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类:

2010-08-25 11:00:13

TCP在建立连接的时候,SYN分节会相互通告窗口,此窗口就是TCP内核的缓冲区大小,通常要求其为MSS的偶数倍。
 
为了充分利用TCP连接,需要估计TCP连接的传输速度和RTT值,得到在网络上传输的字节流大小,通过SO_RCVBUF和SO_SNDBUF可以查看本地socket的发送和接受缓冲区大小。
 
SO_RCVLOWAT和SO_SNDLOWAT 表示本地TCP接受low water,如果接受的字节大于该值,内核将其标识为可读;如果发送缓冲区的可用空间大于SO_SNDLOWAT,内核将其标识为可写;一般该值缺省为2048字节。
 
具体可查看UNIX网络编程P165。
 
 

  char sock_rcv_buf_size[MAXHOSTNAMELEN];
  int len = sizeof(sock_rcv_buf_size);
  acceptor.get_option(SOL_SOCKET, SO_RCVBUF, sock_rcv_buf_size, &len);
  sock_rcv_buf_size[len] = 0;
  ACE_DEBUG((LM_DEBUG,
             ACE_TEXT ("(%P|%t) Receive buffer size %d %d \n"),
             *(int*)sock_rcv_buf_size, len));


这几行代码可以在ACE上查看缓冲区大小,搞不明白的是,ACE将get_option的第三个参数改成了char*,这样需要自己根据类型做转换。

在WinXP上,接收缓冲区8192字节,发送缓冲区64512字节。

TCP/UDP所返回的缓冲区大小是一致的。

阅读(7382) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~