Python安全攻防——网络化编程(二):socket使用

🚀write in front🚀
🔎大家好,我是翻斗花园牛爷爷★。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
🆔本文由 翻斗花园牛爷爷★ 原创 CSDN首发🐒 如需转载还请通知⚠
📝个人主页:翻斗花园牛爷爷★—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏:翻斗花园牛爷爷★的系列专栏——CSDN博客
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本

目录

一、Socket编程

二、UDP编程

基础知识

编程实例

三、TCP编程

基础知识

编程实例

编程扩展


        上一篇文章我们讲了网络化编程的基本内容网络架构,这次我们要正式开始讲网络编程。本次主要讲解三种网络编程技术:

1.Socket编程

2.UDP编程

3.TCP编程

Socket编程、UDP编程和TCP编程都是网络编程领域中常见的技术。


一、Socket编程

那么什么是Socket呢???

        套接字(Socket)是计算机之间进行通信的一种约定。通过 Socket,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

远程管理软件和黑客软件大多依赖于Socket来实现特定功能的,其包括两个部分:运行于客户机端称之ClientSocket,运行于服务机端称之为ServerSocket。其实现通信过程如下所示:

  • 服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),等待客户端连接。
  • 客户端初始化一个Socket,客户端的套接字必须首先指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求(connect)。
  • 当服务器端套接字接收到客户端套接字的连接请求,响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,由此连接建立成功。

 基于此图可以帮助理解一下:

 大多数黑客软件都是基于TCP协议的,为什么呢???因为TCP连接是可靠连接的通讯传输方式,而UDP是不可靠的。所以大多数的黑客管理软件或通信软件都是基于TCP协议的。


二、UDP编程

基础知识

UDP属于无连接协议,在编程时不需要建立连接,而是直接向接收方发送信息。UDP不提供应答重传机制,无法保证数据一定能够到达目的地。UDP编程经常用到socket模块方法如下所示:

  1. socket(family[,type[,proto]]):创建一个Socket对象,family为socket.AF_INET表示使用IPV4,socket.AF_INET6表示使用IPV6;type为SOCK_STREAM表示使用TCP,SOCK_DGRAM表示使用UDP。
  2. sendto(string,address):把string指定的内容发送给address指定的地址,其中address是一个包含接收方主机IP地址和应用进程端口号的元组,格式为(IP地址,端口号)。
  3. recvfrom(bufsize[,flags]):接收数据。

 基于此图可以帮助理解一下: 

左边为服务端,右边为客户端

服务端首先进行一个socket初始化,然后绑定一个端口,recvfrom()就是负责接收数据。下面来看客户端,首先进行socket初始化,然后发送一个我们想要发送的数据发送给服务端。从这里我们可以看出并没有建立连接。服务端如果成功接收到了发送的数据,那么,也会给客户端发送个应答。此时客户端也通过recvfrom()来接收应答。

大家明白这个流程了吗!!!😈😈😈

UDP协议优点:效率高、首部中只包含双方地址与校验和等很少的字段,额外开销小。


编程实例

同样分为服务端和客户端

#ServerSocket
import socket

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #socket.AF_INET代表使用IPV4协议,socket.SOCK_DGRAM代表调用UDP协议
s.bind(('',8001)) #利用bind函数调用本机的8001端口
while True: #多次循环
    data,addr=s.recvfrom(1024) #如果接受到发送过来的信息
    print(data.decode()) #输出信息
    if data.decode().lower()=='exit': #将所有信息都转化为小写
        break
s.close()
#ClientSocket
import socket
import uuid #导入包,主要其中有一个函数用于获得mac地址
import sys

def get_mac_address():
    mac=uuid.UUID(int = uuid.getnode()).hex[-12:] #通过调用uuid来进行获取mac地址
    return ":".join([mac[e:e+2] for e in range(0,11,2)])
ip = socket.gethostbyname(socket.gethostname()) #通过主机名来获取IP地址
mac = get_mac_address() #通过上面的函数来获取mac地址
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #利用socket进行初始化,初始化后,依旧使用IPV4协议以及UDP协议
info = "ip addr:"+ip+"\n"+"mac addr:"+mac #将IP地址和mac地址拼成字符串
s.sendto(info.encode(),("127.0.0.1",8001)) #将info发送给服务端
s.sendto(sys.argv[1].encode(),("127.0.0.1",8001)) #将外面输入的一些字符串或者其他再次发送给服务端。
s.close()

