34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本
TCP非阻塞及套接字异常处理:
TCP阻塞套接字异常捕获:
- 套接字创建失败,8000
 
- socket.error
 
- 客户端连接错误:
 
- ConnectionRefusedError
 - socket.gaierror
 
- c.settimeout(1):
 
- 设置客户端超时
 - 如果超时,引发:socket.timeout
 - 如果不设置该属性,引发的异常是:TimeoutError
 
- 客户端套接字连接:
 
- TCP:连接成功
 - 连接之后:不可以,无法重复
 - 连接不成功的话,也无法继续使用,因为套接字中的数据包和连接IP端口已经构建好了
 1,tcp_server.py
import socket
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#ipv4,tsp协议
ip = ''
port = 22
s.bind( (ip,port)) #只有服务端才会bind
s.listen(5) #不是最大连接数,是最大连接等待数
except socket.error:
print('[E] Create socket failed')
while True:
try:
c,c_addr = s.accept() #阻塞
while True:
date = c.recv(1024) #接受
#date二进制
if date:
c.send(date.decode().upper().encode()) #发送全大写的
else:
c.close() #关闭套接字
break
except KeyboardInterrupt:
c.close()
break
s.close()2.tcp_client.py
import socket
import sys
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip = '192.168.137.128'
port = 22
# s.settimeout(2) #设置客户端连接超时时间
s.connect( (ip,port) )
except socket.error:
print('[E] Create Socket Failed')
s.close()
except socket.gaierror:
print('[E] Failed To Connect Server')
s.close()
except ConnectionRefusedError:
print('[E] Server Refuse')
s.close()
except socket.timeout: #有效连接超时错误
print('[E] Connect Timeout')
s.close()
'''
except TimeoutError:
print('[E] 连接超时')
'''
else:
while True:
try:
msg = input('>>> ')
s.send(msg.encode('utf-8'))
date = s.recv(1024)
if date:
print('[服务器]:',date.decode('utf-8'))
else:
s.close()
break
except KeyboardInterrupt:
s.close()
break
TCP端口扫描.py
#ssh TCP 22
import socket
import sys
ip = input('IP:>>> ')
open_port = [] #存储扫描成功链接的端口
try:
for port in range(1,65535): #一般端口的取值范围
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(0.5) #设置客户端连接超时时间 超过0.5s 则失败
except socket.error:
sys.exit('套接字创建失败')
else:
try:
s.connect ( (ip,port) )
except socket.timeout: # 如果出现端口不通,那么代表端口关闭
print('[closed]:%s' % port)
else:
s.close()
open_port.append(port)
del s #套接字连接成功或者不成功,都无法继续使用,因为套接字中的数据包和连接IP端口已经构建好了,必须删除套接字才能继续循环下一个端口
else:
print('Open:%s' % open_port)
except KeyboardInterrupt:
print('终止...')
sys.exit()运行结果:
IP:>>> 192.168.137.130
[closed]:1
[closed]:2
[closed]:3
[closed]:4
[closed]:5
终止...
TCP非阻塞:(企业用的最多,tcp服务器同时允许多个客户端连接)
- 默认是阻塞的:
 
- 有人来吗?没人来连接会死等
 - 专心致志服务你,其他人管不了了,1对1的专心服务
 
- TCP非阻塞
 
- s.setblocking(0) #0是费阻塞,1是阻塞
 - BlockingIOError: [WinError 10035] 无法立即完成一个非阻止性套接字操作。这是一个不可避免的报错 ,所有我们要自定义异常报错
 
- fzs_tcp_server.py
 import socket
import copy
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#ipv4,tsp协议
s.bind( ('',8022)) #只有服务端才会bind
s.listen(5) #不是最大连接数,是最大连接等待数
s.setblocking(0) #1是阻塞 0是非阻塞
connect_client = {} #创建一个dict
connect_client_bak = {}
except socket.error:
print('[E] Create socket failed')
while True:
try:
try:
c,c_addr = s.accept() #阻塞
#非阻塞,没有人来,我也会向下运行
except BlockingIOError: #没有人来连接 会报错
#print('暂时没有人来连接...')
pass
else:
c.setblocking(0)
connect_client[c] = c_addr # 这个dict就是我的所有连接客户
#key:是套接字
#value: 地址
connect_client_bak = copy.copy(connect_client) #拷贝
for client in connect_client_bak:
if not client in connect_client: #客户端是真正连接的有效存在的
continue
try:
date = client.recv(1024)
except BlockingIOError:
#print('[%s:%s]:没说话...' % connect_client[client]) #打印出这个没说话的地址,connect_client[client]根据字典取出的值返回的是元组数据,列如:('192.168.137.130',8080)
pass
else:
if date:
print('[%s]:%s' % (connect_client[client],date.decode('utf-8')) )
while True:
msg = input('>>> ')
if msg:
client.send(msg.encode('utf-8'))
break
else:
print('回复消息不能为空,请重新回复')
else:
print('[%s:%s]这人走了' % connect_client[client])
del connect_client[client]
del date
except KeyboardInterrupt:
break
s.close()fzs_tcp_client.py
import socket
import sys
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip = '192.168.137.128'
port = 8022
# s.settimeout(2) #设置客户端连接超时时间
s.connect( (ip,port) )
except socket.error:
print('[E] Create Socket Failed')
s.close()
except socket.gaierror:
print('[E] Failed To Connect Server')
s.close()
except ConnectionRefusedError:
print('[E] Server Refuse')
s.close()
except socket.timeout: #有效连接超时错误
print('[E] Connect Timeout')
s.close()
except socket.timeout:
print('[E] Timeout')
s.close()
else:
while True:
try:
msg = input('>>> ')
s.send(msg.encode('utf-8'))
date = s.recv(1024)
if date:
print('[服务器]:',date.decode('utf-8'))
else:
s.close()
break
except KeyboardInterrupt:
s.close()
break运行结果
^C[root@localhost date]# python3 fzs_tcp_server.py
[('192.168.137.1', 49856)]:111
>>> 1111
[('192.168.137.130', 49291)]:222
>>> 2222
[('192.168.137.130', 49291)]:aaa
>>> aaaa
[('192.168.137.1', 49856)]:bbb
>>> bbbb
[('192.168.137.1', 49856)]:zzzzzzzzzzzzzzz
>>> zzz
[('192.168.137.130', 49291)]:ccccccccccccccccccccccc
>>> ccc
34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本的更多相关文章
- Java如何使服务器允许连接到套接字端口?
		
