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

websocket和tap使用select关联

阅读更多
c语言的socket基础http://haoningabc.iteye.com/blog/2305026

python的socket基础+select的方式http://haoningabc.iteye.com/blog/2305036

之后改造jslinux-network
把websocket和tap绑定
注意改了源码保证多个浏览器客户端可以同时ping通10.0.2.1

加的代码为
外层
共有变量
tuntapFD=-1
内层websocket代码
web_socket_transfer_data中添加
    global tuntapFD
    if(tuntapFD == -1):
        tuntapFD, x, y = setupTUNTAP()


完整代码为

import sys, os, struct, select

import base64

netBufferExpected = 0

def web_socket_do_extra_handshake(request):
    """Received Sec-WebSocket-Extensions header value is parsed into
    request.ws_requested_extensions. pywebsocket creates extension
    processors using it before do_extra_handshake call and never looks at it
    after the call.

    To reject requested extensions, clear the processor list.
    """

    # for easier debugging:
    request.ws_extension_processors = []
tuntapFD=-1
def web_socket_transfer_data(request):
    """Echo. Same as echo_wsh.py."""

    global tuntapFD
    if(tuntapFD == -1):
        tuntapFD, x, y = setupTUNTAP()
    print("--->tuntapFD end:"+str(tuntapFD))
    # FIXME according to this post from 2010:
    #   https://groups.google.com/forum/#!topic/pywebsocket/MY6HoG4KRCA
    # this method for fetching requestFD only works for standalone server
    requestFD = request.connection._request_handler.rfile._sock.fileno()
    socketlist = {
        requestFD:'websocket',
        #sys.stdin:'stdio',
        tuntapFD: 'tuntap'
    }

    netBuffer = ""
    while True:
        inputSockets = socketlist.keys()
        outputSockets = []
        errorSockets = []
        (inputReady, outputReady, errorOccurred) = select.select(inputSockets, outputSockets, errorSockets, 1)
        for each in inputReady:
                if socketlist[each] == 'websocket':
                    netBuffer = process_requestFD(request, netBuffer)
                elif socketlist[each] == 'tuntap':
                    output = os.read(tuntapFD, 8192)
                    output = struct.pack('!H', len(output)) + output # network byte order short is "tapper"'s header
                    request.ws_stream.send_message(output, binary=True)
     
def process_requestFD(request, netBuffer):
    global netBufferExpected
    message = request.ws_stream.receive_message()
    if message is None:
        return netBuffer

    if isinstance(message, unicode):
        # text message - ignore it
        incomingData = base64.decodestring(message)
        pass
    else:
        incomingData = message #base64.decodestring(aNode.getCDATA())
    if 1: # temp
        netBuffer += incomingData
        while len(netBuffer) >= netBufferExpected:
            if len(netBuffer) > 0 and netBufferExpected > 0:
                print " GOT ALL DATA!"
                try:
                    dataToWrite = netBuffer[:netBufferExpected]
                    print "  (writing " + str(len(dataToWrite)) + " bytes)"
                    os.write(tuntapFD, dataToWrite)
                    netBuffer = netBuffer[netBufferExpected:]
                    netBufferExpected = 0
                    print "  (data remaining in buffer: " + str(len(netBuffer)) + ")"
                except Exception, e:
                    print "problem"
                    print e

            if len(netBuffer) > 2:
                netBufferExpected = struct.unpack('!H', netBuffer[0:2])[0]
                #netBufferExpected = socket.ntohs(netBufferExpected)
                netBuffer = netBuffer[2:]
                print " NOW EXPECTING " + str(netBufferExpected)
                if netBufferExpected > 1500 * 2: # more than 2x MTU? something is wrong
                    print "  (which is more than 2x MTU, so giving up)"
                    netBuffer = ""
                    netBufferExpected = 0

            if len(netBuffer) == 0 and netBufferExpected == 0:
                break
    return netBuffer

def setupTUNTAP():
    #tuntapDevice = "tap2"
    tuntapDevice = "net/tun"
#   if len(sys.argv) >= 2:
#       tuntapDevice = sys.argv[1]
    ipAddress = "10.0.2.1"
#   if len(sys.argv) >= 3:
#       ipAddress = sys.argv[2]
    tuntapFD = os.open("/dev/" + tuntapDevice, os.O_RDWR)
    if tuntapDevice == "net/tun":
        # Linux specific code
        TUNSETIFF = 0x400454ca
        IFF_TUN   = 0x0001
        IFF_TAP   = 0x0002
        IFF_NO_PI = 0x1000

        TUNMODE = IFF_TAP
        TUNMODE |= IFF_NO_PI # do not prepend protocol information

        from fcntl import ioctl

        ifs = ioctl(tuntapFD, TUNSETIFF, struct.pack("16sH", "websockettuntap%d", TUNMODE))
        tuntapDevice = ifs[:16].strip("\x00")
        sys.stderr.write("tuntapdevice: " + tuntapDevice + "\n")

    os.system("ifconfig " + tuntapDevice + " inet " + ipAddress);

    return (tuntapFD, tuntapDevice, ipAddress)

# vi:sts=4 sw=4 et


去happy吧
https://bitbucket.org/ivucica/websocketstuntap/
分享到:
评论

