免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: @sky
打印 上一主题 下一主题

用epoll写的一个TCP端口映射程序 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-17 11:02 |只看该作者
原帖由 dxbh 于 2008-8-17 10:34 发表




#define ALIGN (sizeof(unsigned long) -1) //lz,为什么要这样对齐?


原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问

论坛徽章:
0
12 [报告]
发表于 2008-08-17 11:22 |只看该作者
原帖由 @sky 于 2008-8-17 11:02 发表


原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问



  1. struct data_item
  2. {
  3.         。。。。。。
  4.         char buf[0];//这里0长度
  5. };

  6. static struct data_item * alloc_data_item(int dlen)
  7. {       
  8.         。。。。。。。。。。。
  9.         size = (sizeof(struct data_item) + dlen + ALIGN) & ~ALIGN;//这里所以要sizeof()+dlen,不过+ALIGN)&~ALIGN可以对齐,是个什么原理,lz要好好讲讲,尤其是sizeof(unsigned long)-1,为什么不是sizeof(int)-1呢?
  10.        
  11.         item = (struct data_item *)malloc(size);
  12.         。。。。。。。。。
  13. }
复制代码

论坛徽章:
0
13 [报告]
发表于 2008-08-17 11:51 |只看该作者
buf[0]是0长数组, buf 只想除sizeof(struct data_item)的多余空间
int和unsigned long在32位平台都是4字节

对齐就是 (8 + 3) & ~3 等于8 ,而(10 + 3) & ~3等于12

论坛徽章:
0
14 [报告]
发表于 2008-08-17 20:07 |只看该作者

回复 #1 @sky 的帖子

打开看了下代码,代码很整洁,感觉是个写程序的人,呵呵

论坛徽章:
0
15 [报告]
发表于 2008-08-18 14:53 |只看该作者
配置文件里面写上
127.0.0.1:1000 127.0.0.1:1000
然后nc 127.0.0.1 1000会怎样?

论坛徽章:
0
16 [报告]
发表于 2008-08-18 15:29 |只看该作者
原帖由 aoegiss 于 2008-8-18 14:53 发表
配置文件里面写上
127.0.0.1:1000 127.0.0.1:1000
然后nc 127.0.0.1 1000会怎样?



谢谢兄弟指出问题,小弟没想到这种映射,又学到东西了

论坛徽章:
0
17 [报告]
发表于 2008-08-18 17:24 |只看该作者
dfgdsfgfhsfgdg

论坛徽章:
0
18 [报告]
发表于 2008-08-19 09:51 |只看该作者
小弟不才,学习epoll程序流程, 有个地方不明白:

  1. static int init_gepoll(int num)
  2. {
  3.         int i;
  4.        
  5.         ge = (struct gepoll *)calloc(num, sizeof(struct gepoll));
  6.         if (ge)
  7.         {
  8.                 for (i = 0; i < num; ++i)
  9.                 {       
  10.                         if ((ge[i].epfd = epoll_create(8192)) == -1)
  11.                                 err("epoll_create");
  12.                 }

  13.                 return 0;
  14.         }

  15.         return -1;
  16. }
复制代码


也就是说有多少个连接就epoll_create多少次, 那么这里用epoll还有意义否?
请指教

论坛徽章:
0
19 [报告]
发表于 2008-08-19 10:38 |只看该作者
原帖由 tmp 于 2008-8-19 09:51 发表
小弟不才,学习epoll程序流程, 有个地方不明白:

static int init_gepoll(int num)
{
        int i;
       
        ge = (struct gepoll *)calloc(num, sizeof(struct gepoll));
        if (ge)
        {
                for (i = 0; i < num;  ...



你没看明白,总共就11个线程,主线程负责接受连接,其它10个子线程分担处理连接

论坛徽章:
0
20 [报告]
发表于 2008-08-19 10:51 |只看该作者
恩,也就是说每个线程上处理n多个连接, 原来如彼
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP