URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 33 » 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
 
 
 
 
 
 
 
 
 
 
Subject: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-05-31 16:15    Length: 1,682 byte(s)
[Original] [Print] [Top]
我这个用户空间网关程序利用netfilter框架提供的libipq API实现对排队到用户空间的数据包进行处理。因为这个网关要同时接受很多个来自一个局域网内的上网连接(http请求),因此要用到linux c的多线程编程。现在我已编好了一个数据包过滤线程的程序 void fliter_pthread(void),程序代码(因为程序较为复杂,且便于说明问题,帖子后面给出了简化了的程序)。我想请教的问题如下:
1、因该如何编写main()函数,才能利用这个过滤线程程序fliter_pthread(void)来处理许多个来自局域网内的上网连接(http请求)?
2、还要用到socket吗?我觉得好像不需要。因为利用ip_queue模块已经将来自客户端的数据包排队到了用户空间,利用libipq API实现对排队到用户空间的数据包进行处理。

void fliter_pthread(void)
{//获得排队到用户空间的数据包,并对其过滤
unsigned char buf [BUFSIZE] ; // 定义缓冲区
static struct ipq_handle *ipq_handle ; //定义用户空间进程注册句柄
int packet_verdict ; / /定义数据包去向
ipq_handle = ipq_create_handle (0) ;//注册用户空间进程
ipq_set_mode (ipq- handle , IPQ-COPY- PACKET ,COPYSIZE) ;//设置用户空间模式
while (1) / /循环执行
{
ipq_read(ipq_handle , buf , BUFSIZE , 0) ;// 把数据包IP 头长度为BUFSIZE 读入缓冲区
ipq_packet_msg_t * packet_msg = ipq_get_packet (buf) ;
/ / 从缓冲区读出数据包信息(包括IP ,packet-id 等)
packet_verdict = process-packet (packet-msg) ;
/ / 根据数据包信息调用函数处理,并返回数据包目标动作
ipq_set_verdict (ipq_handle ,packet_msg -> packet-id ,packet-verdict ,0 ,NULL) ;
/ / 向内核提交数据包的目标动作
}
ipq- destroy- handle (ipq- handle) ; / / 正常注销ipqd
return ;
}
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-05-31 18:15    Length: 26 byte(s)
[Original] [Print] [Top]
请高手指教!大家讨论一下啊
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-05-31 22:14    Length: 154 byte(s)
[Original] [Print] [Top]
怎么没人反应阿!是不是每个线程对应一个连接啊?如果是的话,在main()函数中如何实现:每当有一个连接时,就会对应的创建该线程了,有谁给我写点代码?万分感激!
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: hoyt    Posted: 2005-06-01 17:22    Length: 206 byte(s)
[Original] [Print] [Top]
我觉得应该不用进行多个接收,内核会将要求处理的报文都发送到用户空间,你只要一个线程接收就可以了。可以对每一个报文创建一个线程进行处理。
不过如果你的网关的报文流量太大的话,可能你的程序会处理不过来。
----
欢迎访问我的个人网站 www.linuxc.net
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-06-02 19:14    Length: 136 byte(s)
[Original] [Print] [Top]
但是如果只有一个线程的话,如果在局域网内有多个用户连接请求,这个网关应用程序就不知道该接受哪个用户的连接请求啊,所以好像还是要多线程哦?
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-06-02 19:24    Length: 277 byte(s)
[Original] [Print] [Top]
因为线程调用的数据包过滤程序fliter_pthread(void)只是接受一个连接请求,如果同时有多个用户的连接请求的话,我觉得应该要用到多线程啊。虽然我有多线程这个概念,但是我在main()函数中却不知道如何创建多个线程来调用fliter_pthread(void)以响应多个连接请求?那位高手能够指点一下,我很急啊!
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: hoyt    Posted: 2005-06-03 09:13    Length: 186 byte(s)
[Original] [Print] [Top]
你在用ipq_read(ipq_handle , buf , BUFSIZE , 0) ;
接收报文得时候可以收到多个客户机得请求。
内核会将所有得请求都发送到这个socket,你得程序只要在这个上面读取报文就可以了。
----
欢迎访问我的个人网站 www.linuxc.net
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-06-04 11:27    Length: 346 byte(s)
[Original] [Print] [Top]
"你在用ipq_read(ipq_handle , buf , BUFSIZE , 0) ;
接收报文得时候可以收到多个客户机得请求。
内核会将所有得请求都发送到这个socket,你得程序只要在这个上面读取报文就可以了。"

你说的很有道理,但是如果有太多的用户同时发送数据,缓存buffer能够同时容纳的下这么多数据吗?buff的最大值是多少字节呢?
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: hoyt    Posted: 2005-06-06 08:48    Length: 200 byte(s)
[Original] [Print] [Top]
因为我没有分析过内核,所以下面的说法只是我的猜测。

内核应该是将收到的一个个packet发送过来,你接收的时候也应该一次只能收到一个packet,多余的packet的会被缓存在内核中或者被拥塞在发送端
----
欢迎访问我的个人网站 www.linuxc.net
[Original] [Print] [Top]
Subject: Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进)
Author: goodness4960    Posted: 2005-06-07 07:49    Length: 14 byte(s)
[Original] [Print] [Top]
谢谢你的指点!
[Original] [Print] [Top]
« Previous thread
GDB遇到fork,然后我的头也fork掉了。
C/C++编程版
33
Next thread »
[精华] FAQ:如何在程序内部获得call back trace
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:55, cost 0.060096979141235 ms.