linux——客户端服务器文件传输

实现文件传输并不难,只需用fopen、fread、fwrite、fclose这几个函数对文件操作即可。文本文件就不说了,我们就已下图为例。
在这里插入图片描述
我们先来看看这个图片文件里装的是什么,我们以notpad++打开这个图片,结果如下,是一堆乱码。
在这里插入图片描述
我们在已二进制方式打开,方式如下:
首先打开vs的一个项目
在这里插入图片描述
选择一张图片

在这里插入图片描述
这张图片添加到源文件后,右键这张图片,选择打开方式
在这里插入图片描述

选择二进制编辑器
在这里插入图片描述
结果如下
在这里插入图片描述
图片文件是以二进制方式存储的,因为二进制更加节省空间,所以我们在用fopen函数时注意都要以二进制的形式读或写。

我们以客户端作发送方,服务器作接收方,先在客户端的源码目录下放一张图片123.jpg,启动服务器后在启动客户端,便在服务器的目录下产生一张与123.jpg一样的图片456.jpg。

服务器

#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
int main()
{struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);const int on=1;setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));if(bind(sockid,(struct sockaddr *)&sock,sizeof(sock))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in other_sock;socklen_t other_socklen=sizeof(other_sock);int client_sockid=accept(sockid,(struct sockaddr *)&other_sock,&other_socklen);printf("ip=%s,port=%d\n",inet_ntoa(other_sock.sin_addr),ntohs(other_sock.sin_port));FILE *fp=fopen("456.jpg","wb");char receive[4096]={0};int r_size=0;while(1){memset(receive,0,sizeof(receive));if((r_size=read(client_sockid,receive,sizeof(receive)))==0)//读取文件内容,如果客户端已全部发送,则read返回0,因为客户端发送完后就退出{printf("已成功接收\n");break;}fwrite(receive,1,r_size,fp);//读了多少数据就往文件里写多少数据}close(client_sockid);close(sockid);fclose(fp);return 0;
}

客户端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=inet_addr("***");//服务器ipint sockid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);socklen_t socklen=sizeof(sock);connect(sockid,(struct sockaddr *)&sock,socklen);FILE *fp=fopen("123.jpg","ab");char send[4096]={0};int r_size;while(!feof(fp))//判断文件指针是否到达文件末尾{r_size=fread(send,1,sizeof(send),fp);//读取文件数据write(sockid,send,r_size);//读多少数据就发多数据给服务器memset(send,0,strlen(send));}printf("发送成功\n");close(sockid);fclose(fp);return 0;
}

用这个办法不仅可以传输文件,还可以传输视频文件,只需把文件名称更改一下即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 1-2 课:你不知道的基础数据类型和包装类 + 面试题

基本数据类型 Java 基础数据按类型可以分为四大类&#xff1a;布尔型、整数型、浮点型、字符型&#xff0c;这四大类包含 8 种基础数据类型。 布尔型&#xff1a;boolean整数型&#xff1a;byte、short、int、long浮点型&#xff1a;float、double字符型&#xff1a;char 八种…

php中socket的使用

一、开启socket phpinfo();查看是否开启了socket扩展&#xff0c;否则在php.ini中开启。 二、服务器端代码的写法 <?php error_reporting(E_ALL); set_time_limit(0); //ob_implicit_flush();$address 127.0.0.1; $port 10005; //创建端口 if( ($sock socket_create(AF_…

通过xss所引起的信息泄露,防不胜防!

话不多说直接上&#xff1a; 信息搜集,通过google语法 site:"*.redacted.com"优化一下: site:"*.redacted.com" -www -blog -mail之后&#xff0c;利用subfinder、assetfinder和masass等被动枚举工具收集与目标相关的子域列表&#xff0c;并将它们保存在…

二叉树的前序、中序、后续、层序遍历(包含递归与非递归)

递归形式 递归形式遍历比较简单&#xff0c;不做详细论述。 前序遍历 void Preorder(treenode* root) //前序 {if (root ! NULL){printf("%c", root->data);Preorder(root->left);Preorder(root->right);}中序遍历 } void Inorder(treenode* root) …

单调递增子序列

单调子序列包含有单调递增子序列和递减子序列&#xff0c;不失一般性&#xff0c;这里只讨论单调递增子序列。首先&#xff0c;从定义上明确我们的问题。给定序列a1, a2, …, an&#xff0c;如果存在满足下列条件的子序列 ai1<ai2<…<aim, (其中i1<i2<…<im)…

51单片机常用功能及相关内容

一、基本概念&#xff1a; 1、引脚 图1.1 这里只介绍常用及主要的引脚。 I/O口引脚&#xff1a;P0、P1、P2、P3 P0口&#xff1a;39脚~32脚&#xff0c;双向8位三态I/O口&#xff0c;每个口可独立控制&#xff0c;但内部无上拉电阻&#xff0c;为高阻态&#xff0c;故不能正常…

No monitoring data is available

