Python的socket网络编程)(一)

(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正。)

先写首诗,抒抒情。

一、

食堂、校园

见过你那么多次

卑微的我

只敢偷偷瞄上一眼

心扑通

扑通

春天真好

不是么

二、

学子、银桦

期待再一次见你

害羞的我

却敢四处张望

眼睛

一眨一眨

你在哪里

可否知道

三、

阴郁的早晨

一片混沌

相见

是为了什么

怀念

是自我麻痹

银杏路上

别来无恙

四、

天空

有你的影子

似一缕青烟

随风

慢慢

慢慢

慢慢

在我心中散去

(摘自河畔---最近在水河畔)

写的真好,不是吗?看到这首某大神的诗,我仿佛又回到了大学,那时候时光真好,不是吗?可惜我没有好好珍惜

开始正文吧

最近实验局的portal服务器挂了,又赶上国庆假期快要到了,修复估计无望。在这个背景下,超哥想让我用Python写一个portal服务器,不假思索,就被我拒绝了(这是没把我当人,把我当神了吧)。最后我俩讨价还价(就差打起来了),终于得到一个比较能接受的条件---做一个模拟portal服务器,只进行收发UDP包工作,瞬间我的心就暖了。

介绍一下基本过程吧。

一、正常的portal流程

上图中172.17.226.99是portal服务器地址,10.6.61.83是云AC 的地址。

流程:首先portal服务器向云AC发送REQ_CHALLENGE请求,云AC回复ACK;portal服务器收到后再次向云AC发送REQ_AUTH请求,云AC回复ACK。(主要过程就是上面四步,是不是很简单

二、Python模拟的portal服务器设计思路

1. 制作满足要求的REQ_CHALLENGE报文,通过UDP协议向云AC发送

2. 等待云AC的回包,设置1S的时延(timeout),确认收到回包后

3. 解析、判断回包的UDP报文是否满足ACK_CHALLENGE要求

4. 如果满足,通过收到回包的报文内容,构造特定的REQ_AUTH报文,向云AC发送

5. 等待回包,收到ACK_AUTH包后

6. 判断ACK_AUTH报文是否符合要求,如果符合,则结束

7. 因为单个循环大约需要0.5s,达不到一般portal服务器的压力,需要加入多线程并发。

三、共享部分核心代码

import socket
import binascii
import time
BUF_SIZE = 1024
server_addr = (‘10.6.61.83‘,2000)     #云AC的地址
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #建立UDP
client.bind((‘10.6.61.15‘,6985))     #绑定端口号,10.6.61.15为本机地址(模拟portal),和发送的端口号
client.settimeout(1)        #时延
def sendpacket(dd,ip):       #发送包
       client.sendto(dd,ip)
def acceptpacket():        #接受包
   try:
       data,addr = client.recvfrom(BUF_SIZE)
       cdata = binascii.b2a_hex(data)
   except socket.timeout:     #1s时延
       print("timeout")
for i in range(16,256):       #两个for循环,16进制1000到ffff的循环
  value =  hex(i)[2:]
  str1 = bytearray.fromhex(value)
  for j in range(16,256):
       value1 = hex(j)[2:]
       str2 = bytearray.fromhex(value1)
       str3 = str1 + str2
       da1 = b"\x01\x01\x00\x00"      #ASCII码,Python2中把前面的b去掉,要发送的报文能容
       ta1 = b"\x00\x00\n\x06=\x1f\x00\x00\x00\x00"
       da2 = b"\x01\x03\x00\x00"
       ta2 = b"\n\x06=\x1f\x00\x00\x00\x02\x01\x06wang\x04\x12\xea\xf6\xfb\xbf9\xacC\xbf\xfe\x81\xfbh0\x10\x15\xf6"
       data1 = da1 + str3 + ta1
       data2 = da2 + str3 + str3 + ta2
       sendpacket(data1,server_addr)
       time.sleep(0.5)
       acceptpacket()                  #这里需要加入判断回包内容是否符合,再进行下一步
#将两个for循环拉出来做成一个函数,引入threading模块,进行多线程并发

最后的代码大约有200行,以上是我写的第一个多次收发的请求的demo版,但是包含了主要的逻辑思路。具体的思路都已经注释了。

超哥要回家了,我也赶紧写完回家吧(免得让他等)。

再过几天国庆有空,我把我对Python的socket理解写下来,分享分享。就这样吧,撤了。

哎呀,漂亮的女同事也准备回家了。

姑娘留步,容老衲劫个色。

就这样吧,撤了。

时间: 2024-07-31 07:41:26

Python的socket网络编程)(一)的相关文章

『Python』socket网络编程

Python3网络编程 '''无论是str2bytes或者是bytes2str其编码方式都是utf-8 str( ,encoding='utf-8') bytes( ,encoding='utf-8') 而在使用.encode('utf-8')时,虽然type类型是byte,但常常报错''' Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket起源于UNIX,在Unix一切皆文

python之socket网络编程

socket解释 socekt又称为‘套接字’,用于描述IP和地址端口,是一个通信链路的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix,所以也遵从“一切皆文件”的基本哲学,对于文件,进行打开/读取/关闭的操作模式.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). socket和file文件的区别: file模块是针对指定文件进行打开.读写.关闭操作. socket模块是针

<五> Python之socket网络编程

socket概念 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ocket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据. client端:4 大范甘迪 3 水电费很舒服 5 水电费是否6

【python】socket网络编程

# -*- coding: utf-8 -*- import socket print "Creating socket" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  print "Done!\n" print 'Looking up port number...' port = socket.getservbyname('http','tcp') print port print "Don

python开发socket网络编程基础:粘包问题&udp套接字

一,发生粘包 服务器端 1 from socket import * 2 phone=socket(AF_INET,SOCK_STREAM) #套接字 3 phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #解决端口占用 4 phone.bind(('127.0.0.1',8080)) #绑定端口和Ip到套接字 5 phone.listen(5) 6 conn,client_addr=phone.accept() #等待tcp接受 7 8 9 # data1

python进阶之Socket 网络编程

 一:网络编程介绍   自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信. 举个例子,当你使用浏览器访问新浪网时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后,新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上. 由于你的电脑上可能不止浏览器,还有QQ.Skype.Dropbox.邮件客户端等,不同的程序连接的别的计算机也会不同,所以,更

Python全栈【Socket网络编程】

Python全栈[socket网络编程] 本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" 用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式

Python Socket 网络编程

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用 Python 进行 TCP Socket 网络编程,假设你已

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g