c++TCP socket实时文件传输

2023-05-16

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

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

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

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


//服务端
/*写在前面:
众所周知,TCP在进行传输的时候需要三次握手,很幸运,这些东西windows都封装好了,不用我一个初学者再写(我也不会2333)
于是,需要注意的就只有网络通信本身了。
怎样才能定位到对方的计算机和对方的对应通讯程序呢?
IP地址用来定位计算机,每一个程序所对应的有一个1~32768的一个数字称为端口,用这个数字来定位计算机内部众多的程序。
下文的注释把套接字比喻为电话机,可能比较明了。
*/

#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台电话


    //发现监听对象,接电话
    //获得对方的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<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));
    

    //发送一个文件名
    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;
}  

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++TCP socket实时文件传输 的相关文章

随机推荐

  • c#中控件事件注册的几种方法

    1 在子控件类中重写 xff0c 加入如下方法和事件成员后就可通过UI界面在事件编辑器中的杂项中找到 MyButton ClickEvent事件单击后设计器会自动添加一个方法绑定到MyButton ClickEvent事件中 public
  • c#中动态加载及显示UserControl和Form在父控件中

    1 UserControl的动态加载及显示与普通Control一致 如UserControl A 61 new UserControl parentControl Controls Add A 即可显示 2 Form的话需要show 或Vi
  • MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意 xff1a 非模态和模态对话框都有自己的消息响应过程函数WindowPro 只不过他们的调用模态是自己的消息泵 xff0c 非模态是由父窗体或父窗体的上一级的消息泵来调用 模态对话框和非模态对话框都可以通过SendMessage这个A
  • c#中子控件在父控件中显示的位置问题

    1 Control ShowDialog Control Parent 之前使Control StartPosition 61 FormStartPosition CenterScreen便可在父控件中居中于屏幕显示
  • 控件中的Cliked事件和MouseDown事件执行优先级问题

    MFC中 1 Button控件鼠标事件执行顺序 1 WM LBUTTONDOWN 2 WM LBUTTONUP 3 OnBnClickedButton1 2 Picture Control的鼠标事件执行顺序 1 WM LBUTTONDOWN
  • MFC中手动添加消息处理函数PreTranslateMessage截获按键等消息

    PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的 xff0c 绝大多数本窗体的消息都要通过这里 xff0c 比較经常使用 xff0c 当须要
  • OpenStack核心组件

    OpenStack覆盖了网络 虚拟化 操作系统 服务器等各个方面 它是一个正在开发中的云计算平台项目 xff0c 根据成熟及重要程度的不同 xff0c 被分解成核心项目 孵化项目 xff0c 以及支持项目和相关项目 每个项目都有自己的委员会
  • mfc中钩子的使用

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • mfc-钩子的使用方法详解

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • mfc-钩子的使用方法详解

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • c#中的消息处理函数和vc中的消息处理函数区别

    从vc入门编程的 xff0c 相信大家都很熟悉PreTranslateMessage和WindowProc两个函数 xff0c 前者是预处理windows发给控件的消息 xff0c 后者是处理剩余的控件消息 对于PreTranslateMe
  • c#中怎么截获按钮消息的几种方法实例验证

    public partial class Form2 Form public Form2 InitializeComponent this button1 MouseEnter 43 61 new EventHandler object o
  • QT中连接Mysql数据库及增删改查实例

    QT连接Mysql数据库步骤相对比较麻烦 xff0c 因此写了篇文章将详细过程呈现给大家 xff0c 欢迎大家来评论区指导提问 方法一 直接通过MySQL的驱动加载数据库 示例代码 xff1a xff08 1 xff09 在 pro文件中添
  • mysql 大批量数据优化插入数据速度

    在 MySQL 中 xff0c 向数据表插入数据时 xff0c 索引 唯一性检查 数据大小是影响插入速度的主要因素 本节将介绍优化插入数据速度的几种方法 根据不同情况 xff0c 可以分别进行优化 对于 MyISAM 引擎的表 xff0c
  • qt连接MySql数据库及增删改查示例

    include 34 mainwindow h 34 include 34 ui mainwindow h 34 include 34 QtSql QSqlDatabase 34 include 34 QMessageBox 34 incl
  • QT中拷贝一个项目的ui界面到另一个项目时Ui.h文件时Ui.h文件控件变量错乱问题解决

    qt中赋值另一个项目的ui时可能会产生在UI h的界面文件中控件变量确实或错乱 xff0c 这是可以去另一个项目的UI h文件中赋值全部代码拷贝到错乱的UI h中 xff0c 然后修改 一下 void setupUi QDialog Ins
  • C++中TCP socket传输文件

    在两个文件中都定义文件头和用到的宏 xff1a define MAX SIZE 10 define ONE PAGE 4096 struct FileHead char str 260 int size 在客户端发送接收阶段 xff1a 1
  • 使用Zeromq和protobuf实现的socket通信

    本文介绍使用ZeroMQ 下文简称ZMQ 结合protobuf序列化实现客户端和服务端的通信 在之前的一篇文章中 http blog csdn net cjf wei article details 52894560 介绍了Google的p
  • QT 中多线程实现方法总结

    第一 xff1a 用QtConcurrentRun类 xff0c 适合在另一个线程中运行一个函数 不用继承类 xff0c 很方便 第二 xff1a 用QRunnable和QThreadPool结合 继承QRunnable xff0c 重写r
  • c++TCP socket实时文件传输

    分为服务端和客户端 xff0c 实现文件的传输 好吧确实是有点本末倒置 xff0c 应该先上消息的互传 xff0c 再进行文件的传输 xff0c 这是因为在学习消息的传输时没有找到合适的讲得明白的教程 现在再回头看消息传输 xff0c 其实