利用tcp完成文件传输linux,Linux下基于TCP的文件传输
服务器:
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 6666
#define LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));//全部置零
//设置地址相关的属性
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htons(INADDR_ANY);
server_addr.sin_port=htons(SERVER_PORT);
//创建套接字
int server_socket=socket(AF_INET,SOCK_STREAM,0);
if(server_socket<0)
{
printf("socket create error\n");
exit(1);
}
//绑定端口
if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("bind error\n");
exit(1);
}
//服务器端监听
if(listen(server_socket,LISTEN_QUEUE))
{
printf("Server listen error\n");
exit(1);
}
//服务器端一直运行
while(1)
{
pid_t pid;
struct sockaddr_in client_addr;
socklen_t length=sizeof(client_addr);
//accept返回一个新的套接字与客户端进行通信
int new_server_socket=accept(server_socket,(struct sockaddr*)&client_addr,&length);
//1*begin******************************************************************************
if(new_server_socket==-1)
{
printf("accept error\n");
continue;
}
else
{
printf("客户端%s连接成功\n",inet_ntoa(client_addr.sin_addr));
pid=fork();
//3*begin**运行子进程*************************************************************
if(pid==0)
{
int data_len,flag=0;
char buffer[BUFFER_SIZE];
// 定义文件流
FILE *stream;
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"请输入要传输的文件的完整路径:");
strcat(buffer,"\n");
send(new_server_socket,buffer,BUFFER_SIZE,0);
bzero(buffer,BUFFER_SIZE);
//2*begin**服务器接受数据*********************************************
if((stream=fopen("data","w"))==NULL)
{
printf("file open error\n");
exit(1);
}
else
{
bzero(buffer,BUFFER_SIZE);
}
// printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));
//先将数据接受到缓冲区buffer中,再写入到新建的文件中
while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0))
{
flag++;
if(flag==1)
{
printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));
}
if(data_len<0)
{
printf("接收错误\n");
exit(1);
}
//向文件中写入数据
int write_len=fwrite(buffer,sizeof(char),data_len,stream);
if(write_len>data_len)
{
printf("file write failed\n");
exit(1);
}
bzero(buffer,BUFFER_SIZE);
}
if(flag>0)
printf("%s的文件传送完毕\n",inet_ntoa(client_addr.sin_addr));
if(flag==0)
printf("%s的文件传输失败\n",inet_ntoa(client_addr.sin_addr));
//2*end**服务器接受数据****************************************************
// rename("data",inet_ntoa(client_addr.sin_addr));
fclose(stream);
rename("data",inet_ntoa(client_addr.sin_addr));
exit(1);
}
//3*end**运行子进程**********************************************************
else
{
close(new_server_socket);
}
}
//1*end**************************************************************************************
close(new_server_socket);
}
return 0;
}
客户端:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVER_PORT 6666
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("参数错误,清输入两个参数\n");
exit(1);
}
FILE *stream;
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET; //internet协议族
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(SERVER_PORT);
int sfd;
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
printf("socket error\n");
exit(0);
}
if(connect(sfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)
{
printf("Can Not Connect To %s\n",argv[1]);
exit(1);
}
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
int length = recv(sfd,buffer,BUFFER_SIZE,0);
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
exit(1);
}
printf("\n%s\n",buffer);
bzero(buffer,BUFFER_SIZE);
// fgets(buffer,1024,stdin);
// char filename[100];
gets(buffer);
//打开文件流
if((stream=fopen(buffer,"r"))==NULL)
{
printf("the file was not opened\n");
exit(1);
}
bzero(buffer,BUFFER_SIZE);
printf("正在传输...\n");
int len=0;
//不断读取并发送数据
while((len=fread(buffer,1,1024,stream))>0)
{
// printf("len=%d\n",len);
if(send(sfd,buffer,len,0)<0)
{
printf("send file error\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
if(fclose(stream))
{
printf("file close error\n");
exit(1);
}
close(sfd);
return 0;
}
服务器端运行:
客户端运行:
在服务器端的程序中,当一个客户端连接,就创建一个独立的进程
利用tcp完成文件传输linux,Linux下基于TCP的文件传输相关推荐
- Linux下基于TCP的简易文件传输(socket编程)
Linux下基于TCP的简易文件传输(socket编程) OSI和TCP/IP: 关于TCP/IP协议 关于TCP协议 TCP编程的一般步骤[^2] TCP文件传输实现 功能概述 服务器编程 客户端编 ...
- Linux操作系统下的TCP/IP网络通信
基于Linux操作系统下的TCP/IP网络通信研究与应用 摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA-C)连续时间型滤波器的结构.设计和具体实现,使用外部可编 ...
- linux系统上运行sh,Linux系统下如何运行.sh文件的实现
Linux系统下如何运行.sh文件的实现 在Linux系统下运行.sh文件有两种方法,比如我在root目录下有个datelog.sh文件 第一种(这种办法需要用chmod使得文件具备执行条件(x): ...
- 如何查看linux系统下的各种日志文件 linux 系统日志的分析大全
如何查看linux系统下的各种日志文件 linux 系统日志的分析大全 日志分类: 1. 连接时间的日志 连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,不过这 ...
- Linux下导出MySQL为SQL文件_在linux命令下导出导入.sql文件的方法
本文讲述了在linux命令下导出导入.sql文件的方法.分享给大家供大家参考,具体如下: 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: ...
- linux通过iso安装php,linux系统下怎么安装iso文件?
linux系统下怎么安装iso文件? 安装步骤: 1.在/mnt目录下,创建相应的iso文件夹,例如iso. 2.运行以下命令,挂载iso文件mount -o loop /home/tecmint/F ...
- dd指令打包iso文件 linux_Linux_如何在Linux操作系统下创建ISO镜像文件,1、用dd命令#dd if=/dev/cdrom - phpStudy...
如何在Linux操作系统下创建ISO镜像文件 1.用dd命令 #dd if=/dev/cdrom of=/***/目的文件.iso 上面的命令是在将光盘作成iso文件 2.用mkisofs 命令 #m ...
- linux系统下怎么安装.deb文件?
linux系统下怎么安装.deb文件? deb 是 ubuntu .debian 的格式. rpm 是 redhat .fedora .suse 的格式. 他们不通用(虽然可以转换一下). deb是d ...
- linux系统下 压缩和解压缩文件命令
linux系统下 压缩和解压缩文件命令 1.把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 2.把/home ...
- c++网络编程——用TCP实现文件传输(windows下基于VS2017)
c++网络编程--用TCP实现文件传输 定义文件传输协议 服务端代码 客户端代码 测试 文件传输协议FTP是基于TCP协议实现的,为了体验这个过程,本文自定义一个简单的文件传输协议,并基于TCP协议编 ...
最新文章
- 区块链还能赚钱吗 区块链挖矿赚钱吗
- JSP页面传值出现中文乱码的问题
- HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化
- 利用sql_trace跟踪一个指定会话的操作
- 人人都在谈的图数据库到底是个啥?
- 无线通信定位一体化进展及其在煤矿井下应用分析
- 宠物管理系统CLI版本(Python实现/内附完整代码)
- 数据抽取常见的几种模式
- 《花花公子》的封面女郎,计算机图像界的女神
- 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?
- linux保险箱软件,手机加密App哪个好?手机加密软件推荐
- 阿里妈妈不能攻百度也不能守淘宝 !
- 【UCIe】初识 UCIe
- NLP与ChatGPT的碰撞:大模型和小模型联合发力
- go用函数字符串名调用函数
- (附源码)springboot 新闻管理系统 毕业设计 211113
- linux下交叉编译jrtplib-3.9.1
- 标题使用java计算三维空间中两点的欧几里德距离
- 基于开源WebSocket服务器宝贝鱼(CshBBrain)的应用横空出世
- distribute-list分发列表