python之渗透测试笔记(一)

Socket模块须知

  • 在TCP/IP协议族中,Socket并不是协议,而是一个编程接口。
  • TCP/IP是传输层协议,主要解决数据如何在网络中传输,而Socket则是对TCP/IP的封装和应用。
  • TCP是网络中的规则,是不能修改的,而Socket则是给程序员使用的,是可以任意使用的。
  • Socket常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

简介

  • 在python中,使用Socket进行编程的时候,需要先实例化一个Socket类,这个实例化需要三个参数:第一个参数是地址族,第二个参数是流,第三个参数是使用的协议。

基本用法

  1. socket的实例化
  • socket实例化的格式化格式:
 socket(family,type[,protocal])
  • family是使用地址族,常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX、UNIX域Socket)、AF_ROUTE等。默认值为socket.AF_INET。

  • type用来指明Socket类型,这里有三个值可以使用: SOCK_STREAM(TCP类型,保障数据顺序和可靠性)、SOCK_DGRAM(UDP类型,不保证数据连接顺序,非可靠连接)、SOCK_RAW(原始类型,允许对底层协议如IP或ICMP进行直接访问)。默认值为SOCK_STREAM。

  • protocal是使用的协议,参数可选。通常赋值’0’,由系统自动选择。

  • 初始化TCP类型:

s=socket.socket()
或s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  • 初始化UDP类型:
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.Socket常用的函数

2.1 服务器端函数:

  • bind():将之前创建的Socket与指定I的P地址和端口进行绑定。如果之前使用了AF_INFT初始化Socket,可以使用元组(host,port)的形式表示地址。例如:
s.bing(('127.0.0.1',8080)) #绑定本机的8080端口
  • listen():使用TCP的服务端开启监听模式。使用参数指定可以挂起的最大连接数量,最小为1,一般为5。例如:
s.listen(5)
  • accept():在使用TCP的服务端接收连接,一般是阻塞态。接收TCP连接并返(conn,address),conn是新的套接字对象,可用来接收和发送数据;address连接客户端地址。

2.2 客户端函数:

  • conncet():在使用TCP的客户端去连接服务器地址。使用参数是一个元组,形式为(host,port)。例如:
s.connect(("127.0.0.1",8080))  #连接本地的8080端口

2.3 客户端和服务器都可以使用的函数:

  • send():使用TCP时发送数据。形式为send(string[,flag]),返回值是发送字节的数量。但可能未将指定的内容全部发送。
  • sendall():与send()类似,形式为sendall(string[,flag])。与send()的区别是完整发送TCP数据。将string中的数据发送到连接的套接字,但返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。例如:
s.sendall(bytes(" Hello python ! "),encoding = "utf-8")
  • recv():使用TCP时接收数据。完整形式为recv(bufsize[,flag]),接收Socket的数据。数据以字符串形式返回,bufsize指定最多接收的数量,flag参数一般不使用。例如:
odj.recv(1024)  #接收一段长度为1024的字符Socket
  • sendto():使用UDP时发送数据,完整形式为sendto(string[,flag],address),返回值是发送的字节数。其中,address是形式为(ipaddr , port)的元组,指定远程地址。
  • recvfrom():UDP专用,接收数据,返回数据远端的IP地址和接口,但返回值是(data , address)。其中,data是包含接收数据的字符串,address是发送数据的套接字地址。
  • close():关闭socket。

使用Socket编写一个简单的服务端和客户端

  • 服务端程序:
import socket
s2 =socket.socket()         #初始化一个TCP类型的socket
s2.bind(("127.0.0.1",8080))         #绑定到本地8080端口
s2.listen(5)        #使用TCP的服务端开启监听模式
while 1:        
    conn,address = s2.accept()      #接收TCP连接并返回(conn,address),conn是新的套接字,用来接收和发送数据;address连接客户端地址
    print ("a new connect from " + str(address))
    conn.sendall("Hello world")     #发送数据
    conn.close()
  • 客户端程序:
import socket       #导入socket库
s1 = socket.socket()        #初始化一个TCP类型的socket
s1.connect(("127.0.0.1",8080))     #连接目标127.0.0.1的8080端口(测试使用本机地址),使用参数是一个元组,形式为(host,port)
data = s1.recv(1024)        #连接成功,发送数据
s1.close()      #关闭连接
print('Received ' + repr(data))        #输出服务器发送的数据
发布了7 篇原创文章 · 获赞 3 · 访问量 148

猜你喜欢

转载自blog.csdn.net/weixin_44889655/article/details/105314517
今日推荐