Windows下 TCP传输文件+MFC界面

一、标题
Windows下 TCP传输文件+MFC界面
二、目的
1、完成双机TCP通信(初步完成WinSock调用)
2、有一定的界面布局
三、实验环境
Windows10+Visual Studio 2022+MFC+C++
四、实验过程
考虑到实验的便利性,本次实验均采用自发自收的方式;
1.界面布局
服务器端:
在这里插入图片描述
客户端:在这里插入图片描述
界面代码太多了,就先不贴了,网上也有很多类似教程。

2.双机TCP通信
单纯的TCP通信代码,网上很多
客户端初始化

#include<cstdio>
#include<winsock2.h>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

int main()
{
    //初始化套接字(winsocket)
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //打电话
    SOCKET hClntSOCK = socket(PF_INET, SOCK_STREAM, 0);//创建流式套接字TCP
    //127.0.0.1(本机)7777(端口号)
    SOCKADDR_IN clntAddr;
    memset(&clntAddr, 0, sizeof(clntAddr));//同服务端,清空结构体
    clntAddr.sin_family = AF_INET;
    clntAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    clntAddr.sin_port = htons(7777);

    //连接
    connect(hClntSOCK, (SOCKADDR*)&clntAddr, sizeof(clntAddr));
    printf("连接成功\n");

    //发送一个文件名
    send(hClntSOCK, "2.txt", 1024, 0);
    FILE* fp = fopen("2.txt", "rb");//打开文件,只读
    char buf[1024] = { 0 };
    int bytes;
    while ((bytes = fread(buf, 1, 1024, fp)) > 0)//读取文件内容,每次一个1024字节
    {
        send(hClntSOCK, buf, 1024, 0);//把buf里存的东西send给服务端
    }
    fclose(fp);//传输完成,关闭文件
    printf("传输完成\n");
    closesocket(hClntSOCK);
    WSACleanup();//回收套接字
    return 0;
}

服务器端初始化

#include<cstdio>
#include<winsock2.h>
#include<cstring>
#include<Windows.h>
#pragma comment(lib,"ws2_32.lib")//链接lib库,
using namespace std;

int main()
{
    //初始化套接字(winsocket)
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);//MAKEWORD,把两个32位int绑定为一个数,(版本号)
    //安装电话机(创建套接字)PF_INET=Ipv4
    SOCKET hServSock = socket(PF_INET, SOCK_STREAM, 0);//IPv4协议,流式套接字,0表示TCP
    //绑定电话号码和分机号(ip&端口)
    SOCKADDR_IN servAddr;//定义一个套接字(结构体)
    memset(&servAddr, 0, sizeof(servAddr));//清空结构体servAddr内的东西
    servAddr.sin_family = AF_INET;//服务端,所以需要的是地址簇(family),AF_INET表示IPv4协议
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);//使用自身的IP地址。htonl:将主机的无符号长整形数转换成网络字节顺序;INADDR_ANY表示本机IP
    servAddr.sin_port = htons(7777);//0~1024不能用;确定端口号;htons转化类型
    bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr));//把电话机和电话号码绑定,即套接字和存储地址和端口号的结构体绑定。
    //监听,拿起电话听筒听对面是否说话

    listen(hServSock, 5);//最多5台电话
    printf("等待连接。。。\n");

    //发现监听对象,接电话
    //获得对方的ip,端口号
    SOCKADDR_IN clntAddr;
    int clntAdrSz = sizeof(clntAddr);
    SOCKET hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntAdrSz);//创建
    //说话
    //看一下对方的ip地址
    printf("对方IP为%s\n", inet_ntoa(clntAddr.sin_addr));
    char buf[1025] = { 0 };
    recv(hClntSock, buf, 1024, 0);//先接受文件名
    printf("接收文件名为%s\n", buf);

    FILE* fp = fopen(buf, "wb");//用文件名创造二进制文件

    int bytes;
    while ((bytes = recv(hClntSock, buf, 1024, 0)) > 0)//每次接受1024个字节存在buf里
    {
        fwrite(buf, 1, bytes, fp);//把buf里的东西存在文件中
    }
    printf("接收完成\n");
    fclose(fp);//完成,关闭文件
    closesocket(hClntSock);//销毁套接字
    closesocket(hServSock);
    //空文件,接收内容
    WSACleanup();//回收套接字
    return 0;
}

``3.发送超大数据文件
代码中采用fopen_s打开文件,并进行拆分发送,因此最大发送文件大小为fopen_s最大打开文件大小,为2GB,
发送1.2GB文件如图所示,在发送过程中,能感受到明显的时延。
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念一季花败

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值