博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python网络编程之验证客户端链接的合法性
阅读量:5732 次
发布时间:2019-06-18

本文共 2791 字,大约阅读时间需要 9 分钟。

六.socket的更多方法介绍

服务端套接字函数 s.bind()    绑定(主机,端口号)到套接字 s.listen()  开始TCP监听 s.accept()  b被动接收TCP客户的连接,(阻塞式)等待连接的到来 客户端套接字函数 s.connect()     主动初始化TCP服务器连接 s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 s.recv()            接收TCP数据 s.send()            发送TCP数据 s.sendall()         发送TCP数据 s.recvfrom()        接收UDP数据 s.sendto()          发送UDP数据 s.getpeername()     连接到当前套接字的远端的地址 s.getsockname()     当前套接字的地址 s.getsockopt()      返回指定套接字的参数 s.setsockopt()      设置指定套接字的参数 s.close()           关闭套接字 面向锁的套接字方法 s.setblocking()     设置套接字的阻塞与非阻塞模式 s.settimeout()      设置阻塞套接字操作的超时时间 s.gettimeout()      得到阻塞套接字操作的超时时间 面向文件的套接字的函数 s.fineno()          套接字的文件描述符 s.makefile()        创建一个与该套接字相关的文件 sned和sendall方法 send()的返回值是发送的字节数量,这个数量值可能小于要发送的string的字节数,也就是说可能无法发送string中的所有数据。如果有错误则会抛出异常 sendall()尝试发送string的所有数据,成功则返回None,失败则抛出异常。故下面两端代码是等价的: #sock.sendall('Hello world\n') #buffer = 'Hello world\n' #while buffer: #    bytes = sock.send(buffer) #    buffer = buffer[bytes:]

七.验证客户端链接的合法性

如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现

服务端:

from socket import *import hmac, ossecret_key = b'linhaifeng bang bang bang'def conn_auth(conn):    # 认证客户端连接    print('开始验证新链接的合法性')    msg = os.urandom(32)  # 随机数长度    conn.sendall(msg)  # 发送随机数长度    h = hmac.new(secret_key, msg)    digest = h.digest()    respone = conn.recv(len(digest))  # 加密后的随机数长度    return hmac.compare_digest(respone, digest)def data_handler(conn, bufsize=1024):    if not conn_auth(conn):        print('该链接不合法,关闭')        conn.close()        return    print('链接合法,开始通信')    while True:        data = conn.recv(bufsize)        if not data: break        conn.sendall(data.upper())def server_handler(ip_port, bufsize, backlog=5):    tcp_socket_server = socket(AF_INET, SOCK_STREAM)    tcp_socket_server.bind(ip_port)    tcp_socket_server.listen(backlog)    while True:        conn, addr = tcp_socket_server.accept()        print('新连接(%s:%s)' % (addr[0], addr[1]))        data_handler(conn, bufsize)

 客户端:

from socket import *import hmac,ossecret_key = b'linhaifeng bang bang bang'def conn_auth(conn):    msg = conn.recv(32)    h = hmac.new(secret_key,msg)    digest = h.digest()    conn.sendall(digest)def client_handler(ip_port,bufsize=1024):    tcp_socket_client = socket(AF_INET,SOCK_STREAM)    tcp_socket_client.connect(ip_port)    conn_auth(tcp_socket_client)    while True:        data = input('>>>').strip()        if not data: continue        if data == 'quit': break        tcp_socket_client.sendall(data.encode('utf-8'))        respone = tcp_socket_client.recv(bufsize)        print(respone.decode('utf-8'))    tcp_socket_client.close()if __name__ == '__main__':    ip_port = ('127.0.0.1',9999)    bufsize = 1024    client_handler(ip_port,bufsize)

  

 

转载于:https://www.cnblogs.com/Black-rainbow/p/9011326.html

你可能感兴趣的文章
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
[NPM] Run npm scripts in series
查看>>
vs2013修改书签(vs书签文件位置)
查看>>
BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]
查看>>
C语言学习笔记
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
PS 如何使用液化工具给人物减肥
查看>>
cvc-complex-type.2.4.c: The matching wildcard...
查看>>
android 读取json数据(遍历JSONObject和JSONArray)
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
<JavaScript语言精粹>-读书笔记(一)
查看>>
NPM教程
查看>>
Java学习笔记(40)——Java集合12之fail-fast
查看>>
Centos 配置IP的方式
查看>>
Go 的吉祥物,萌不萌
查看>>
Java 的swing.GroupLayout布局管理器的使用方法和实例
查看>>
Android中Activity和Fragment的生命周期的对比
查看>>
C++Primer_笔记_异常处理
查看>>
分区交换 alter table exchange partition 在线表 历史表交换
查看>>