【网络编程实验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) + '\n')
                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

猜你喜欢

转载自www.cnblogs.com/Osea/p/12730867.html