我是靠谱客的博主 懦弱猎豹,最近开发中收集的这篇文章主要介绍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("bindn");
		return 0;
	}
	if(listen(sockid,SOMAXCONN)<0)
	{
		printf("listenn");
		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=%dn",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("***");//服务器ip

	int 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;
}

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

最后

以上就是懦弱猎豹为你收集整理的linux——客户端服务器文件传输的全部内容,希望文章能够帮你解决linux——客户端服务器文件传输所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部