网络编程二

TCP服务/客户端

  • 服务端:被动等待链接
    • socket(AF_INET, SOCK_STREAM) -> s
    • s.bind( (‘127…’,8000) ) #服务端绑定了自己的IP和端口
    • s.listen(5) 真正打开服务器监听
      • 5:链接等待数量
      • 服务器真正的连接数量,一般不会超过服务器的最大打开文件个数
    • s.accept() c,addr 阻塞等待别人链接
      • c.recv(bytes).decode 接受消息
      • c.send(bytes).encode 发送消息
  • 客户端:主动链接
    • socket() -> c
    • c.connect() #客户端只需要链接
      • c.send()
      • c.recv()
  • 公网IP,
  • 0~1024
  • 端口:0~65535
  • 0~1023:公认端口
  • 1024~49151:注册端口,不同的程序可以按照自己的需求来使用
  • 49151~65535:动态端口,一般程序自己安排使用的
  • 客户端的IP和端口:伪造的
    • random(255).random(255).random(255).random(255)
    • random(49151~65535)
    • TCP泛洪(DDOS):大量的伪造IP和端口向服务器发起连接
      • ACK
      • 三次握手
  • 心跳包,呼吸包:为了保证链接持续,要一定时间向目标服务器发送短小精悍
    • 为了长连接
  • TCP的单进程服务器只能同时处理一个客户端
    • 保证一个链接
    • 单进程里100个人,
    • 链接状态,TCP

UDP服务器

  • udp服务器:

    • socket(AF_INET, SOCK_DGRAM) -> s
    • s.bind( () ) #UDP服务器只需要绑定自身可用IP和端口即可
    • data,c_addr = s.recvfrom() #获取这个套接字接受到的数据
      • data:发来的数据
      • c_addr:谁发来的
    • s.sendto(msg, c_addr)
  • udp客户端:

    • socket(AF_INET, SOCK_DGRAM) -> c
    • c.sendto(msg, s_addr)
    • data, s_addr = c.recvfrom()
  • #TCP:
    	#send
    	#recv
    #UDP:
    	#sendto
    	#recvfrom
    
  • 阿里云默认给你的IP是虚拟化出来的

  • 阿里云主机有安全策略,8000UDP/TCP 不开启的

  • scapy:组数据包

    • SYN
    • ACK
    • URG
    • RST
    • FIN
  • TCP泛洪攻击

  • 文件传输:UDP/TCP

    • os模块
    • 文本文件
    • 进制文件

tcp实例

  • 服务器代码
import socket
ip = '' #IPV4
port = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind( (ip,port) ) #绑定可用IP和端口
s.listen(5)
print('服务器开启...')
#服务别人
while True:
	try:
		c,addr = s.accept() #阻塞 就等了  没有人连接我,下面的代码不能执行
		# print(addr) #客户端的来访IP和端口元组
		# print(c)
		while True:
			#具体的服务这个c
			data = c.recv(1024) #接收客户端的数据 
			if data:
				print('[%s]:%s' % (addr,data.decode('utf-8')))
				msg = input('>>> ')
				c.send(msg.encode('utf-8')) #向客户端返回数据
			else:
				c.close()
				break
	except KeyboardInterrupt:
		s.close()
		break
print('服务器关闭')
#OSError: [Errno 98] Address already in use  立即释放

  • 客户端代码
import socket
ip = '47.98.190.149' #IPV4
port = 8000
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#c.bind( (ip,port) ) #绑定可用IP和端口
c.connect( (ip,port) )
	#我链接时候不需要制定我使用哪个端口
while True: 
	try:
		msg = input('>>> ')
		c.send(msg.encode('utf-8')) #向服务端发送数据
		
		data = c.recv(1024) #阻塞的
		if data:
			print('[服务器]:',data.decode('utf-8'))
		else:
			print('服务端关闭')
			c.close()
			break
	except KeyboardInterrupt: #ctrl + c
		c.close()
		break
#UE: 对比差异
#GUI编程 

udp实例

  • 服务器代码
import socket

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind( ('',8000))
while True:
        data,c_addr = s.recvfrom(1024)
        print('[%s]:%s' % (c_addr,data.decode('utf-8')))

        msg = input('>>> ')
        if msg == 'q' or msg == 'quit':
                break
        s.sendto(msg.encode(), c_addr)

print('服务端关闭')
s.close()

  • 客户端代码
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#IPV4 UDP的套接字
ip = '47.98.190.149'
port = 8000
while True:
	try:
		msg = input('>>> ')
		if msg == 'quit' or msg == 'q':	
			break
		c.sendto(msg.encode('utf-8'),(ip,port))
		data,s_addr = c.recvfrom(1024)
		#AttributeError: 'tuple' object has no attribute 'decode'
		print('[%s]:%s' % (s_addr,data.decode('utf-8'))) 
	except KeyboardInterrupt:
		break
c.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值