Python socket库 基础概念

socket库是Python中用于网络编程的标准库之一,它提供了创建套接字(socket)对象、绑定地址和端口、监听连接、接受连接、发送和接收数据等功能。

套接字是网络通信的基础,它允许程序之间进行数据传输和通信。

套接字类型:

SOCK_STREAM:流套接字,提供面向连接的、可靠的数据传输服务,通常用于TCP协议。

SOCK_DGRAM:数据报套接字,提供无连接的、不可靠的数据传输服务,通常用于UDP协议。

SOCK_RAW:原始套接字,允许直接访问底层协议,通常用于网络测试和自定义协议。

地址族:

AF_INET:IPv4地址族。

AF_INET6:IPv6地址族。

AF_UNIX:Unix域套接字,用于同一台机器上的进程间通信。

套接字方法:

socket():创建一个新的套接字对象。

bind():将套接字绑定到指定的地址和端口。

listen():开始监听传入的连接请求(仅对SOCK_STREAM类型的套接字有效)。

accept():接受一个连接请求,并返回一个新的套接字对象和客户端地址(仅对SOCK_STREAM类型的套接字有效)。

connect():尝试连接到指定的地址和端口。

send() /send() 和 recv():用于发送和接收数据。

close():关闭套接字。

下面是一个简单的服务器和客户端的示例代码,服务器在端口10000上监听连接,客户端尝试连接到这个地址和端口。一旦连接建立,客户端发送一个消息给服务器,服务器收到消息后将其发送回客户端,然后连接关闭。

# ==> TCP服务器

import socket

# 创建一个TCP/IP套接字

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定到地址和端口bind()

server_address = ('localhost', 10000)

server_socket.bind(server_address)

# 开始监听连接listen()

server_socket.listen(1)

while True:

    # 等待连接accept()

    print('Waiting for a connection...')

    connection, client_address = server_socket.accept()

    try:

        print('Connection from', client_address)

        # 接收数据recv()

        data = connection.recv(1024)

        print('Received {!r}'.format(data))
        # {!r} 是一个格式说明符,它表示将对象以“repr” (representation) 的形式展示
        # 返回一个对象的“官方”字符串表示,通常可以用来在Python解释器中重新创建该对象
        # 在字符串格式化中,{!r} 告诉 format 方法(或 str.format() 方法)使用 repr 函数将值转换成字符串

        if data:

            # 发送数据回客户端sendall()

            sent = connection.sendall(data)

            print('Sent {!r}'.format(sent))

        else:

            print('No data received')



    finally:

        # 关闭连接close()

        connection.close()

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# ==>TCP客户端

import socket

# 创建一个TCP/IP套接字

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器connect()

server_address = ('localhost', 10000)

client_socket.connect(server_address)

try:

    # 发送数据sendall()

    message = 'This is the message.'

    print('Sending {!r}'.format(message))

    client_socket.sendall(message.encode())

    # 接收数据recv()

    data = client_socket.recv(1024)

    print('Received {!r}'.format(data.decode()))

finally:

    # 关闭连接close()

    client_socket.close()

==> 小彩蛋

Scapy和Socket配合使用:

Scapy和Socket是Python中常用的两个网络编程库:Scapy是一个功能强大的交互式数据包操作程序,可以用来发送、嗅探、解析和修改网络数据包;而Socket则是一个基础的网络通信接口,提供了创建客户端和服务器、发送和接收数据等功能。

要将Scapy和Socket搭配使用,通常的做法是使用Socket来建立网络连接或监听端口,然后使用Scapy来发送或接收数据包。下面的示例首先使用Socket创建一个TCP连接,尝试连接到目标主机的指定端口。然后,使用Scapy的SR函数发送一个TCP SYN数据包,并等待响应。根据响应结果,我们可以判断目标主机是否在监听该端口:

from scapy.all import *

import socket

# 使用Socket创建一个TCP连接

target_ip = "192.168.1.1"

target_port = 80

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect((target_ip, target_port))

# 使用Scapy发送一个TCP SYN数据包
# IP(dst=target_ip): 创建一个IP层的数据包,其中dst=target_ip表示目标IP地址
# TCP(dport=target_port, flags="S"): 在IP层之上创建一个TCP层的数据包。dport=target_port指定了目标端口,而flags="S"表示这是一个SYN标志设置的数据包,通常用于TCP三次握手的第一步。
# 使用SR函数发送数据包并接收响应
# 如果目标主机在监听该端口,会返回一个SYN+ACK数据包;否则,可能会返回一个RST数据包

response = SR(IP(dst=target_ip)/TCP(dport=target_port, flags="S"), timeout=1) 

# 检查响应结果

if response:

    # 如果收到SYN+ACK数据包,表示目标主机在监听该端口

    if response[0].haslayer(TCP) and response[0][TCP].flags == 0x12:

        print(f"Port {target_port} is open")

    else:

        print(f"Port {target_port} is closed")

else:

    print(f"No response from target host")

# 关闭Socket连接

client_socket.close()
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值