IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> dtls通信(2) -> 正文阅读

[Python知识库]dtls通信(2)

客户端代码:

import ssl
import sys
from os import path
from socket import socket, AF_INET, SOCK_DGRAM

from dtls import do_patch
# from past.builtins import raw_input

do_patch()

blocksize = 1024

def main():
    cert_path = path.join(path.abspath(path.dirname(__file__)), "certs")
    s = ssl.wrap_socket(socket(AF_INET, SOCK_DGRAM), cert_reqs= ssl.CERT_NONE, ca_certs = path.join(cert_path, 'ca-cert.pem'))
    s.connect(('127.0.0.1', 28000))


    # data transfer
    try:
        while True:
            print("input is <dir> to list files in dir.\n")
            print("input get <filename> to get files from dir.\n")
            # send_msg = raw_input(">")
            send_msg = input(">")
            cmd, filename = send_msg.split(" ")
            try:
                s.send(send_msg.encode())
            except Exception as e:
                print("[-]Can not send data")

            try:
                if cmd == "ls":
                    data = s.recv(blocksize)
                    print(data.decode())
                else:
                    filename = filename.split("/")[-1]
                    filedir = "./" + filename
                    with open(filedir, "wb") as fd:
                        while True:
                            data = s.recv(blocksize)
                            if data.decode() == "Already Send":
                                print("Already Receive.")
                                break
                            fd.write(data)
            except Exception as e:
                print("[-]Can not receive Data")

    except KeyboardInterrupt:
        s.close()
        sys.exit(0)

if __name__ == "__main__":
    main()

服务端代码:


# socket build communication
import socket
import subprocess
from os import path
from logging import basicConfig, DEBUG
basicConfig(level=DEBUG)
from dtls.sslconnection import SSLConnection
from dtls.err import SSLError, SSL_ERROR_WANT_READ, SSL_ERROR_ZERO_RETURN


blocksize = 1024
def main():
    current_path = path.abspath(path.dirname(__file__))
    cert_path = path.join(current_path, "certs")
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sck.bind(("127.0.0.1", 28000))
    sck.settimeout(30)

# sslconnection socket to dtls

    scn = SSLConnection(
        sck,
        keyfile = path.join(cert_path, "keycert.pem"),
        certfile = path.join(cert_path, "kercert.pem"),
        server_side=True,
        ca_certs=path.join(cert_path, "ca-cert.pem"),
        do_handshake_on_connect=False
    )


# listen
    cnt = 0
    while True:
        cnt += 1
        peer_address = scn.listen()
        if peer_address:
            print("Comleted listening for peer: %s" % str(peer_address))
            break
        else:
            print("continue")
            continue

    print("Accepting...")
    conn = scn.accept()[0]
    sck.settimeout(5)
    conn.get_socket(True).settimeout(5)

    #blocksize = 1024

# handshake
    cnt = 0
    while True:
        cnt += 1
        try:
            conn.do_handshake()
        except SSLError as err:
            if err.errno == 504:
                continue
            raise
        print("Completed handshaking with peer")
        break


# data transfer
    cnt = 0
    while True:
        cnt += 1
        try:
            message = conn.read()
        except SSLError as err:
            if err.errno == 502:
                continue
            if err.args[0] == SSL_ERROR_ZERO_RETURN:
                break
            raise



    # remote ls
        data = message.decode()
        print("from client: ", data)
        cmd_filename = data.split(' ')
        if cmd_filename[0] != "ls" and cmd_filename[0] != "get":
            conn.write("please input true cmd")
            continue
        else:
            if cmd_filename[0] == "ls":
                obj = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE)
                cmd_result = obj.stdout.read()
                conn.write(cmd_result)



    # remote get
            else:
                filename = cmd_filename[1]
                if filename[0] == "/":
                    filedir = filename
                else:
                    if filename[:2] == "./":
                        filename = filename[2:-1]
                    filedir = path.join(current_path, filename)
                with open(filedir, "r") as fd:
                    while True:
                        byte = fd.read(blocksize)
                        if not byte:
                            conn.write("Already Send".encode())
                            break
                        conn.write(byte.encode())


# unwrap
    cnt = 0
    while True:
        cnt += 1
        print("Shutdown inovocation: %d" % cnt)
        try:
            s = conn.unwrap()
            s.close()
        except SSLError as err:
            if err.errno == 502:
                continue
            raise
        break

    sck.close()
    pass

if __name__ == "__main__":
    main()

相关链接

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:06:36  更:2022-04-04 12:08:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 2:50:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计