Code First.

Server.c代码分析。

  

  1.引入一些头文件和dll.

    

#include <winsock2.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>#pragma comment(lib, "ws2_32.lib")

  2.服务器建立Socket套接字

  

    

View Code

void main(void){WSADATA            wsaData;SOCKET            MainSocket;//Socket对象SOCKADDR_IN        sin;//Socket结构int                Port = 5151;//端口int                Ret;//返回值// 初始化,加载系统资源if ((Ret = WSAStartup(MAKEWORD(2,2),&wsaData) != 0)) {printf("WSAStartup 失败: %d\n",Ret);return ;}//创建套接字if ((MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET) {printf("Socket 创建失败: %d\n",WSAGetLastError());WSACleanup();//回收资源return ;}//填充sockaddr_in结构sin.sin_family = AF_INET;sin.sin_port = htons(Port);sin.sin_addr.s_addr = htonl(INADDR_ANY);//操作系统分配地址//绑定地址if (bind(MainSocket,(SOCKADDR *)&sin,sizeof(sin)) == SOCKET_ERROR) {printf("绑定失败: %d\n",WSAGetLastError());WSACleanup();return ;}//监听if ( listen(MainSocket,5) == SOCKET_ERROR) {printf("监听失败:    %d\n",WSAGetLastError());return ;}printf("We are awaiting a connection on port %d.\n", Port);// 循环处理客户连接请求while(1) {SOCKADDR_IN        ClientAddr;//声明新的Socket结构体int                ClientAddrLen = sizeof(ClientAddr);//结构体长度// 接收新的客户机,返回与客户机连接的套接字
SOCKET NewConnection = accept(MainSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen);if (NewConnection == INVALID_SOCKET) {continue;//结束当前循环,进入下一次,获取新的连接
        }// 启动交互线程CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MutilThread, (void*)NewConnection, 0, NULL);}//释放资源
closesocket(MainSocket);WSACleanup();}    

  3.发送文件

View Code