No monitoring data is available because monitoring is not enabled for this deployment share...注解&#xff1a;没有监测数据是可用的。报错具体信息如下&#xff1a;Assembly: mscorlib Assembly Version: 2.0.0.0 File Version: 2.0.50727.5420 (Win7SP1.050727-5400…

Unity查安卓Native Crash的方法,定位SO报错函数

需要用到两个工具Il2CppDumper和IDA_Pro&#xff0c;网上可以下到对应的软件 可以看到报错的位置是libil2cpp.so 0000000000AFF820 接下来要做的事情就是找到0000000000AFF820对应的函数是哪个 解包 Il2CppDumper解析so文件和符号表&#xff0c;查看对应的函数表 把apk后缀…

WebApi系列~自主宿主HttpSelfHost的实现

回到目录 宿主一词我们不会陌生&#xff0c;它可以看作是一个基础设施&#xff0c;它为一些服务和功能提供最底层的支持&#xff0c;如你的web应用程序可以运行在iis或者apache上&#xff0c;而这两个东西就是web应用程序的宿主&#xff0c;而今天说的自主宿主SelfHost就是说&a…

linux——进程(创建、终止、等待、替换)

进程的基本操作 概念 程序运行的一个实例&#xff0c;其占有一定的空间。 查询某一进程当前情况 ps aux | grep 进程名终止进程 kill -9 pid&#xff1b; //pid指需要终止的进程pid创建 pid_t fork();该函数有两个返回值&#xff0c;对于子进程其返回的是0&#xf…

第 3-1 课:集合详解(上) + 面试题

先来看看集合的继承关系图,如下图所示: 其中: 外框为虚线的表示接口,边框为实线的表示类;箭头为虚线的表示实现了接口,箭头为实线的表示继承了类。为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍。 从图中可以看出,集…

CCNA 学习笔记(四)--路由协议(RIP)

现在我们先复习下&#xff0c;什么是路由&#xff1f;答&#xff1a;当路由器&#xff08;或者其它三层设备&#xff09;收到一个IP数据包时&#xff0c;会查看数据包的IP头部中的目的IP地址&#xff0c;并在路由表中进行查找&#xff0c;在匹配到最优路由后&#xff0c;将数据…

linux——进程间通信(管道)

概念 进程间通信是指子进程与父进程间的通信&#xff0c;一般用作父进程对子进程的控制或者子进程将其动向告诉父进程&#xff0c;由于进程是一个程序执行的实例&#xff0c;进程之间本身是无法进行通信的&#xff0c;故而运用一种管道将二者联系起来。当然管道并不只限于在父子…

第 3-2 课:集合详解(下) + 面试题

集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map。 以下是 Map 的继承关系图: Map 简介 Map 常用的实现类如下: Hashtable:Java 早期提供的一个哈希表实现,它是线程安全的,不支持 null 键和值,因为它的性能不如 ConcurrentHashMap…

第 4-1 课:BIO、NIO、AIO 详解 + 面试题

IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等。 IO 分类 传统的 IO,按照流类型我们可以分为: 字符流字节流其中,字符流包括 Reader、Writer;字节流包括 InputStream、OutputStream。传统 IO 的类关系…

带头节点循环链表实现队列

队列的特征就是“先入先出”&#xff0c;入队时在链表的尾部插入数据&#xff0c;出队时删除掉头节点后面的节点&#xff0c;需要一个尾指针&#xff0c;始终指向链表的尾部&#xff08;新加进来的节点&#xff09;。具体请看原理图&#xff1a; 代码实现 #include <stdio…

第 3-4 课:数据结构——队列详解 + 面试题

队列(Queue):与栈相对的一种数据结构, 集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。 Queue 类关系图,如下图所示: 注:为了让读者更直…

GB/T 17710-1999 PHP生成校验码

校验码算法描述如下&#xff1a;详细&#xff1a;http://wenku.baidu.com/link?urlCDvNJ1sLYOPzbbxjEy5R-oME95RlfTCUU5-I5M0bqUt0I32b0Xd0EKmI-HiFQHhY8OcB6ERTml7pUwXFseLl8GGvkuc7w0V2sFDxi2H0XGC本例子以16位编号为例子&#xff0c;用PHP予以实现&#xff0c;代码如下&…

Linux——线程使用及互斥量

线程的基本操作 概念 线程是程序中的一个执行路线。每个程序当中至少有一个线程。 程序在执行的过程中是逐条执行的&#xff0c;按照代码的逻辑一次向下执行&#xff0c;所以无法同时完成两条指令&#xff0c;故而引进了线程&#xff0c;举个很简单的例子&#xff0c;如果同时…

安卓安装kali linux之Termux

本文讲述如何在手机上安装kali linux,我本想安装其他版本的linux,但不知是什么原因安装到一半就卡住&#xff0c;最终安装kali成功了&#xff0c;但也只是安装了kali的壳子&#xff0c;在inux上的操作都可以实现&#xff0c;只是工具并没有安装&#xff0c;后期可以自主安装工具…