• 客户端

     #define  _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include <string.h>
    #pragma comment(lib,"ws2_32.lib") //定义端口
    #define PORT 6666
    //缓冲区大小
    #define BUF_SIZE 1024
    //文件名大小
    #define FILENAMESIZE 512
    //本地地址
    #define SIP "192.168.1.108" //主函数
    void main()
    {
    //用于初始化网络
    WSADATA wsadata;
    //定义版本
    WORD socketversion = MAKEWORD(, );
    //初始化网络
    if (WSAStartup(socketversion,&wsadata)!=)
    {
    printf("网络初始化失败");
    return;
    }
    //创建TCP通信
    SOCKET client_socket = socket(AF_INET, SOCK_STREAM, );
    //判断是否创建成功
    if (client_socket==SOCKET_ERROR)
    {
    printf("网络创建通信socket出错");
    return;
    }
    //设定服务器信息
    SOCKADDR_IN sever_addr;
    sever_addr.sin_family = AF_INET;
    sever_addr.sin_addr.S_un.S_addr = inet_addr(SIP);
    //设定IP,端口
    sever_addr.sin_port = htons(PORT);
    //连接到服务器
    if (connect(client_socket, (SOCKADDR*)&sever_addr, sizeof(sever_addr)) == SOCKET_ERROR)
    {
    puts("连接错误");
    return;
    }
    char filename[] = { };
    //初始化
    scanf("%s", filename); char buffer[] = { };
    memset(buffer, , );
    strcpy(buffer, filename); //传递文件名,请求下载
    if (send(client_socket,buffer,,) <)//传输出错
    {
    puts("传输错误");
    return;
    } //写文件
    FILE *pf= fopen(filename, "wb");
    if (pf==NULL)
    {
    puts("文件打开失败");
    return; }
    else
    {
    memset(buffer, , );
    int length = ;
    printf("文件开始传输");
    //不断接收
    while ((length=recv(client_socket,buffer,,))>)
    {
    if (fwrite(buffer,sizeof(char),length,pf)<length)
    {
    puts("文件传输错误");
    }
    memset(buffer, , );
    }
    printf("文件传输成功");
    system("pause");
    system(filename);
    }
    //关闭文件网络,清理网络
    fclose(pf);
    closesocket(client_socket);
    WSACleanup();
    }
  • 服务器端
     #define  _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include <string.h>
    #pragma comment(lib,"ws2_32.lib") #define PORT 6666
    #define BUF_SIZE 1024
    #define FILENAMESIZE 512
    #define SIP "169.254.29.232" void main()
    {
    //初始化服务器ip地址与端口号并定义谁可以连接
    SOCKADDR_IN server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    //本地ip地址
    server_addr.sin_addr.S_un.S_addr = INADDR_ANY;
    WSADATA wsadata;
    WORD socketversion = MAKEWORD(, );//定义版本
    if (WSAStartup(socketversion, &wsadata) != )
    {
    printf("网络初始化失败");
    return;
    }
    //创建
    SOCKET server_socket = socket(AF_INET, SOCK_STREAM, );//创建
    if (server_socket == SOCKET_ERROR)
    {
    printf("网络创建通信socket出错");
    return;
    }
    //绑定
    if (SOCKET_ERROR == bind(server_socket,(SOCKADDR*) &server_addr, sizeof(server_addr)))
    {
    printf("bind 出错");
    return;
    }
    //监听
    if (SOCKET_ERROR == listen(server_socket,))
    {
    printf("listen 出错");
    return;
    }
    //传文件 while ()
    {
    printf("进入listen,开始等待客户端");
    //客户端地址
    SOCKADDR_IN client_addr;
    int clientlength = sizeof(client_addr);
    //接收连接
    SOCKET new_socket = accept(server_socket, (SOCKADDR*)&client_addr, &clientlength);
    if (SOCKET_ERROR == new_socket)
    {
    printf("服务器已经满或者链接失败");
    break;
    }
    char buffer[] = { };
    char filename[] = { };
    //接收信息
    if (recv(new_socket,buffer,,)<)
    {
    printf("收取文件名失败");
    break;
    }
    strcpy(filename, buffer); //以二进制方式读取
    FILE *pf = fopen(filename, "rb");
    if (pf == NULL)
    {
    printf("文件打开失败");
    break;
    }
    else
    {
    memset(buffer, , );//清零
    int recelength = ;
    while ((recelength = fread(buffer, sizeof(char), , pf)>))
    {
    if (send(new_socket,buffer,,)<)
    {
    printf("文件传输失败");
    break;
    }
    memset(buffer, , );//清零
    }
    fclose(pf);
    printf("传输完成"); } closesocket(new_socket);
    }
    closesocket(server_socket);
    system("pause");
    WSACleanup();
    }

