• c++TCP socket实时文件传输


    分为服务端和客户端,实现文件的传输

    好吧确实是有点本末倒置,应该先上消息的互传,再进行文件的传输,这是因为在学习消息的传输时没有找到合适的讲得明白的教程

    现在再回头看消息传输,其实也是一样的步骤,只不过把文件改成了字符串而已,应该是会简单一点的。

    废话不多说,直接上代码,尽量在代码里多加点注释叭

    //服务端
    /*写在前面:
    众所周知,TCP在进行传输的时候需要三次握手,很幸运,这些东西windows都封装好了,不用我一个初学者再写(我也不会2333)
    于是,需要注意的就只有网络通信本身了。
    怎样才能定位到对方的计算机和对方的对应通讯程序呢?
    IP地址用来定位计算机,每一个程序所对应的有一个1~32768的一个数字称为端口,用这个数字来定位计算机内部众多的程序。
    下文的注释把套接字比喻为电话机,可能比较明了。
    */
    
    #include
    #include
    #include
    #include
    #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台电话
    
    
        //发现监听对象,接电话
        //获得对方的ip,端口号
        SOCKADDR_IN clntAddr;
        int clntAdrSz = sizeof(clntAddr);
        SOCKET hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &clntAdrSz);//创建
        //说话
        //看一下对方的ip地址
        //printf("%s", 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里的东西存在文件中
        }
        fclose(fp);//完成,关闭文件
        closesocket(hClntSock);//销毁套接字
        closesocket(hServSock);
        //空文件,接收内容
        WSACleanup();//回收套接字
        return 0;
    }

    /*写在前面
    有了前面的服务端,会发现,其实客户端和服务端长得是很像的
    话不多说,直接开始
    */
    
    #include
    #include
    #include
    #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));
        
    
        //发送一个文件名
        send(hClntSOCK,"1.mp4",1024,0);
    
        FILE* fp = fopen("1.mp4", "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);//传输完成,关闭文件
        closesocket(hClntSOCK);
        WSACleanup();//回收套接字
        return 0;
    }

    /***************************************************************

  • 相关阅读:
    纯CSS 自定义radio单选按扭、checkbox复选框 默认样式
    AI入门之深度学习:基本概念篇
    Docker——容器生命周期管理(下篇)
    css3 hover效果
    优化函数和损失函数的区别与联系
    win中的vscode利用ssh插件,在同一台电脑的virtualbox虚拟出来的ubuntu中编译,调试设置方法
    预训练模型相对位置编码和绝对位置编码的通俗理解
    实验5-2——网络yum源的配置
    PHP Zip File 函数
    集合——Set
  • 原文地址:https://blog.csdn.net/u011555996/article/details/127736621