计算机网络课程设计

实验一 Winsock网络聊天程序

一、实验题目

网络聊天程序的设计和实现。

二、实验目的

了解 Socket 通信的原理,在此基础上编写一个聊天程序。

三、总体设计

使用Winsock API进行编程,其中 SOCKET 是贯穿整个流程的一个重要元素,SOCKET将机器的ip地址、端口号都整合起来。对于服务端,使用listen函数进行监听,用 accept 函数完成对客户端请求的接收。对于客户端,使用 connect 函数连接服务端。服务端与客户端通过 send 函数与 recv 函数进行数据的发送。

四、详细设计

程序大致运行步骤如下:

在这里插入图片描述

客户端:

/* 设置服务器地址 */
    Server_add.sin_family = AF_INET;
    Server_add.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    Server_add.sin_port = htons(5000);
    /* 连接服务器 */
    socket_send = socket(AF_INET, SOCK_STREAM, 0);
    if (connect(socket_send, (SOCKADDR *)&Server_add, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
        printf("Connection Failed!\n");
    }
    /* 开始聊天 */
    while ( 1 )
    {
        //发送数据过程
        printf("Client sending:");
        scanf("%s", Sendbuf);
        SendLen = send(socket_send, Sendbuf, 100, 0);
        if (SendLen < 0)
        {
            printf("Sending Failed!\n");
        }
        //接收数据过程
        ReceiveLen = recv(socket_send, Receivebuf, 100, 0);
        if (ReceiveLen < 0)
        {
            printf("Recieving Failed!\n");
            printf("Program Failed\n");
            break;
        }
        else
        {
            printf("From surround:%s\n", Receivebuf);
        }
    }
    /* 释放套接字, 关闭动态库 */
    closesocket(socket_send);
    WSACleanup();
    system("pause");
    return 0;

服务端:

//绑定套接字到本地的某个地址和端口上
    if (bind(socket_server, (SOCKADDR *)&Server_add, sizeof(SOCKADDR)) == SOCKET_ERROR)
    {
        printf("Binding Failed!\n");
    }
    //设置套接字为监听状态
    if (listen(socket_server, 5) < 0)
    {
        printf("Listning Failed!\n");
    }
    //接受连接
    Length = sizeof(SOCKADDR);
    socket_receive = accept(socket_server, ( SOCKADDR * )&Client_add, &Length);
    if (socket_receive == SOCKET_ERROR)
    {
        printf("Recieving Failed!\n");
    }

五、实验结果与分析

程序运行演示如下:

在这里插入图片描述

程序可以完成半双工的通信。

实验二 路由追踪(Tracert)程序

一、实验题目

Tracert 与 Ping 程序设计与实现。

二、实验目的

了解 Tracert 程序的实现原理,并调试通过。

三、总体设计

Tracert程序的路由追踪主要是通过ip头部TTL与ICMP协议实现。参考课程设计指导书与C++实现路由追踪(Tracert)程序 程序向目的主机发送ICMP回显请求,每当该数据报经过一个路由器,该路由器就会发送一个ICMP超市差错报文给源主机,源主机用过解析每一份ICMP超市差错报文来获得到目的主机路上的路由信息。

四、详细设计

程序大致结构如图:

在这里插入图片描述

核心代码如下:

//计算网际校验和函数
USHORT checksum(USHORT *pBuf, int iSize) {
    unsigned long cksum = 0;
    while (iSize > 1) {
        cksum += *pBuf++;
        iSize -= sizeof(USHORT);
    }
    if (iSize) {
        cksum += *(UCHAR *) pBuf;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
    return (USHORT) (~cksum);
}
//对数据包进行解码
BOOL
DecodeIcmpResponse(char *pBuf, int iPacketSize, DECODE_RESULT &DecodeResult, BYTE ICMP_ECHO_REPLY, BYTE ICMP_TIMEOUT) {
    //检查数据报大小的合法性
    IP_HEADER *pIpHdr = (IP_HEADER *) pBuf;
    int iIpHdrLen = pIpHdr->hdr_len * 4;
    if (iPacketSize < (int) (iIpHdrLen + sizeof(ICMP_HEADER)))
        return FALSE;
    //根据 ICMP 报文类型提取 ID 字段和序列号字段
    ICMP_HEADER *pIcmpHdr = (ICMP_HEADER *) (pBuf + iIpHdrLen);
    USHORT usID, usSquNo;
    if (pIcmpHdr->type == ICMP_ECHO_REPLY) //ICMP 回显应答报文
    {
        usID = pIcmpHdr->id; //报文 ID
        usSquNo = pIcmpHdr->seq; //报文序列号
    } else if (pIcmpHdr->type == ICMP_TIMEOUT)//ICMP 超时差错报文
    {
        char *pInnerIpHdr = pBuf + iIpHdrLen + sizeof(ICMP_HEADER); //载荷中的 IP 头
        int iInnerIPHdrLen = ((IP_HEADER *) pInnerIpHdr)->hdr_len * 4; //载荷中的 IP 头长
        ICMP_HEADER *pInnerIcmpHdr = (ICMP_HEADER *) (pInnerIpHdr + iInnerIPHdrLen);//载荷中的 ICMP头
        usID = pInnerIcmpHdr->id; //报文 ID
        usSquNo = pInnerIcmpHdr->seq; //序列号
    } else {
        return false;
    }
    //检查 ID 和序列号以确定收到期待数据报
    if (usID != (USHORT) GetCurrentProcessId() || usSquNo != DecodeResult.usSeqNo) {
        return false;
    }
    //记录 IP 地址并计算往返时间
    DecodeResult.dwIPaddr.s_addr = pIpHdr->sourceIP;
    DecodeResult.dwRoundTripTime = GetTickCount() - DecodeResult.dwRoundTripTime;
    //处理正确收到的 ICMP 数据报
    if (pIcmpHdr->type == ICMP_ECHO_REPLY || pIcmpHdr->type == ICMP_TIMEOUT) {
        //输出往返时间信息
        if (DecodeResult.dwRoundTripTime)
            cout << " " << DecodeResult.dwRoundTripTime << "ms" << flush;
        else
            cout << " " << "<1ms" << flush;
    }
    return true;
}

五、实验结果与分析

程序运行结果如图所示:

实验六 电子邮件客户端程序设计与实现

一、实验题目

电子邮件客户端程序设计与实现。

二、实验目的

参照教材 6.5 节原理,设计一个电子邮件客户端程序。

三、总体设计

本实验所用到的基本原理与核心技术为SMTP(简单邮件传输协议)和POP3(邮局协议版本3)。SMTP用于发送邮件,POP3用于读取邮箱中的邮件。工作过程大致为:
首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。

四、详细设计

程序大致运行步骤如下:

在这里插入图片描述

核心代码如下:

int num;
    cin >> num;
    if(num == 1)
    {
        sockClient = socket(AF_INET, SOCK_STREAM, 0);

        pHostent = gethostbyname("smtp.qq.com");

        addrServer.sin_addr.S_un.S_addr = *((DWORD *) pHostent->h_addr_list[0]);
        addrServer.sin_family = AF_INET;
        addrServer.sin_port = htons(25);

        err = connect(sockClient, (SOCKADDR *) &addrServer, sizeof(SOCKADDR));
        buff[recv(sockClient, buff, 500, 0)] = '\0';
        message = "ehlo qq.com\r\n";
        send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        message = "auth login\r\n";
        send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        username = "________________________\r\n"; //base64加密的用户名(xxxx@qq.com)
        send(sockClient, username.c_str(), username.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        password = "________________________\r\n"; //base64加密的密码
        send(sockClient, password.c_str(), password.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        cout << "请输入目的邮箱:";
        cin >> to_addr;

        message = "MAIL FROM:________________________ \r\nRCPT TO:<";
        message.append(to_addr);
        message.append("> \r\n");
        send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        message = "DATA\r\n";
        send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';

        message = "From: ________________________\r\nTo: " + to_addr + "\r\nsubject:";
        cout << "请输入邮件标题:";
        cin >> subject;
        message.append(subject);
        message.append("\r\n\r\n");
        cout << "请输入邮件正文:";
        cin >> info;
        message.append(info);
        message.append("\r\n.\r\n");
        send(sockClient, message.c_str(), message.length(), 0);//发送邮件内容
        message = "QUIT\r\n";
        send(sockClient, message.c_str(), message.length(), 0);
        buff[recv(sockClient, buff, 500, 0)] = '\0';
        cout << "发送成功!" << endl;
    }

username = "________________________\r\n"; password = "________________________\r\n"; 中填入发送源邮箱的邮箱号(username)与SMTP/POP3授权码(password)即可以此邮箱发送邮件;下面的 message = "MAIL FROM:________________________ \r\nRCPT TO:<";message = "From: ________________________\r\nTo: " + to_addr + "\r\nsubject:"; 用于查阅邮件填入的信息是欲查阅邮箱的邮箱号(username)与授权码(password)。

五、实验结果与分析

程序运行演示如下:

在这里插入图片描述

在这里插入图片描述

仅供学习参考,文中可能出现错误,还请自行甄别,文中展示代码仅为部分核心代码。

目 录 摘 要 1 关键词: 计算机网络;网络规划;网络设计 ;校园网 1 一. 前言 2 二. 学校描述 3 三. 需求分析 4 3.1 带宽 4 3.2 子网与VLAN规划 4 3.3 实现的信息服务 4 3.4 应用程序 5 3.5 存储系统分析 5 3.6 系统及数据安全分析 5 3.7 QoS 5 3.8 网间隔离 6 四. 拓扑图及方案整体描述 7 4.1 主干网传输方案设计 7 4.2 Internet接入方案 7 4.3 远程访问支持 8 4.4 子网划分 9 4.5 网间隔离方案设计 12 4.6存储方案 13 4.7 设备选型 13 4.8 软件 14 4.9 信息服务方案 14 4.10 综合布线方案 15 4.10.1 结构化布线设计 15 4.10.2 综合布线系统 16 4.10.3设计目标 17 4.10.4工作区设计 18 4.10.6主干线区设计 19 4.10.7子配线间设计 20 4.10.8主配线间设计 21 五. 网络管理 22 5.1网络管理 22 5.2远程监控 22 5.2.1 制作客户端安装盘 22 5.2.2 配置客户机 23 5.2.3远程控制 23 5.3网络安全 24 六. 系统主要设备报价 26 七. 网络测试及协议数据包分析 27 参考资料 31 致谢 32 摘 要 当今的世界正从工业化社会向信息化社会转变。一方面,社会经济已由基于资源的经济逐渐转向基于知识的经济,人们对信息的需求越来越迫切,信息在经济的发展中起着越来越重要的作用,信息的交流成为发展经济最重要的因素。另一方面,随着计算机、网络和多媒体等信息技术的飞速发展,信息的传递越来越快捷,信息的处理能力越来越强,信息的表现形式也越来越丰富,对社会经济和人们的生活产生了深刻的影响。网上教育以受众广、投入低、不受师资的校舍等条件限制、容易开展高水平教育、教学质量相对容易保证等特点而受到教育界的广泛重视,目前国内一些重事业高校的网站已经开展这方面的应用。但现在中小学的校园网正在建设阶段。中小学建设校园计算机网络的根本动机,就是提高学校的管理效益和教学质量。而并非只有大量的资金投入,建设具有规模的计算机网络,才能开展学校的教育手段。架设满足学校应用需求的小的局域网络、教学网络同样也能发挥大的教育效益。 网络是信息时代的产物,互联网本身以及各种基于互联网的应用都成了学校教学的内容,这就需要一个平台支持实施这种教学活动.校园网就是利用学校原有的内部局域网, ,通过架设WEB服务器、FTP服务器、论坛、在线流媒体等,从而组建起一个校园网络,促进学校教育的发展. 关键词: 计算机网络;网络规划;网络设计 ;校园网 一. 前言 在二十一世纪的现代信息社会中,对于网络办公和学习是越来越受到重视很运用,几乎在全球的绝大多数学校都组建了网络环境。在通信设备不断普及的今天,原始的教学方式已经不能完全满足我们学习和生活的需求。为了提高教育和学习的质量,所有师生对网络办公和学习的需求是迫在眉睫,所有人都希望在校园里的都能上网络。正所谓大有大的难处,校园网一般具有较大的规模,它不是网络设备的简单组合,而是一种整体的校园系统。校园网必须满足校园扩展需要,确保高吞吐量、安全性。在很多时候,由于校园网络的种种问题的产生,以及学校对网络的需求随着学校的扩招却迅速增大。因此迫切需要在保障学生的学习和生活不受到影响的前提下,通过引进先进的组网模式,改造或者重新规划建设校园网络,以满足学校对网络的需求,保障学校的正常运转,同时实现教育信息化的目标。要求全新设计的校园网络能够最大限度的保护现有网络投资,以最低的造价实现信息化校园网络的标准,以满足日益增长的校园建设需求;建成后的网络应易于应用、管理和维护;施工过程中不能影响学校的正常运转,所提供的方案最好具有推广的价值,或者能够有效的降低网络接入与运行费用,保障大多数学生、教职员工都能够有条件接入、使用网络,提高学习与工作效率,实现教育的信息化。鉴于现在大多数校园都已经普及了有线网络,为了保障投资和提高网络的利用率以及最大限度的保障网络的健壮性,我在下面的方案中主要是以校园网组网为主。为所有师生提供最好的网络接入方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值