106.TCP传文件的更多相关文章

  1. C++中使用TCP传文件

    在两个文件中都定义文件头和用到的宏: #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead { ]; int size; }; 在客户端发 ...

  2. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

  3. day29 8_8 TCP上传文件socketserver的应用

    一.文件上传 对于一些比较大的文件,当传输的数据大于内存时,显然,一次性将数据读取到内存中,在从内存传输到服务器显然时不可取的. 所以,在上传文件时,可以在with open打开文件,边读取文件边发送 ...

  4. TCP通信---文件上传案例、多线程文件上传

    目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现. TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件 代码实 ...

  5. 那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 客户端上传文件到服务器端服务器端返回上传成功消息

    多线程开启, 客户端通过 Socket 流 上传文件到服务端的一个小程序练习. 1. 抓住阻塞式方法,去调试 2. 获取对应流对象操作对应的对象 这时候自己不能懵,一定要清晰,最好命名就能区别,一搞混 ...

  6. java 利用TCP上传文件

    从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io. ...

  7. 通过HTTP协议上传文件

         HTTP是很常见的协议,虽然用得很多,但对细节的了解却是很浅,这回通过向服务端上传文件信息来理解细节.网络库的选择:1.WinHTTP是windows下常用的库:2.CURL是广受喜爱的开源 ...

  8. 使用Servlet上传文件

    使用浏览器向服务器上传文件其本质是打开了一个长连接并通过TCP方式传输数据.而需要的动作是客户端在表单中使用file域,并指定该file域的name值,然后在form中设定enctype的值为mult ...

  9. 记一次FTP上传文件总是超时的解决过程

    好久没写博,还是重拾记录一下吧. 背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有SSH功能的,后来发现不是这样样子啊,云虚拟机就是FTP上传网页+MySQ ...

随机推荐

  1. P3908 异或之和

    题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值. A \bigoplus BA⨁B 即AA , BB 按位异或. 输入输出格式 输入格 ...

  2. 分享vue中 slot用法

    //slot默认用法 //slot带参数name用法

  3. OpenGL常见错误之——glut.h文件的函数无法正常连接

    glut.h文件的函数无法正常连接,典型的错误如下:------ 已启动生成: 项目: gears, 配置: Debug Win32 ------1>正在链接...1>GEARS.obj ...

  4. express随笔

    Express 是node 第三方框架,框架的意义就在于能大大简化程序地开发.看一下Express是怎么简化node程序开发的. 1,用Express写一个hello world 程序,我们来体验一下 ...

  5. 小米开源便签Notes-源码研究(2)-定时提醒的便签

    本篇讲述小米便签中的定时提醒功能.  便签,可以理解为一件事情,一项任务,有个定时提醒的功能,还是蛮不错的~    小米便签定时功能,是当编辑便签的时候,有个菜单项,选了之后,就弹出一个"日 ...

  6. 洛谷—— P2580 于是他错误的点名开始了

    https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次 ...

  7. 为线程绑定CPU

    // learn gcc atomic variable #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> ...

  8. 机房收费系统——UML类图

    在对一个软件系统进行设计和建模的时候,一般是从构造系统的基本词汇開始,包含构造这些词汇的基本属性和行为. 系统分析师假设要对所设计的系统清晰认识.还有考虑这些基本词汇之间的关系.而假设把这些行为可视化 ...

  9. Android开发系列(十六):【Android小游戏成语连连看】第二篇

    写的晚了,在分工个Z市高中的一个成绩查询的系统,原系统居然是用VB写的,我不得不佩服原本写系统的那位哥们真能耐得住. 明天搭建下SVN就等着先发project款然后開始项目了.想想有工资进账,心里也为 ...

  10. android启动模式对于体验的影响

    说到Android的启动模式.懂Android的人肯定都懂. 通过设置启动模式我们不仅能够节省内存的使用.还能达到更好的体验,比方我们打开一个应用,点击home键回到主界面的时候程序是没有被kill掉 ...