相关推荐

    微信小程序webSocket的使用方法

    本篇博客介绍微信小程序中webSocket的使用方法,以及如何用局部网络建立webSocket连接,进行客户端与服务器之间的对话: webSocket简介 微信小程序端API调用 服务器端使用nodejs配置 演示websocket webSocket...

    websocket全局使用.docx

    在Vue.js项目中,我们可以利用WebSocket实现全局的使用,以便在整个应用中轻松地发送和接收数据。以下是如何在Vue CLI 3构建的项目中全局使用WebSocket的详细步骤: 1. **创建WebSocket服务端** 首先,你需要在...

    通过websocket和fastreport控件进行打印

    值得注意的是,为了保证数据的安全性和完整性,通常会在WebSocket消息中使用JSON或其他结构化格式封装数据。在解析这些数据时,需要确保正确解码并转化为FastReport能够识别的格式。同时,考虑到错误处理和异常情况...

    Spring+Netty+WebSocket实例

    2. **创建WebSocket端点**:使用Spring的`@ServerEndpoint`注解定义WebSocket连接的端点,处理连接建立、消息发送和断开连接等生命周期事件。 3. **Netty服务器**:创建一个Netty服务器,配置WebSocket服务器通道...

    在openwrt中使用websocket,基于makefile。

    在OpenWRT上运行WebSocket服务器需要注意的是,由于资源限制,可能需要优化代码以降低内存和CPU的使用。此外,为了安全考虑,可能需要配置防火墙规则,允许特定端口的WebSocket连接,并确保服务器的代码没有安全漏洞...

    websocket的c#使用demo

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许...通过以上内容,你可以了解如何在C#中使用WebSocket-sharp库实现WebSocket服务器和客户端。实际开发中,可以根据项目需求进行更深入的定制和优化。

    Unity3D插件BestHttp,用于做websocket使用

    2. **配置WebSocket连接**:在Unity脚本中,使用BestHttp提供的WebSocket类来创建和管理连接。你需要指定WebSocket服务器的URL,并设置相应的连接参数。 3. **建立连接**:调用WebSocket的Open方法来建立与服务器的...

    websocket使用案例

    3. **心跳机制**:为了检测连接是否正常,WebSocket连接通常会使用心跳机制,即客户端和服务器周期性地发送空数据帧来确认连接状态。 4. **JavaScript API**:在JavaScript中,WebSocket对象提供了一组API来创建、...

    thinkphp6使用workerman websocket连接

    在IT行业中,WebSocket是一种在客户端和服务器之间建立长连接的网络通信协议,它极大地提高了实时通信的效率。本文将深入探讨在ThinkPHP6框架中如何使用Workerman库来实现WebSocket连接,以及相关的技术要点。 首先...

    使用Fleck和WebSocketSharp实现WebStock通信

    本主题聚焦于使用Fleck和WebSocketSharp两个库来实现WebSocket通信,这主要用于创建一个实时、双向的通信渠道,常见于股票交易系统、在线游戏等场景。在Windows桌面应用程序(Winform)开发中,C#语言提供了丰富的库...

    websocket从服务端获取图片

    例如,`@ServerEndpoint`注解用于标识一个处理WebSocket连接的类,而`onMessage`方法则用于接收和处理来自客户端的消息。 3. 创建WebSocket服务端点: 在Java中,我们定义一个带有`@ServerEndpoint`注解的类,如`...

    安卓websocket(客服端和服务端写在app端) 案例

    可以使用WebSocket测试工具,如Chrome的`websocket.org/echo.html`,或者开发专用的测试客户端,检查连接、消息发送和接收的正确性。 7. **注意事项** - Android系统的网络限制:由于安卓的网络权限管理,确保...

    基于springboot实现websocket客户端和服务端

    使用Springboot集成的websocket需要使用到以下几个类/接口: WebSocketHandler:WebSocket消息以及生命周期事件的处理器。 WebSocketConfigurer:对WebSocket进行配置,包括配置拦截器、配置接口地址。 ...

    WebSocket教程

    在实际应用中,你可以使用各种编程语言和框架来实现WebSocket服务。例如,对于Node.js,可以使用`ws`库;在Python中,可以选择`Flask-SocketIO`或`Sanic-WebSocket`。这些库提供了创建WebSocket服务器、监听连接、...

    C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    在使用WebSocket Sharp时,可以通过以下方式创建和操作WebSocket实例: 1. **WebSocket 客户端**: - 首先,引入必要的命名空间`using WebSocketSharp;` - 使用`new WebSocket("ws://服务器地址")`创建一个新的...

    展示tio-websocket的用法,t-io官方提供的唯一tio-websocket示范教程,包括wss和监控等高级特性

    本文将深入探讨`tio-websocket`的使用方法,它是由`t-io`官方提供的唯一WebSocket示例教程,涵盖了包括WSS安全连接和监控在内的高级特性。`t-io`是一个高性能、易用的Java NIO框架,而`tio-websocket`是其专门针对...

    WebSocket的Java和Tomcat7使用示例

    ### WebSocket的Java和Tomcat7使用详解 #### 一、WebSocket简介 随着互联网技术的不断发展,Web应用变得越来越复杂,传统的HTTP协议已经无法满足实时通信的需求。为了改善这一状况,HTML5引入了WebSocket协议,这...

    java tomcat 7.0.42 websocket可使用

    java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用java tomcat 7.0.42 websocket可使用

    http-websocket代理,实现websocket请求就像操作http请求一样,有使用说明

    3. **连接WebSocket**:解释如何通过代理服务器连接到目标WebSocket服务器,包括ws和wss(加密的WebSocket)协议的使用。 4. **数据传输**:描述数据如何在HTTP客户端和WebSocket服务器之间通过代理进行传递,可能...

Global site tag (gtag.js) - Google Analytics