char FileTrans1(SOCKET sock, char *filename) {char buf[8192];//缓冲数组FILE *fp;//文件指针struct _stat    info;//结构体描述int filesize ;//文件大小int res ;//发送结果int blocks ;//文件块int i;//循环索引
_stat(filename,&info);//获取文件大小
filesize = info.st_size;printf("文件大小: %d\n", filesize);fp = fopen(filename,"rb");if (fp == NULL) {printf("文件打开错误..\n");//    exit(1);return -1;}//发送文件大小res = send(sock,(char *)&filesize,sizeof(filesize),0);printf("发送大小: %d\n",res);//读文件blocks = filesize /sizeof(buf) + 1;printf("文件 blocks : %d\n",blocks);for(i = 0; i < blocks; i++) {//清空缓冲区memset(buf,0,sizeof(buf));//读取一个数据块fread(buf,sizeof(buf),1,fp);//发送一个数据块res    = send(sock,buf,sizeof(buf),0);printf("第 %d 次发送: %d\n", i+1,res);}//发送完毕,关闭文件指针
    fclose(fp);return 0;
}

Client.c

  测试代码:

  

View Code

#include <stdio.h>
#include <winSock2.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>#pragma comment(lib, "ws2_32.lib")/*  函数名:getFileSizeSystemCall(char * strFileName)     功能:获取指定文件的大小  参数:  strFileName (char *):文件名  返回值:  size (int):文件大小  */
int getFileSizeSystemCall(char * strFileName)
{   struct stat temp;   stat(strFileName, &temp);   return temp.st_size;
} int getFileSize(char * strFileName){FILE *fp;int size;if ((fp = fopen(strFileName,"rb")) == NULL) {printf("File open error\n");return 0;}fseek(fp,0L,SEEK_END);size = ftell(fp);fclose(fp);return size;
}void RecvFile(SOCKET sock,char *filename);void main(void)
{WSADATA              wsaData;SOCKET               s;SOCKADDR_IN          ServerAddr;int                  Port = 5151;//    char                msg1[128];//    char                msg2[128];
WSAStartup(MAKEWORD(2,2), &wsaData);// 创建一个新的Socket来连接服务器
 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 填写客户端地址信息// 端口为5150// 服务器IP地址为"136.149.3.29",注意使用inet_addr将IP地址转换为网络格式
ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(Port);    ServerAddr.sin_addr.s_addr = inet_addr("10.160.17.141");//192.168.1.103// 向服务器发出连接请求if ( connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)) ==SOCKET_ERROR) {printf("Connection Error....\n");return ;} printf("Connectd....\n");//    recv(s,msg1,sizeof(msg1),0);//    recv(s,msg2,sizeof(msg2),0);//    printf("msg = %s\n",msg1);//    printf("msg = %s\n",msg2);
RecvFile(s,"G:\\test.rmvb");// 新的连接建立后,就可以互相通信了,在这个简单的例子中,我们直接关闭连接,// 并关闭监听Socket,然后退出应用程序
closesocket(s);// 释放Windows Socket DLL的相关资源
      WSACleanup();getchar();
}void RecvFile(SOCKET sock,char *filename){FILE *fp;//文件指针char buf[8192];//缓冲区int filesize ;int blocks;int i;int res;int count ;printf("开始接收文件..\n");//接收文件大小recv(sock,(char *)&filesize,sizeof(filesize),0);printf("接收文件大小: %d\n",filesize);fp = fopen(filename,"wb+");if (fp == NULL) {printf("Client...文件打开错误..\n");exit(1);}//接收数据blocks = filesize / sizeof(buf) + 1;printf("块大小: %d\n",blocks);for (i=0; i<blocks;++i) {//清空缓冲区memset(buf,0,sizeof(buf));//接收数据res = recv(sock,buf,sizeof(buf),0);//写入数据count = fwrite(buf,sizeof(buf),1,fp);printf("第 %d 次是否写入: %d\n",i+1,count);printf("第 %d 次接收: %d\n", i+1,res);}//关闭文件
    fclose(fp);
}

  

转载于:https://www.cnblogs.com/scherrer/archive/2013/04/01/2994505.html

C语言通过网络实现发送文件的一点记录相关推荐

  1. 易语言通过服务器发送文件,易语言服务器与客户端发送文件

    易语言服务器与客户端发送文件 内容精选 换一换 PL/pgSQL是一种可载入的过程语言.用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方.例如,可以创建复杂条件的计算函数并且后面用它们 ...

  2. m3u8文件里只有js链接,没有ts链接,和key文件的一点记录

    xxxx是域名或者接口,别问为什么,问就是怂. 一般来说,m3u8文件是类似于下面这样的 它有很多的ts链接,可以下载对应的ts文件视频,在通过别的方法去合并成一个完整的长视频. 前两天,爬虫出了bu ...

  3. 易语言 上传文件到远程服务器,易语言与向远程服务器发送文件夹

    易语言与向远程服务器发送文件夹 内容精选 换一换 一.IDEA连接SSH 确认你的密码输对了,还好我保存了我的远程服务器的密码,原先我一直以为我输对了,导致一直报错Auth fail 点击ok,连接上 ...

  4. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...

  5. (转)C#网络编程(订立协议和发送文件) - Part.4

    源码下载:http://www.tracefact.net/SourceCode/Network-Part4.rar C#网络编程(订立协议和发送文件) - Part.4 文件传输 前面两篇文章所使用 ...

  6. Linux网络编程--sendfile零拷贝高效率发送文件

    本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证. 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: # ...

  7. C#网络编程:4订立协议和发送文件

    前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件.比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1.S2或S3(S为Send缩写)时,分别向服务 ...

  8. {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习

    要求: 实现多个客户端发送文件给一个服务器端提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给这 ...

  9. C#网络编程(订立协议和发送文件) - Part.4

    转载自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx 文件传输 前面两篇文章所使用的范例都是传输 ...

最新文章

  1. flask从服务器获取html页面,flask的ajax、获取服务器数据、放到前端页面、如果数据存在显示标签、如果不存在不显示标签...
  2. 软件工程学完java后干_软件工程学习后的一些体会--------两周
  3. linux c 结构体初始化的四种方法
  4. java数数字及while和do while 的使用,以及程序的调试与验证
  5. MongoDB学习笔记(一)--基础
  6. html bootstrap复选框全选,javascript+bootstrap+html实现层级多选框全层全选和多选功能代码实例...
  7. matlab画横的/水平的条形图
  8. python 协程和异步的关系_python 协程和异步I/O的实践
  9. python在哪个方向岗位最多_Python就业方向这么多,哪些岗位最有发展?
  10. 3.26 Tensorflow 实验记录
  11. 【推荐】网络安全学习路线和资料分享
  12. Shim Polifill区别
  13. MML ch 10 主成分分析降维(Dimensionality Reduction with Principal Component Analysis)
  14. 构建Spring Web应用程序
  15. android 录屏工具,Android截屏、录屏工具
  16. 【Unity——阴影实现基本原理】
  17. 幂果支招:哪里找免费的Mac版音频剪辑软件
  18. swap分区、硬盘和磁盘
  19. 淘宝淘金币助手,自动完成淘金币任务,蚂蚁庄园和蚂蚁森林,天猫领红包和收取能量
  20. jQuery幻灯片带缩略图平移滑动焦点图

热门文章

  1. 阻塞非阻塞,同步异步四种I/O方式
  2. vmware view由哪些组件组成?
  3. iptables_ftp
  4. 梦如果实现以后。。。。。。
  5. 为什么我从Mac切换到Linux
  6. raspberry pi_如何启动新的Raspberry Pi
  7. linux 启动启动服务_更快地启动Linux
  8. 最末参与者优化 lpo_优化博客以提高读者参与度的6种方法
  9. ES6/03/函数的定义方式和调用方式,函数内的this指向,改变函数中this指向的三个方法(call(),apply(),bind())
  10. LeetCode 451. 根据字符出现频率排序(Sort Characters By Frequency)