Tracker的socket部分都是封装在一个rawserver类中,一切的网络调用都不通过socket包,直接调用封装类。这个类就在bittorrent/rawserver.py中。
采用poll实现的非阻塞的socket,下面是pollfd:
struct pollfd {
int fd; /* 文件描述符 */
short events; /* 等待的事件 */
short revents; /* 实际发生了的事件 */
};
下面是一个unix c的例子,摘自UNIX Programming FAQ 中文版 v0.1.0
/* 检测两个文件描述符,分别为一般数据和高优先数据。如果事件发生
则用相关描述符和优先度调用函数handler(),无时间限制等待,直到
错误发生或描述符挂起。*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <stropts.h>
#include <poll.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define NORMAL_DATA 1
#define HIPRI_DATA 2
int poll_two_normal(int fd1,int fd2)
{
struct pollfd poll_list[2];
int retval;
poll_list[0].fd = fd1;
poll_list[1].fd = fd2;
poll_list[0].events = POLLIN|POLLPRI;
poll_list[1].events = POLLIN|POLLPRI;
while(1)
{
retval = poll(poll_list,(unsigned long)2,-1);
/* retval 总是大于0或为-1,因为我们在阻塞中工作 */
if(retval < 0)
{
fprintf(stderr,"poll错误: %s\n",strerror(errno));
return -1;
}
if(((poll_list[0].revents&POLLHUP) == POLLHUP) ||
((poll_list[0].revents&POLLERR) == POLLERR) ||
((poll_list[0].revents&POLLNVAL) == POLLNVAL) ||
((poll_list[1].revents&POLLHUP) == POLLHUP) ||
((poll_list[1].revents&POLLERR) == POLLERR) ||
((poll_list[1].revents&POLLNVAL) == POLLNVAL))
return 0;
if((poll_list[0].revents&POLLIN) == POLLIN)
handle(poll_list[0].fd,NORMAL_DATA);
if((poll_list[0].revents&POLLPRI) == POLLPRI)
handle(poll_list[0].fd,HIPRI_DATA);
if((poll_list[1].revents&POLLIN) == POLLIN)
handle(poll_list[1].fd,NORMAL_DATA);
if((poll_list[1].revents&POLLPRI) == POLLPRI)
handle(poll_list[1].fd,HIPRI_DATA);
}
}
具体的代码在listen_forever中出现,主体是一个无限循环,只有doneflag可以终止,根据任务的队列去poll各个period,每个period就是self.funcs[0][0] - bttime(),得到的结果就是event,然后把各个event给handle_event去处理。
handle的函数主要有三个方面,处理连接,读和写。
分享到:
相关推荐
接着,定义RawSocket类,包括error_occurred、KeepRunning、len_receive_buf、receive_buf_bytes和socket等参数。最后,实现构造函数,初始化变量参数。 C#raw Socket编程的应用场景: 1. 网络封包监视 2. 网络...
在计算机网络编程中,Raw Socket是一种底层的网络通信机制,允许程序员直接操作网络协议的细节,包括IP头、TCP头、UDP头等。本篇将深入探讨如何利用Raw Socket进行基于UDP的数据发送与接收,以及自定义这些头部信息...
本篇将重点探讨"IP包读取分析(raw socket)"这一主题,特别关注在Windows环境下如何使用raw socket进行网络通信。 首先,我们需要理解什么是raw socket。Raw socket是一种允许程序员访问网络协议栈的底层接口,它...
1. **RAW SOCKET创建**:使用`socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))`创建一个RAW SOCKET,其中`ETH_P_ALL`表示接收所有类型的以太网帧。 2. **绑定到网络接口**:使用`bind`函数将RAW SOCKET与特定的网络...
CreateAndBind函数实现了创建RawSocket,并把它与终结点(IPEndPoint:本机IP和端口)绑定。 网络封包监视的应用 网络封包监视技术可以应用于各种场景,包括网络安全、性能优化、流量监控等方面。例如,可以使用...
RawSocket是一种低级别的网络编程接口,它允许程序员直接与网络协议栈交互,而不依赖于操作系统提供的高级抽象。在本主题中,“RawSend_RawSocket基于MAC发送_sock_raw_C++_原始Socket发送_”指的是使用C++语言通过...
例如,`RawSocketTest.cpp`和`RawSocket_Test.cpp`可能包含测试Raw Socket功能的代码,而`PacketStruct.h`可能定义了用于存储和解析报文结构的类或结构体。`NetCapture`系列的文件可能是项目工程文件,用于编译和...
在计算机网络编程中,Raw Socket是一种允许程序员直接与网络协议层交互的机制,它绕过了操作系统提供的高层协议栈,如TCP或UDP。标题提到的"raw socket来实现ip报文的发送"涉及到的是利用Raw Socket直接构建并发送IP...
本话题主要关注如何利用C++编程语言和Linux操作系统下的Raw Socket来实现一个简单的Ping程序,这对于网络程序员来说是一个基础但至关重要的技能。Raw Socket允许我们直接操作网络层的数据包,而不必通过更高级的TCP...
Raw Socket通信是网络编程中的一个高级技术,它允许程序员直接操作网络协议的细节,绕过操作系统提供的更高层次的网络服务。在本项目中,我们关注的是如何在Windows环境下,利用多线程技术来实现无连接的Raw Socket...
**rawsocket抓包侦听**是一种网络数据包捕获技术,它通过使用操作系统底层的原始套接字(raw sockets)来直接访问网络层的数据包,而不是通过应用层协议(如TCP或UDP)进行通信。这种方法使得开发者可以直接查看和...
RawSocket在链路层的收发,arp,多线程指定网守发示例
**原始套接字(Raw Socket)深度解析** 原始套接字,或称为“raw socket”,在计算机网络编程中扮演着重要角色。它允许程序员访问网络协议的底层细节,包括IP和TCP/IP协议栈的直接交互。这个大合集提供了一系列关于...
本文将围绕“rawsocket抓包工具源码”这一主题,深入探讨其背后的原理和技术实现。 首先,我们要理解什么是Raw Socket。Raw Socket是操作系统提供的一个低级别的网络编程接口,允许程序员直接与网络协议栈交互,而...
标题中的“基于Raw Socket的数据包捕获程序”指的是使用计算机网络编程中的Raw Socket技术来实现一个数据包捕获工具。Raw Socket允许程序直接与网络层交互,而不通过传输层(如TCP或UDP)。这种技术在网络安全分析、...
在压缩包文件名称列表中,"rawsocket"可能是源代码文件或相关资源文件的名称。实际操作时,可以解压该文件,查看源代码以了解如何在具体编程语言中实现raw socket的功能。 总结,raw sockets提供了一种直接与网络...
本话题将围绕“通过rawsocket实现报文侦听拦截”这一主题,深入探讨其背后的原理和技术实现。 首先,`rawsocket`是操作系统提供的一种网络编程接口,允许程序员直接操作网络数据包,而不是通过更高级别的协议栈(如...
**原始套接字(Raw Socket)编程是一种在低级别上操作网络协议的技术,它允许程序员直接与网络协议栈交互,而不依赖于高级别的应用程序接口(API)。在本篇中,我们将深入探讨原始套接字的工作原理、使用场景以及...
本文将详细解析标题“udp_raw.rar_RAW_raw socket_raw socket delphi_raw_socket _udp_raw”中涉及的知识点,以及描述中提到的使用raw_socket创建UDP Socket的相关内容。 1. **UDP (用户数据报协议)** UDP是一种无...
【Linux环境下基于Raw socket技术的多线程追击抓包法】 随着网络技术的飞速发展,网络安全分析和网络协议的监测变得至关重要。传统的抓包工具,如libpcap,虽然在很多方面提供了便利,但在面对高速网络环境时,由于...