C语言通过网络实现发送文件的一点记录
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套接字
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.发送文件
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
测试代码:
#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语言通过网络实现发送文件的一点记录相关推荐
- 易语言通过服务器发送文件,易语言服务器与客户端发送文件
易语言服务器与客户端发送文件 内容精选 换一换 PL/pgSQL是一种可载入的过程语言.用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方.例如,可以创建复杂条件的计算函数并且后面用它们 ...
- m3u8文件里只有js链接,没有ts链接,和key文件的一点记录
xxxx是域名或者接口,别问为什么,问就是怂. 一般来说,m3u8文件是类似于下面这样的 它有很多的ts链接,可以下载对应的ts文件视频,在通过别的方法去合并成一个完整的长视频. 前两天,爬虫出了bu ...
- 易语言 上传文件到远程服务器,易语言与向远程服务器发送文件夹
易语言与向远程服务器发送文件夹 内容精选 换一换 一.IDEA连接SSH 确认你的密码输对了,还好我保存了我的远程服务器的密码,原先我一直以为我输对了,导致一直报错Auth fail 点击ok,连接上 ...
- C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。
C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口. 最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件 抖动窗口功能 ...
- (转)C#网络编程(订立协议和发送文件) - Part.4
源码下载:http://www.tracefact.net/SourceCode/Network-Part4.rar C#网络编程(订立协议和发送文件) - Part.4 文件传输 前面两篇文章所使用 ...
- Linux网络编程--sendfile零拷贝高效率发送文件
本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证. 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: # ...
- C#网络编程:4订立协议和发送文件
前面两篇文章所使用的范例都是传输字符串,有的时候我们可能会想在服务端和客户端之间传递文件.比如,考虑这样一种情况,假如客户端显示了一个菜单,当我们输入S1.S2或S3(S为Send缩写)时,分别向服务 ...
- {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
要求: 实现多个客户端发送文件给一个服务器端提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给这 ...
- C#网络编程(订立协议和发送文件) - Part.4
转载自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx 文件传输 前面两篇文章所使用的范例都是传输 ...
最新文章
- flask从服务器获取html页面,flask的ajax、获取服务器数据、放到前端页面、如果数据存在显示标签、如果不存在不显示标签...
- 软件工程学完java后干_软件工程学习后的一些体会--------两周
- linux c 结构体初始化的四种方法
- java数数字及while和do while 的使用,以及程序的调试与验证
- MongoDB学习笔记(一)--基础
- html bootstrap复选框全选,javascript+bootstrap+html实现层级多选框全层全选和多选功能代码实例...
- matlab画横的/水平的条形图
- python 协程和异步的关系_python 协程和异步I/O的实践
- python在哪个方向岗位最多_Python就业方向这么多,哪些岗位最有发展?
- 3.26 Tensorflow 实验记录
- 【推荐】网络安全学习路线和资料分享
- Shim Polifill区别
- MML ch 10 主成分分析降维(Dimensionality Reduction with Principal Component Analysis)
- 构建Spring Web应用程序
- android 录屏工具,Android截屏、录屏工具
- 【Unity——阴影实现基本原理】
- 幂果支招:哪里找免费的Mac版音频剪辑软件
- swap分区、硬盘和磁盘
- 淘宝淘金币助手,自动完成淘金币任务,蚂蚁庄园和蚂蚁森林,天猫领红包和收取能量
- jQuery幻灯片带缩略图平移滑动焦点图
热门文章
- 阻塞非阻塞,同步异步四种I/O方式
- vmware view由哪些组件组成?
- iptables_ftp
- 梦如果实现以后。。。。。。
- 为什么我从Mac切换到Linux
- raspberry pi_如何启动新的Raspberry Pi
- linux 启动启动服务_更快地启动Linux
- 最末参与者优化 lpo_优化博客以提高读者参与度的6种方法
- ES6/03/函数的定义方式和调用方式,函数内的this指向,改变函数中this指向的三个方法(call(),apply(),bind())
- LeetCode 451. 根据字符出现频率排序(Sort Characters By Frequency)