• 【网络编程实验1】udp实现CS和端口号


    """
    (1)UDP C/S结构通信:
    服务器端和客户端IP:当前主机IP(192.168.?.?)
    
    服务器监听端口:服务器启动时默认侦听端口为1060,当客户端有udp数据传过来时,
    可以对数据进行解码(utf-8)并打印出客户端传输的字符串数据,
    同时给发送数据的客户端传输字符串数据“你好,我是服务器+(ip,port),有事情可以随时联系我!”
    
    客户端端口:系统随机选定。
    要求客户端启动后给服务器发送一个字符串数据“服务器你好,我是客户端+(ip,port)”,
    发送完数据后客户端便处于等待服务器端使用udp协议回复信息状态,接收到回复信息后,在屏幕上输出解码后的数据。
    """
    
    import argparse, socket, time
    from datetime import datetime
    
    MAX_BYTES = 65535
    
    def server(port):
        #创建udp对象
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        #绑定ip地址+端口号
        sock.bind(('127.0.0.1', port))
        #加入提示词
        print('Listening at {}'.format(sock.getsockname()))
    
        while True:
            data, address = sock.recvfrom(MAX_BYTES)
            text = data.decode('utf-8')
            print('The client at {} says {!r}'.format(address, text))
            text = 'Your data was {} bytes long'.format(len(data))
            data = text.encode('ascii')
            time.sleep(30)
            sock.sendto(data, address)
    
    def client(port):
        #创建udp对象
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        #text为当前时间
        text = 'The time is {}'.format(datetime.now())
        data = text.encode('ascii')
    
        sock.sendto(data, ('127.0.0.1', port))
        print('The OS assigned me the address {}'.format(sock.getsockname()))
        data, address = sock.recvfrom(MAX_BYTES)
        text = data.decode('ascii')
        print('The server {} replied {!r}'.format(address, text))
    
    if __name__ == '__main__':
        choices = {'client': client, 'server': server}
        parser = argparse.ArgumentParser(description='Send and receive UDP locally')
        parser.add_argument('role', choices=choices, help='which role to play')
        parser.add_argument('-p', metavar='PORT', type=int, default=1060,
                            help='UDP port (default 1060)')
        args = parser.parse_args()
        function = choices[args.role]
        function(args.p)
    """
    扫描主机端口状态
    建立程序能够对本机的常用端口状态进行检测,并将扫描到的活动端口信息写入到scanResult.txt文件中
    常用的端口列表portLs=[21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]
    
    """
    
    import socket
    
    def main():
        ip_start = input('请输入开始IP:(默认:127.0.0.1)')
        
        #若无输入则以127.0.0.1
        if ip_start == '':
            ip_start = '127.0.0.1'
            ip_end = '127.0.0.1'
        #否则还要输入结束IP
        else:
            ip_end = input('请输入结束IP:')
            if ip_end == '':
                ip_end = '127.0.0.1'
    
        s = input('请输入目标主机开始端口:(默认扫描常用端口)')
        if s == '':
            portList = [21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]
        else:
            startport = int(s)
            s = input('请输入目标主机结束端口:(默认:65535)')
            if s == '':
                endport = 65535
            else:
                endport = int(s)
            portList = [i for i in range(startport, endport + 1)]  # 思考:这里为什么要+1?
    
        while True:
            # ip_start<ip_end 
            x1 = ip_start.rfind('.');  # x1存放起始ip的最后一位,i.e., 127.0.0.1
            x2 = ip_end.rfind('.')  # x2存放终止ip的最后一位
            if int(ip_start[x1 + 1:]) > int(ip_end[x2 + 1:]):  # 判断起始ip的最后一位是否大于终止ip的最后一位,假定在一个C类网段内
                break;
    
                # 开始扫描端口 
            for port in portList:
                print('正在扫描%s :%d' % (ip_start, port))
                try:
                    sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    sk.settimeout(10)
                    sk.connect((ip_start, port))
                    sk.settimeout(None)
                    print('Server %s port %d OK!' % (ip_start, port))
                    sk.close()
                    # 结果保存在文件中 
                    f = open("IP_Port.txt", 'a')
                    f.write(ip_start + ' : ' + str(port) + '
    ')
                    f.close()
                except Exception:
                    print('Server %s port %d is not connected!' % (ip_start, port))
    
                    # 更新ip_start,ip_start增1
            i = ip_start.rfind('.')
            x = int(ip_start[i + 1:]) + 1
            ip_start = ip_start[:i + 1] + str(x)
    
    
    if __name__ == '__main__':
        main()
        print('扫描完成,结果保存在IP_Port.txt文件中') 
    View Code
  • 相关阅读:
    从开发者角色到产品角色转换
    前端开发做什么?
    最近的前端开发认知总结
    最近的Vue知识总结
    计算机网络
    javascript 字符串加密的几种方法
    JSON数据解析
    JAVA 自定义状态码
    JAVA jdbc获取数据库连接
    JAVA通过md5方法进行加密
  • 原文地址:https://www.cnblogs.com/Osea/p/12730867.html
Copyright © 2020-2023  润新知