计算机网络上机实习报告

这篇博客详细介绍了如何使用C++在Windows下通过Socket实现TCP和UDP协议的文件传输系统,分析了不同文件大小的传输时延。同时,利用Wireshark抓包工具深入剖析了ARP协议、TCP三次握手和四次挥手的过程,展示了网络通信的实时数据包解析。
摘要由CSDN通过智能技术生成

#题目一:文件传输系统
   为巩固提⾼⽹络编程能⼒,加深对socket套接字的使⽤,并进⼀步的理解UDP和TCP之间的不同,该题⽬主要需完成以下两个⽬标:

(一)实现跨物理主机的⽂件传输系统

    首先,在Windows操作系统环境下,分别使用TCP和UDP两种协议,利用socket库,利用C++语言编写完成文件传输系统。

#Windows下Socket编程实现基于TCP协议的⼤⽂件传输
1、功能描述
  在客户端,⽤户选择本地某个⽂件,发送到服务端。如果客户端⽆法连接到服务端,客户端应该给出提⽰。
  在服务端,接受客户端发送的⽂件,并保存。如果在传输过程中服务端检测到客户端断开连接,则服务器端应该删除未完整传送的⽂件,并给出提⽰。
2、Socket通信流程

3、程序代码

(1)FileHelper.h

#include<stdio.h>
#include<stdlib.h>
#include <WINSOCK2.H>
#include <STDIO.H>
#pragma  comment(lib,"ws2_32.lib")

class FileHelper
{
private:
    FILE *f;
    char path_buffer[_MAX_PATH];
    char drive[_MAX_DRIVE];
    char dir[_MAX_DIR];
    char fname[_MAX_FNAME];
    char ext[_MAX_EXT];

public:
    FILE * selectfile()
    {
        printf("请输入要传送的文件名\n");
        scanf("%s",path_buffer);

        if (f=fopen(path_buffer,"rb"))
        {
            printf("文件打开成功\n");
            return f;
        }
        else
        {
            printf("文件不存在,请重新输入\n");
            return selectfile();
        }
    }

    char * getFileName()
    {
        _splitpath(path_buffer, drive, dir, fname, ext);
        return strcat(fname, ext);
    }
    FILE * createFile(char *name)
    {
        remove(name);
        if (f = fopen(name, "ab"))
        {
            printf("文件创建成功\n");

        }
        else
        {
            printf("文件创建失败\n");
        }
        return f;
    }

    bool createDir(char *dir)
    {
        char head[MAX_PATH] = "md ";
        return system(strcat(head, dir));
    }
};

(2)TCP客户端
   

 #include <stdio.h>
    #include <WINSOCK2.H>
    #include <STDIO.H>
    #include"FileHelper.h"
    #pragma  comment(lib,"ws2_32.lib")

    int main(int argc, char* argv[])
    {
    WORD sockVersion = MAKEWORD(2,2);//版本号
    WSADATA data;    //用来保存WSAStartup调用后返回的windows Sockets数据
    FileHelper fh;
    if(WSAStartup(sockVersion, &data) != 0)
    {
        return 0;
    }

    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.110");

    while (true)
    {
        SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sclient == INVALID_SOCKET)
        {
            printf("invalid socket !");
            return 0;
        }
        if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
        {
            printf("connect error !");
            closesocket(sclient);
            return 0;
        }
        FILE *f=fh.selectfile();
        char sendData[BUFSIZ];
        char recData[BUFSIZ];
        char over[BUFSIZ] = "Finnal";
        char * name = fh.getFileName();
        strcpy(sendData, name);
        printf("%s\n", sendData);
        int nCount;
        long long sum = 0;
        send(sclient, sendData, strlen(sendData)+1, 0);
        int ret = recv(sclient, recData, BUFSIZ, 0);
        printf(recData);
        while ((nCount=fread(sendData,1,BUFSIZ,f))>0)
        {
            printf("%db\n",sum+=nCount);

            send(sclient, sendData, nCount, 0);

            int ret = recv(sclient, recData, BUFSIZ, 0);
            if (ret >0)
            {

                //recData[ret] = 0x00;
                printf(recData);
            }
            else
            {
                printf("与服务器失去连接");
                break;
            }
        }
        send(sclient, over, BUFSIZ, 0);
        ret = recv(sclient, recData, BUFSIZ, 0);
        if (ret>0&&strcmp(recData,over)==0)
        {
            printf("传输成功!");
        }
        fclose(f);
        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值