TCP非阻塞及套接字异常处理:


TCP阻塞套接字异常捕获:

  • 套接字创建失败,8000
  1. socket.error
  • 客户端连接错误:
  1. ConnectionRefusedError
  2. socket.gaierror
  • c.settimeout(1):
  1. 设置客户端超时
  2. 如果超时,引发:socket.timeout
  3. 如果不设置该属性,引发的异常是:TimeoutError
  • 客户端套接字连接:
  1. TCP:连接成功
  2. 连接之后:不可以,无法重复
  3. 连接不成功的话,也无法继续使用,因为套接字中的数据包和连接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. 有人来吗?没人来连接会死等
  2. 专心致志服务你,其他人管不了了,1对1的专心服务
  • TCP非阻塞
  1. s.setblocking(0)    #0是费阻塞,1是阻塞
  2. 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非阻塞连接及套接字异常处理丶端口扫描脚本的更多相关文章

  1. Java如何使服务器允许连接到套接字端口?

    在Java编程中,如何使服务器允许连接到套接字端口? 以下示例显示如何使服务器通过使用ServerSocket类的server.accept()方法和Socket类的sock.getInetAddre ...

  2. Linux:【解决】无法连接 MKS:套接字连接尝试次数太多正在放弃

    [解决]无法连接 MKS:套接字连接尝试次数太多正在放弃 操作: 我的电脑 -> 右键 -> 管理 -> 服务和应用程序 -> 服务: 开启下面的服务: ​ 服务启动成功后,重 ...

  3. VMware Workstation “无法连接 MKS: 套接字连接尝试次数太多;正在放弃。” 解决方法【转】

    今天和往常一样打开电脑,打开VMware Workstation,打开其中的一台虚拟机,以前都是这么打开没有问题,今天打开虚拟机突然提示“无法连接 MKS: 套接字连接尝试次数太多:正在放弃.”. 经 ...

  4. Vmware Pro 14报错:无法连接 MKS: 套接字连接尝试次数太多;正在放弃。

    软件环境: 虚拟机软件:VMware Pro 14 母机操作系统:win7 客户机操作系统:CentOS 7     问题详情: 报错:无法连接 MKS: 套接字连接尝试次数太多:正在放弃.     ...

  5. VMware无法连接MKS:套接字连接尝试次数太多解决

    粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...

  6. C#利用 HttpWebRequest 类发送post请求,出现“套接字(协议/网络地址/端口)只允许使用一次”问题

    声明:问题虽然已经被解决,但是并没有明白具体原理,欢迎大佬补充. 最近网站出现一个问题,在C#里面使用  HttpWebRequest 类去发送post请求,偶尔 会出现 “套接字(协议/网络地址/端 ...

  7. TCP非阻塞accept和非阻塞connect

    http://blog.chinaunix.net/uid-20751538-id-238260.html 非阻塞accept     当一个已完成的连接准备好被accept的时候,select会把监 ...

  8. TCP非阻塞通信

    一.SelectableChannel SelectableChannel支持阻塞和非阻塞模式的channel 非阻塞模式下的SelectableChannel,读写不会阻塞 SelectableCh ...

  9. Python—网络通信编程之tcp非阻塞通信(socketserver)

    服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...

随机推荐

  1. Codeforces Round #539 (Div. 1) 1109F. Sasha and Algorithm of Silence's Sounds LCT+线段树 (two pointers)

    题解请看 Felix-Lee的CSDN博客 写的很好,不过最后不用判断最小值是不是1,因为[i,i]只有一个点,一定满足条件,最小值一定是1. CODE 写完就A,刺激. #include <b ...

  2. date/clock/hwclock/cal

    date 显示日期与时间 date +%Y/%m/%d/%H:%M 2018/10/08/17:35 格式化输出 时间的设置 查看时区 date -R 时间戳转化 time1=$(date +%s - ...

  3. Spring Boot and Rabbit MQ 异常的时候消息的状态

    我们有一个处理消息的方法. 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢. 根据我们的实际情况的观察,如果出现了异常. 但是你没有捕获或者处理异常,这个消息会一直存在,并且你的系统会持 ...

  4. D. Restore Permutation(权值线段树)

    D. Restore Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. AcWing:244. 谜一样的牛(树状数组 + 二分)

    有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有AiAi头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整数n. 第2. ...

  6. Maven依赖传递

    依赖传递原则: 1.路径最短原则 2.路径相同是先申明者优先(dependency申明顺序先的优先)

  7. Redis集群都有哪些模式

    前言: 一,为什么要使用redis 1,解决应用服务器的cpu和内存压力 2,减少io的读操作,减轻io的压力 3,关系型数据库扩展性不强,难以改变表的结构 二,优点 1,nosql数据库没有关联关系 ...

  8. windows下使用curl命令&&常用curl命令

    什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...

  9. JSON字符串控制台格式化输出 java

    1.正常情况下返回的json数据格式如下: {"header":{"transSn":"e33128bb7622462ebfb2cbfcc46baa1 ...

  10. geth 新建账户

    使用geth的account命令管理账户,例如创建新账户.更新账户密码.查询账户等: geth account <command> [options...] [arguments...] ...