Articles of networking

在内核套接字编程中模拟select()和poll()的效果

我正在开发的一个Linux内核驱动程序是在内核中使用networking通信( sock_create() , sock->ops->bind()等)。 问题是会有多个套接字接收数据。 所以我需要在内核空间中模拟select()或poll() 。 由于这些函数使用文件描述符,除非我使用系统调用来创build套接字,否则我不能使用系统调用,但是由于我在内核中工作,这似乎没有必要。 所以我想在我自己的处理程序( custom_sk_data_ready() )中包装默认的sock->sk_data_ready处理程序,这将解锁信号量。 然后,我可以编写我自己的kernel_select()函数,试图locking信号量并进行阻塞,直到它打开。 这样内核函数进入hibernate状态,直到信号量被custom_sk_data_ready()解锁。 一旦kernel_select()获得locking,它将解锁并调用custom_sk_data_ready()来重新locking它。 所以唯一额外的初始化是在绑定套接字之前运行custom_sk_data_ready() ,所以第一次调用custom_select()不会错误地触发。 我看到一个可能的问题。 如果发生多个接收,则多次调用custom_sk_data_ready()将尝试解锁信号量。 所以为了不丢失多个调用并跟踪正在使用的sock ,必须有一个表或指向正在使用的套接字的指针列表。 而custom_sk_data_ready()将不得不在表/列表中标记它传递的套接字。 这种方法听起来吗? 或者,当我使用标准的系统调用时,我应该努力解决用户/内核空间问题? 初始发现: 在中断上下文中调用sock结构中的所有callback函数。 这意味着他们无法入睡。 为了允许主内核线程在就绪套接字列表上hibernate,使用了互斥锁,但是custom_sk_data_ready()必须像互斥锁一样在互斥mutex_trylock()重复(调用mutex_trylock() )。 这也意味着任何dynamic分配都必须使用GFP_ATOMIC标志。 附加可能性: 对于每个打开的套接字,将每个套接字的sk_data_ready()replace为一个自定义的( custom_sk_data_ready() ),并创build一个worker( struct work_struct )和工作队列( struct workqueue_struct )。 一个普通的process_msg()函数将被用于每个worker。 创build一个内核模块级别的全局列表,其中每个列表元素都有一个指向套接字的指针并包含worker结构。 当数据在套接字上准备就绪时, custom_sk_data_ready()将执行并find具有相同套接字的匹配列表元素,然后使用list元素的工作队列和worker调用queue_work() 。 然后process_msg()函数将被调用,并且可以通过struct work_struct *参数(一个地址)的内容find匹配的list元素,或者使用container_of()macros来获取包含该列表结构的地址工人结构。 哪种技术最有声音?

python获取上传/下载速度

我想监视我的电脑上传和下载速度。 一个名叫conky的程序已经在conky conf中做了以下的工作: Connection quality: $alignr ${wireless_link_qual_perc wlan0}% ${downspeedgraph wlan0} DLS:${downspeed wlan0} kb/s $alignr total: ${totaldown wlan0} 当我浏览时,它几乎可以实时显示我的速度。 我想能够使用python访问相同的信息。

你如何改变C ++的IP地址?

我需要在C ++中做一些与networking有关的事情,我通常会在Linux中使用ifconfig做,但是我想这样做而不parsing一组系统调用的输出。 可以使用哪些C或C ++库来判断networking适配器是启动还是closures,读取或更改适配器的IP地址和networking掩码,并更改默认的DNS网关?

如何在C编写一个http1.0代理服务器在Linux?

我必须开发可以在Linux和c中只使用HTTP 1.0的代理服务器。 我需要一些提示开始发展。

什么是接口标识符

笔记本电脑使用一个或多个networking适配器连接到组织的networking。 我正在尝试编写一个工具来持续监视每个networking的连接状态和连接质量。 然而,我的networking知识受限制和术语混淆了我。 具体查找所有networking适配器。 有人build议我使用ifconfig命令,它给了我所谓的“接口标识符”。 例如: ['lo0', 'gif0', 'stf0', 'en0', 'en1', 'en2', 'bridge0', 'p2p0'] 我不太清楚这是如何帮助我解决我的问题,因为我不知道接口标识符是什么,我不知道如何利用这些信息。 我的假设是,他们代表一台计算机或networking中的路由器。 如果有人能够澄清这一点,或以通俗的话来向我解释,这将是非常有帮助的。

我可以使用Watir从没有监视器的Linux服务器上的网站上刮取数据吗?

我可以使用Watir从网站(使用AJAX),但在没有监视器的Linux服务器上抓取数据? (linode.com)?