在Java编程中,如何使服务器允许连接到套接字端口? 以下示例显示如何使服务器通过使用ServerSocket类的server.accept()方法和Socket类的sock.getInetAddre ...
 - Linux:【解决】无法连接 MKS:套接字连接尝试次数太多正在放弃
		
[解决]无法连接 MKS:套接字连接尝试次数太多正在放弃 操作: 我的电脑 -> 右键 -> 管理 -> 服务和应用程序 -> 服务: 开启下面的服务:  服务启动成功后,重 ...
 - VMware Workstation “无法连接 MKS: 套接字连接尝试次数太多;正在放弃。” 解决方法【转】
		
今天和往常一样打开电脑,打开VMware Workstation,打开其中的一台虚拟机,以前都是这么打开没有问题,今天打开虚拟机突然提示“无法连接 MKS: 套接字连接尝试次数太多:正在放弃.”. 经 ...
 - Vmware Pro 14报错:无法连接 MKS: 套接字连接尝试次数太多;正在放弃。
		
软件环境: 虚拟机软件:VMware Pro 14 母机操作系统:win7 客户机操作系统:CentOS 7 问题详情: 报错:无法连接 MKS: 套接字连接尝试次数太多:正在放弃. ...
 - VMware无法连接MKS:套接字连接尝试次数太多解决
		
粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...
 - C#利用   HttpWebRequest 类发送post请求,出现“套接字(协议/网络地址/端口)只允许使用一次”问题
		
声明:问题虽然已经被解决,但是并没有明白具体原理,欢迎大佬补充. 最近网站出现一个问题,在C#里面使用 HttpWebRequest 类去发送post请求,偶尔 会出现 “套接字(协议/网络地址/端 ...
 - TCP非阻塞accept和非阻塞connect
		
http://blog.chinaunix.net/uid-20751538-id-238260.html 非阻塞accept 当一个已完成的连接准备好被accept的时候,select会把监 ...
 - TCP非阻塞通信
		
一.SelectableChannel SelectableChannel支持阻塞和非阻塞模式的channel 非阻塞模式下的SelectableChannel,读写不会阻塞 SelectableCh ...
 - Python—网络通信编程之tcp非阻塞通信(socketserver)
		
服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...
 
随机推荐
- Codeforces Round #585 (Div. 2) D. Ticket Game
			
链接: https://codeforces.com/contest/1215/problem/D 题意: Monocarp and Bicarp live in Berland, where eve ...
 - 通过德鲁伊druid给系统增加监控
			
系统在线上运行了一段时间后,比如一年半载的,我们发现系统可能存在某些问题,比如执行系统变慢了,比如某些spring的bean无法监控各种调用情况. 触发到db的各种执行情况,这个时候,我们就需要一个工 ...
 - 011_STM32程序移植之_内部flash开机次数管理
			
011_STM32程序移植之_内部flash开机次数管理 1. 测试环境:STM32C8T6 2. 测试接口: 3. 串口使用串口一,波特率9600 单片机引脚------------CH340引脚 ...
 - 02 | 日志系统:一条SQL更新语句是如何执行的?
			
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...
 - SQL Server Report Server
			
1.SQL Server Report Server是利用mircosoft的share point产品 在menu 打开Reporting Services Configuration进行配置,会自 ...
 - java线程安全与不安全的理解
			
存在成员变量(全局变量)的类用于多线程时是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,而变量定义在方法内也就是局部变量是线程安全的. 想想在使用struts1时,不推荐创建成员变量,因为 ...
 - 富文本编辑器word
			
tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...
 - P3469  割点的应用
			
https://www.luogu.org/problem/P3469 题目就是说封锁一个点,会导致哪些点(对)连不通: 用tarjan求割点,如果这个点是割点,那么不能通行的点对数就是(乘法法则)儿 ...
 - MySQL优化:如何避免回表查询?什么是索引覆盖? (转)
			
数据库表结构: create table user ( id int primary key, name varchar(20), sex varchar(5), index(name) )engin ...
 - Spring boot 配置 Tomcat 临时文件缓存目录
			
1. 问题现象 spring boot 项目中,Tomcat 接收到 content-type 为 multipart/form-data 的请求时,需要将接收的文件缓存到临时目录(默认下载 /tmp ...