具体的实践呢,用截图来演示一下:

这里要提醒一下大家,要开两个命令台来进行操作。


三、TCP编程

基础知识

TCP一般用于可靠数据传输的场合,TCP编程经常用到socket模块方法如下所示:

  1. socket(family[,type[,proto]]):创建一个Socket对象,family为socket.AF_INET表示使用IPV4,socket.AF_INET6表示使用IPV6;type为SOCK_STREAM表示使用TCP,SOCK_DGRAM表示使用UDP。
  2. connect(address):连接远程主机;
  3. send(bytes[,flags]):发送数据;
  4. recv(bufsize[,flags]):接收数据;
  5. bind(address):绑定地址;
  6. listen(backlog):开始监听,等待客户端连接,blacklog排队数,backlog+1表示允许的最大连接数;
  7. accept():响应客户端的请求,接收一个连接;

 基于此图可以帮助理解一下:

这次是中文,我就不解释了。大家根据基础知识自行理解一下,不懂的可以在评论区里问哦😉😉😉

TCP协议优点:可靠性强,速度较慢

编程实例

#SocketTcpServer
import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #老样子,IPV4协议,使用TCP
s.bind(('',8002)) #连接端口
s.listen(1) #监听
print('Listen  at port:8002')
conn,addr = s.accept()
print('Connected by ',addr)
while True:
    data = conn.recv(1024) #接收连接客户端发送的数据,并且最多接收1024个字节的数据
    data = data.decode() #将二进制解码成字符串
    print('Recv:',data)
    c = input('Input the content you want to send:')
    conn.sendall(c.encode()) #sendall()是用于发送数据的方法,而encode()则是将字符串转换成字节流的方法。
    if c.lower() == 'bye':   #转小写
        break
conn.close()
s.close()
#SocketTcpClient
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect(('127.0.0.1',8002))
except Exception as e:
    print('server not found or not open')
while True:
    c = input('Input the content you want to send:')
    s.sendall(c.encode()) #将字符串转化为字节流
    data = s.recv(1024).decode() #从连接对象s接收最多1024个字节的数据,并将接收到的字节流解码成字符串,赋值给变量data。
    print('Recv:',data)
    if c.lower() == 'bye': #发送bye,结束循环
        break
s.close()

具体的实践呢,用截图来演示一下:


编程扩展

扩展:

  • Gethostname():获取本地主机名;
  • Gethostbyname():根据主机名获取ip地址;
  • Gethostbyaddr():根据ip地址获取主机名;
  • Getservbyport():根据端口号获取主机名;
  • Getservbyname():根据服务名获取对应的端口号;
import socket

hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
addr = socket.gethostbyname("www.baidu.com")
host = socket.gethostbyaddr(ip)
sername = socket.getservbyport(3389, "tcp")
port = socket.getservbyname('http')

print("gethostname:",hostname)
print("gethostbyname:",ip)
print("gethostbyname:",addr)
print("gethostbyaddr:",host)
print("getservbyport:",sername)
print("getservbyname:",port)

示例如下:

本次为大家讲解了Socket编程、UDP编程以及TCP编程三种网络编程技术,我们了解到了 Socket在计算机通信中的作用。同时我们也学习了UDP和TCP的区别,总结一下就是UDP适用于对速度和低延迟要求较高,可容忍数据丢失的应用,而TCP适用于对可靠性和顺序性要求较高的应用,如文件传输和网页浏览。最后我们又对TCP进行了一些拓展。不知道小伙伴都学会了吗???🥳🥳🥳

创作不易,希望大佬们以及未来的大佬们给个三连再走吧

 创作不易,希望大佬们以及未来的大佬们给个三连再走吧

 创作不易,希望大佬们以及未来的大佬们给个三连再走吧

同时,也希望各位大佬能够指正文章的错误,(^_^)∠※

当然也要提醒各位小伙伴们,只有自己打出来,才能真正的掌握哦。😁😁😁

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻斗花园牛爷爷★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值