世界上最详细的Linux C udp实现文件传输
最重要的是掌握UDP的基本概念和使用
UDP.h
#ifndef NETWORK_UDP_H
#define NETWORK_UDP_H
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <ctype.h>
#endif //NETWORK_UDP_H
一切过程都在注释
service.c
//使用UDP实现文件的传输
#include "UDP.h"#define SPORT 7788
char buf[1024];
int main(int argc ,char *argv[]){int sockfd;FILE *fp;//使用标准IO存客户端发送过来的文件struct sockaddr_in s,c;//服务器地质结构,客户端地质结构bzero(&s,sizeof(s));//清空s.sin_family=AF_INET; //初始化s.sin_port=htons(SPORT);s.sin_addr.s_addr=htonl(INADDR_ANY);socklen_t len=sizeof(s);if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){//选socket套接字perror("[socket]");return -1;}if ((bind(sockfd,(struct sockaddr *)&s,len))==-1){//进行IP地址加端口号绑定perror("[bind]");return -1;}//绑定成功就接受客户端要发送的文件名int ret;//用于检测recvfrom函数的返回值,检错。len=sizeof(c);ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&c,&len);if (ret==-1){perror("[recvfrom]");return -1;}//客户端发送过来的是一个文件的路径,所以这里需要对路径进行相应的分解char filename[100];int i=0,k=0;for ( i = strlen(buf); i >0 ; i--) {if (buf[i]!='/'){k++;} elsebreak;}//定位这个文件的名字strncat(filename,buf+(strlen(buf)-k)+1,k);char filepath[100]="/tmp/";strncat(filepath,filename,strlen(filename));printf("FILE : %s will be download!\n",filepath);//使用printf跟踪打印技术检错fp=fopen(filepath,"w+");//创建,可读可写if (fp==NULL){perror("[fopen]");return -1;}//制造空洞文件if ((truncate(filepath,1<<10))==-1){perror("[truncate]");return -1;}//清空buf空间来接受传过来的文件内容while (ret){bzero(buf,sizeof(buf));len=sizeof(c);ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&c,&len);if ((fwrite(buf,sizeof(char),ret,fp))==-1){perror("[fwrite]");exit(-1);}}printf("Download success!\n");
}
client.c
#include "UDP.h"char buf[1024];
int main(int argc,char *argv[]){int sockfd;char filepath[100]="/home/jacky/hujie.txt";struct sockaddr_in s;bzero(&s,sizeof(s));s.sin_family=AF_INET;s.sin_port=htons(7788);inet_pton(AF_INET,"192.168.200.134",&s.sin_addr.s_addr);if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1){//选择socketperror("[socket]");return -1;}//直接进行发送文件名int ret,ret_r;//用于检错if ((ret=sendto(sockfd,filepath,sizeof(filepath),0,(struct sockaddr *)&s,sizeof(s)))==-1){perror("[sento]");return -1;}//进行文件内容的数据传输FILE *fp;fp=fopen(filepath,"r");if (fp==NULL){perror("[fopen]");return -1;}//读取文件内容到buf中while (ret){bzero(buf,sizeof(buf));ret_r=fread(buf,sizeof(char ),1024,fp);if (ret_r==-1){perror("[fread]");return -1;}ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&s,sizeof(s));//这里要注意传输内容的大小,是你读取到在buf中的大小,不能直接使用sizeof(buf)usleep(100);//防止出现粘包乱码}printf("transfer success\n");}
实验结果
世界上最详细的Linux C udp实现文件传输相关推荐
- 安卓手机的文件如何传到linux里去,如何在Linux下安装安卓文件传输助手
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了 如不雅你测验测验在 Ubuntu 下连接你的安卓手机,你也许可以尝尝 Linux 下的安卓文件传输助手. 如今,有可能一部分人想知 ...
- linux系统中的文件传输
Linux系统中的文件传输 1 实验环境 2 scp命令 3 rsync命令 3.1 rsync和scp命令对比 3.2 rsync命令用法 4 文件的归档压缩 4.1 文件归档 4.2 文件压缩 4 ...
- Linux下几种文件传输命令 sz rz sftp scp
vbs自动启动程序 64位系统编译的程序,在32位系统中运行会有问题 Linux下几种文件传输命令 sz rz sftp scp 2011-10-28 16:08:47| 分类: 默认分类 | 标 ...
- Android 系统(68)---使用Xshell在Windows系统和Linux系统之间进行文件传输
使用Xshell在Windows系统和Linux系统之间进行文件传输 Windows系统在安装虚拟机centos系统之后,如何进行两者之间的文件传输和互操作,或者如何在Windows端使用Xshell ...
- linux系统中加密文件传输助手,Linux 下的安卓文件传输助手!
如果你尝试在 Ubuntu 下连接你的安卓手机,你也许可以试试 Linux 下的安卓文件传输助手.本质上来说,这个应用是谷歌 macOS 版本的一个克隆.它是用 Qt 编写的,用户界面非常简洁,使得你 ...
- linux手机 电脑传文件怎么安装,如何在 Linux 下安装安卓文件传输助手
如果你尝试在 Ubuntu 下连接你的安卓手机,你也许可以试试 Linux 下的安卓文件传输助手. 本质上来说,这个应用是谷歌 macOS 版本的一个克隆.它是用 Qt 编写的,用户界面非常简洁,使得 ...
- 安卓传输文件Linux,你知道Linux下的安卓文件传输助手的作用?
如果你尝试在 Ubuntu 下连接你的安卓手机,你也许可以试试 Linux 下的安卓文件传输助手.本质上来说,这个应用是谷歌 macOS 版本的一个克隆.它是用 Qt 编写的,用户界面非常简洁,使得你 ...
- android程序移动到Linux,Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输...
本文将带你了解Android应用开发之Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输,希望本文对大家学Android有所帮助. 使用Xshell在Wi ...
- Socket网络程序设计(4) ———— 实现linux和windows的文件传输
用TCP/TP进行网际互连(4) ---- 实现linux和windows的文件传输 1.实现要求 · 在循环面向连接的程序基础上,利用tcp完成linux和windows平台的文件传输 · 对服务器 ...
- 【PC工具】Windows 上编辑树莓派(linux EXT)分区文件工具——Ext2Fsd
官网:http://www.ext2fsd.com/ 版本:0.69 功能:看我下边用一种巧妙的方式引入这个软件的功能 第一次使用树莓派,(好不容易)按照教程将镜像写入了SD卡,突然弹出(下图)要我格 ...
最新文章
- 谷歌重磅开源新技术:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...
- sql left join用法_一张图看懂 SQL 的各种 join 用法
- iOS 静态库代码混淆方案
- 结合反向传播算法使用python实现神经网络的ReLU、Sigmoid、Affine、Softmax-with-Loss层
- yeoman+grunt/gulp+bower构建angular项目
- 如何通过 Web 实现防御木马、病毒...... | 原力计划
- H5 27-优先级之important
- android开发ViewPager按比例显示图片(显示下一张图片的一部分)
- matlab幂指数函数图像,matlab画指数函数曲线
- 神经网络在线和离线的区别,神经网络网站
- iOS Programming - Disallow Alphabetic Characters
- EKL日志分析平台-kibana数据可视化
- WIn10 1909 Windows Hello 指纹:出现错误,请稍后再试一次
- win7计算机自动关机设置在哪里设置方法,win7自动关机怎么设置
- 在Linux和Windows上安装kafka(版本:2.12-2.8.0)
- rk3288 SDK概览
- ROS深度图转化为点云
- 地铁杂记 - 17寸苹果
- 关于神经网络训练的一些技巧NN Tricks
- 合宙Luat | 电源设计——模块应用必看的2个要点