|
|
|
|
| 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) |
 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-05-31 16:15 | 1,682 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - hoyt [ 2005-06-01 17:22 | 206 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-06-02 19:14 | 136 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-06-02 19:24 | 277 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - hoyt [ 2005-06-03 09:13 | 186 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-06-04 11:27 | 346 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - hoyt [ 2005-06-06 08:48 | 200 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-06-07 07:49 | 14 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-05-31 18:15 | 26 byte(s)]
 Re: 请问这样的一个用户空间网关应用程序程序如何实现?(高手请进) - goodness4960 [ 2005-05-31 22:14 | 154 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]
|
|
[Original]
[Print]
[Top]
|
我觉得应该不用进行多个接收,内核会将要求处理的报文都发送到用户空间,你只要一个线程接收就可以了。可以对每一个报文创建一个线程进行处理。
不过如果你的网关的报文流量太大的话,可能你的程序会处理不过来。
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
因为线程调用的数据包过滤程序fliter_pthread(void)只是接受一个连接请求,如果同时有多个用户的连接请求的话,我觉得应该要用到多线程啊。虽然我有多线程这个概念,但是我在main()函数中却不知道如何创建多个线程来调用fliter_pthread(void)以响应多个连接请求?那位高手能够指点一下,我很急啊!
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
你在用ipq_read(ipq_handle , buf , BUFSIZE , 0) ;
接收报文得时候可以收到多个客户机得请求。
内核会将所有得请求都发送到这个socket,你得程序只要在这个上面读取报文就可以了。
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
"你在用ipq_read(ipq_handle , buf , BUFSIZE , 0) ;
接收报文得时候可以收到多个客户机得请求。
内核会将所有得请求都发送到这个socket,你得程序只要在这个上面读取报文就可以了。"
你说的很有道理,但是如果有太多的用户同时发送数据,缓存buffer能够同时容纳的下这么多数据吗?buff的最大值是多少字节呢?
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
因为我没有分析过内核,所以下面的说法只是我的猜测。
内核应该是将收到的一个个packet发送过来,你接收的时候也应该一次只能收到一个packet,多余的packet的会被缓存在内核中或者被拥塞在发送端
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
|