Python socket 绑定ip

由于业务需求,用做了一套client-server上传接收服务

上传和接收分别处在A、B两个城市,(A城市有多个客户端,B城市只有1个客户端)

每天A城市自动收集处理文件,并自动向B城市上传(每个客户端的上传时间不同)

B城市服务器端接收到文件先判断该数据来自哪一个客户端,然后进行对应的存档任务

几百个文件,刚开始相安无事,一切顺利

近期发现接收服务经常故障宕机

1、查询日志发现是文件上传过程中由于client端主动断开服务导致的,

解决方法:捕捉该异常,过滤掉

 

            try:
                data1 = sock.recv(1024)
            except Exception as e:
                if '远程主机强迫关闭' in str(e):
                    break
                elif 'Connection reset by peer' in str(e):
                    break
                else:
                    print('this is new error---{}'.format(str(e)))
                    break

                data1 = sock.recv(1024)

2、查询日志发现client端ip地址在不断的变化(实际上应该是固定的)还有国外的地址

原因应该是client端开启的越界番羌,

解决方法:提示对方关闭

但是业务需要,有时对方经常开了忘记关

解决方法2:server端绑定client端ip,拒绝其他ip

Python socket 绑定ip_第1张图片

但事实发现这种绑定方法无效

怎么办呢?

设置一个白名单,将这些ip放进一个列表,当新的连接过来时,判断是否在白名单中,如果在,继续任务,如果不在,断开,等待下一个

 

ip_list = [
    '221.22.3.15'
    '221.22.3.16'
    '221.22.3.17'
    '221.22.3.18'
]


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8020))
s.listen()

while 1:
    count = 0
    sock, addr = s.accept()
    print('Accept new connection from %s:%s...' % addr)
    a, b, c, h, m = get_time()
    print('{}{}{}{}{}'.format(a,b,c,h,m))
    s_time = time.time()
    while True:
        if count == 0:
            try:
                ip = addr[0]
            except Exception as e:
                print('ip is error---{}'.format(str(e)))
                break
            if ip not in ip_list:
                break
            else:
                count += 1
        else:
            try:
                data1 = sock.recv(1024)

绑定ip的几种情况

1、监听所有ip,运行所有主机连接

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8020))

2、本地测试,只允许自己连接

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8020))

3、指定一个ip连接

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('123.321.456.654', 8020))

4、允许多个指定的ip连接

参考上面的方法

你可能感兴趣的:(网络编程)