`
tiantian911
  • 浏览: 223279 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rawsocket

阅读更多
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的函数主要有三个方面,处理连接,读和写。
分享到:
评论

相关推荐

    C#raw Socket编程

    接着,定义RawSocket类,包括error_occurred、KeepRunning、len_receive_buf、receive_buf_bytes和socket等参数。最后,实现构造函数,初始化变量参数。 C#raw Socket编程的应用场景: 1. 网络封包监视 2. 网络...

    基于raw socket的UDP数据的发送和接收

    在计算机网络编程中,Raw Socket是一种底层的网络通信机制,允许程序员直接操作网络协议的细节,包括IP头、TCP头、UDP头等。本篇将深入探讨如何利用Raw Socket进行基于UDP的数据发送与接收,以及自定义这些头部信息...

    IP包读取分析(raw socket)

    本篇将重点探讨"IP包读取分析(raw socket)"这一主题,特别关注在Windows环境下如何使用raw socket进行网络通信。 首先,我们需要理解什么是raw socket。Raw socket是一种允许程序员访问网络协议栈的底层接口,它...

    linux下使用RAW SOCKET接收LLDP报文并解析LLDP报文

    1. **RAW SOCKET创建**:使用`socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))`创建一个RAW SOCKET,其中`ETH_P_ALL`表示接收所有类型的以太网帧。 2. **绑定到网络接口**:使用`bind`函数将RAW SOCKET与特定的网络...

    用C#的Raw Socket实现网络封包监视

    CreateAndBind函数实现了创建RawSocket,并把它与终结点(IPEndPoint:本机IP和端口)绑定。 网络封包监视的应用 网络封包监视技术可以应用于各种场景,包括网络安全、性能优化、流量监控等方面。例如,可以使用...

    RawSend_RawSocket基于MAC发送_sock_raw_C++_原始Socket发送_

    RawSocket是一种低级别的网络编程接口,它允许程序员直接与网络协议栈交互,而不依赖于操作系统提供的高级抽象。在本主题中,“RawSend_RawSocket基于MAC发送_sock_raw_C++_原始Socket发送_”指的是使用C++语言通过...

    利用rawsocket实现本机网络报文监控解析

    例如,`RawSocketTest.cpp`和`RawSocket_Test.cpp`可能包含测试Raw Socket功能的代码,而`PacketStruct.h`可能定义了用于存储和解析报文结构的类或结构体。`NetCapture`系列的文件可能是项目工程文件,用于编译和...

    raw socket来实现ip报文的发送

    在计算机网络编程中,Raw Socket是一种允许程序员直接与网络协议层交互的机制,它绕过了操作系统提供的高层协议栈,如TCP或UDP。标题提到的"raw socket来实现ip报文的发送"涉及到的是利用Raw Socket直接构建并发送IP...

    利用RawSocket实现简单的Ping程序 ICMP协议

    本话题主要关注如何利用C++编程语言和Linux操作系统下的Raw Socket来实现一个简单的Ping程序,这对于网络程序员来说是一个基础但至关重要的技能。Raw Socket允许我们直接操作网络层的数据包,而不必通过更高级的TCP...

    多线程实现无连接的Raw Socket通信.rar

    Raw Socket通信是网络编程中的一个高级技术,它允许程序员直接操作网络协议的细节,绕过操作系统提供的更高层次的网络服务。在本项目中,我们关注的是如何在Windows环境下,利用多线程技术来实现无连接的Raw Socket...

    rawsocket抓包侦听

    **rawsocket抓包侦听**是一种网络数据包捕获技术,它通过使用操作系统底层的原始套接字(raw sockets)来直接访问网络层的数据包,而不是通过应用层协议(如TCP或UDP)进行通信。这种方法使得开发者可以直接查看和...

    RawSocket在链路层的收发,arp,多线程指定网守发示例

    RawSocket在链路层的收发,arp,多线程指定网守发示例

    raw socket 大合集

    **原始套接字(Raw Socket)深度解析** 原始套接字,或称为“raw socket”,在计算机网络编程中扮演着重要角色。它允许程序员访问网络协议的底层细节,包括IP和TCP/IP协议栈的直接交互。这个大合集提供了一系列关于...

    rawsocket抓包工具源码

    本文将围绕“rawsocket抓包工具源码”这一主题,深入探讨其背后的原理和技术实现。 首先,我们要理解什么是Raw Socket。Raw Socket是操作系统提供的一个低级别的网络编程接口,允许程序员直接与网络协议栈交互,而...

    基于Raw Socket的数据包捕获程序

    标题中的“基于Raw Socket的数据包捕获程序”指的是使用计算机网络编程中的Raw Socket技术来实现一个数据包捕获工具。Raw Socket允许程序直接与网络层交互,而不通过传输层(如TCP或UDP)。这种技术在网络安全分析、...

    raw socket demo

    在压缩包文件名称列表中,"rawsocket"可能是源代码文件或相关资源文件的名称。实际操作时,可以解压该文件,查看源代码以了解如何在具体编程语言中实现raw socket的功能。 总结,raw sockets提供了一种直接与网络...

    通过rawsocket实现报文侦听拦截

    本话题将围绕“通过rawsocket实现报文侦听拦截”这一主题,深入探讨其背后的原理和技术实现。 首先,`rawsocket`是操作系统提供的一种网络编程接口,允许程序员直接操作网络数据包,而不是通过更高级别的协议栈(如...

    raw socket编程例子

    **原始套接字(Raw Socket)编程是一种在低级别上操作网络协议的技术,它允许程序员直接与网络协议栈交互,而不依赖于高级别的应用程序接口(API)。在本篇中,我们将深入探讨原始套接字的工作原理、使用场景以及...

    udp_raw.rar_RAW_raw socket_raw socket delphi_raw_socket _udp_raw

    本文将详细解析标题“udp_raw.rar_RAW_raw socket_raw socket delphi_raw_socket _udp_raw”中涉及的知识点,以及描述中提到的使用raw_socket创建UDP Socket的相关内容。 1. **UDP (用户数据报协议)** UDP是一种无...

    Linux环境下基于Raw socket技术的多线程追击抓包法.pdf

    【Linux环境下基于Raw socket技术的多线程追击抓包法】 随着网络技术的飞速发展,网络安全分析和网络协议的监测变得至关重要。传统的抓包工具,如libpcap,虽然在很多方面提供了便利,但在面对高速网络环境时,由于...

Global site tag (gtag.js) - Google Analytics