如何避免在Linux中通过本地堆栈进行路由

我有以下的环境:2个主机,每个主机有2个以太网接口(如下图所示): +———+ +———+ | (1)+—————+(2) | | host1 | | host2 | | | | | | (3)+—————+(4) | +———+ +———+ 我想编写客户端/服务器套接字工具,将打开host1上的客户端和服务器套接字。 我希望客户端通过接口(1)和服务器发送TCP数据包在接口(3)上侦听,数据包将通过主机2。 通常,Linux堆栈将通过本地TCP / IP堆栈路由这些数据包,而不会将这些数据包发送到host2。 我曾尝试使用SO_BINDTODEVICE选项的服务器和客户端,似乎服务器确实是绑定到接口(3),并没有监听本地主机的stream量。 我检查过来自host1的客户端不能被接受,而来自host2的客户端却不能接受。 不幸的是,通过接口(1)到接口(2)不会发送客户端数据包(即使接口(1)上的tcpdump也看不到数据包)。 当然路由是正确的(我可以ping(2)从(1),(4)从(1),(4)从(3)等)。 我的问题是,如果这是可能的,而不使用自定义的TCP / IP协议栈来实现? 也许我应该尝试将目标IP地址(从客户端)更改为从外部networking(然后将使用默认网关从接口(1) – 接口(2))发送,然后在正在改变那些又改为原来的? 这样的解决scheme是可行的吗? 我在Debian下用C写我的应用程序。 添加更多的细节和说明: 当然对(1) – (2)和(3) – (4)是不同的子网 我想要达到的是(1) – >(2) – >(4) – >(3) host2是黑匣子,所以我不能安装任何数据包转发器(这将打开在接口(2)上的侦听套接字,并转发到(3)通过(4)) – 这是我想要避免的 主要问题似乎是本地交付。 […]

禁用特定接口的networkingpipe理器

我想要禁用特定接口的networkingpipe理器服务。 “/etc/init.d/NetworkManager stop”不会为我的目的服务,因为将停止服务。 请让我知道如何实现这一点。 请仅build议命令/代码 – 我对graphicsconfiguration不感兴趣。 如果已经有一些rpm /补丁可用,请将其提交给我。 我们能否configurationnetworkingpipe理器,使其不会检测到插入系统的新网卡? 提前致谢, Souvik

listen()队列长度在套接字编程在c?

我在Linux中写了两对代码( server.c和client.c )。 一个用于UNIX域AF_UNIX另一个用于INTERNET域AF_INET 。 两者都工作正常! listen()在both servers被称为积压队列长度= 3 listen(sockfd, 3); 在UNIX域(AF_UNIX):当一个客户端连接到服务器,如果我尝试连接更多的客户端到服务器。 三个排队,第四个请求被拒绝。 (正如我所希望的 – 3在等待队列中)。 在INTERNET域(AF_INET):三个以上的请求被保存在待处理的队列中。 即使积压队列长度为三,为什么不是第四个客户端的请求被拒绝? 为什么listen() (和其他)协议的行为依赖于?

在IRQ合并之前,NAPI有哪些优势?

众所周知,有两种方法可以避免在高负载networking中出现硬件中断的一些开销,当硬件中断太多时,切换到它们需要很多时间。 程序风格的performance和select方法是非常重要的。 NAPI(新API) – 不使用硬件中断 ,每隔一段时间轮询以太网设备。 Linux内核默认使用中断驱动模式,当进入的数据包stream量超过一定的阈值时,只能切换到轮询模式。 http://en.wikipedia.org/wiki/New_API内核可以定期检查传入networking数据包的到达而不中断 ,从而消除了中断处理的开销。 中断合并 – 使用硬件中断 ,但是如果发生中断,则禁止中断并在一段时间内开始轮询 ,之后轮询终止并且中断被激活。 https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,其中通常会触发硬件中断的事件被阻止 , 直到一定数量的工作挂起,或超时计时器触发。 两种方法都没有明显的中断成本 – 这对于默认的中断驱动模式是有利的。 但是第二种方法 – 中断合并更合理,因为它: 延迟较less – 一旦包到达,立即尝试立即处理中断,或在最近发生中断时轮询。 对面的NAPI将不会立即处理该帧,而是会等待下一轮的一定时间。 较less的CPU使用率 – 仅在至less有一个数据包已经到达的情况下才开始轮询。 但是,即使帧没有收到,也不是徒劳地进行民意调查,就像做了NAPI一样。 在IRQ合并之前,NAPI有哪些优势?