Linux------小网盘(1)
一:要求
利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件
二:实现提示:
client.c
client的参数有两个,分别是服务器主机名和端口;
在while循环中输入你想要传输的文件名,然后建立socket,通过服务器主机名和端口连接服务器;
打开文件,在while循环中读取文件,发送文件
sever.c
在while循环中accept客户端的连接,接受数据并写入文件中
(也可以选择select()accept客户端的连接,在while循环中接受数据并写入文件中)
三:程序
sever.c (服务器端)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h> #define PORT 5168
#define MSGLEN 1024 int main(int argc, char **argv)
{
int severFd, clientFd;
int fp,flags;
socklen_t addrlen;
struct sockaddr_in severAddr, clientAddr;
char recvBuff[MSGLEN];
char filename[];
int recv_len; if((severFd = socket(AF_INET, SOCK_STREAM, )) == -){
perror("sockst() error");
exit(-);
} severAddr.sin_family = AF_INET;
severAddr.sin_port = htons(PORT);
severAddr.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&severAddr.sin_zero, ); if(bind(severFd, (struct sockaddr*)&severAddr, sizeof(struct sockaddr)) == -) {
perror("bind() error");
exit(-);
} if(listen(severFd, ) == -) {
perror("listen() error");
exit(-);
} addrlen =sizeof(struct sockaddr);
while() {
flags = ;
if((clientFd = accept(severFd, (struct sockaddr*)&clientAddr, &addrlen)) == -){
perror("accept() error");
exit(-);
}
printf("recv file fome ip:%s port: %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
if(recv(clientFd, filename, strlen(filename), ) < ){
perror("recv filename error");
break; //less
} fp = open(filename, O_RDWR | O_CREAT, );
while((recv_len = recv(clientFd, recvBuff, MSGLEN, )) > ) {
flags++;
if(flags == ) {
printf("recv file start");
}
else {
printf(".");
}
if(write(fp, recvBuff, recv_len)) {
bzero(&recvBuff, MSGLEN);
}else {
perror("write() error");
break;
}
}
if(flags == )
perror("recv() error");
if(flags > ){
printf("\nrecv success\n");
close(clientFd);
}
} close(severFd);
return ;
}
client.c(客户端)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h> #define MSGLEN 1024 struct ADDR {
int port;
char name[];
}; void file_send(struct ADDR addr, char *filename)
{
int sockfd;
FILE* fp;
struct sockaddr_in sevrAddr;
struct hostent *host;
char readBuff[MSGLEN];
int len; host = gethostbyname(addr.name); if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -){
perror("socket() error");
exit(-);
}else
printf("socket ok\n"); sevrAddr.sin_family = AF_INET;
sevrAddr.sin_port = htons(addr.port);
sevrAddr.sin_addr = *((struct in_addr*)host->h_addr);
bzero(&sevrAddr.sin_zero, );
// printf("ok2\n");
if(connect(sockfd, (struct sockaddr*)&sevrAddr, sizeof(struct sockaddr)) == -){
perror("connect() error");
exit(-);
}else
printf("connect ok\n"); // fp = open(filename, O_RDONLY);
if(send(sockfd, filename, sizeof(filename), ) < ) {
perror("send filename error");
exit(-);
} fp = fopen(filename, "rb");
if(fp != NULL){
printf("send file");
while() {
if((len = fread(readBuff, , MSGLEN, fp)) > ) {
if(send(sockfd, readBuff, len, ) < ){
perror("send() error");
exit(-);
} else {
printf(".");
bzero(&readBuff, MSGLEN);
}
} else if(len == ){ //等于0表示文件已到末尾
// send(sockfd, readBuff, strlen(readBuff), 0);
printf("\nfile send success\n");
break;
} else {
perror("read() error");
exit(-);
}
}
}else {
printf("open file failed\n");
exit(-);
}
fclose(fp);
close(sockfd);
} int main(int argc, char **argv)
{
struct ADDR useraddr;
char filename[]; if(argc != ) {
printf("Usage: ./client [hostname] [port]");
exit(-);
} strcpy(useraddr.name, argv[]);
useraddr.port = atoi(argv[]); while() {
printf("please input filename of you want send\n");
fgets(filename, , stdin);
filename[strlen(filename)-] = ;
// printf("ok1\n");
file_send(useraddr, filename);
}
return ;
}
四:现象
略(已实验,运行正确)
Linux------小网盘(1)的更多相关文章
- Linux使用网盘客户端
1. 百度网盘 - bypy https://github.com/houtianze/bypy 这是一个基于Python的命令行客户端. 安装参考上面链接的说明,或者这篇文章(推荐,有告诉你如何安装 ...
- Linux 百度网盘卡在等待页
解决办法1 如果无法登录百度网盘,一直在加载,运行命令:rm -rf ~/baidunetdisk 然后关闭百度客户端,重新登录百度客户端. 解决办法2 如果已经登录进百度网盘,退出百度网盘时,不要直 ...
- linux 从百度网盘下载文件的方法
linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...
- 只需两步在Linux系统安装百度网盘--Ubuntu20
Linux Ubuntu系统安装百度网盘 百度网盘已支持Linux系统下载和使用.使用Linux系统下载并安装一个百度网盘是非常简单的,只需要以下两个步骤: 第一步 进入官网下载.deb类型的百度网盘 ...
- 其实 Dropbox 的缺点也很明显,速度慢,空间小(我对国内的网盘的建议)
作者:王成链接:http://www.zhihu.com/question/20237962/answer/15146386来源:知乎著作权归作者所有,转载请联系作者获得授权. 国内的云存储服务基本上 ...
- Linux VPS使用百度网盘API上传备份文件
最近百度网盘将空间升级到了永久1TB,鉴于百度的实力用做数据备份空间不错,不过百度网盘没有Linux下的客户端,上传管理文件需通过百度开放云平台访问PCS资源的系列接口. 1.首先加入百度开发者:ht ...
- ThinkPHP5+小程序商城 网盘视频
ThinkPHP5+小程序商城 网盘视频 有需要联系我 QQ:1844912514
- 微信小程序——网盘图片预览
微信小程序图片预览提供了一个wx.previewImage接口,如下图: 现在我需要对网盘文件里的图片预览,但是网盘从后台返回的数据是各种类型的文件,如下图所示: 那么我们需要解决2个问题: 1.从这 ...
- 打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源
前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字 ...
- Linux下下载百度网盘资料
因为百度网盘没有Linux下的客户端,所以无法直接下载网盘里的资料了.各路大神各显神通,提出了各种解决方法,这里只介绍两种. 1.BaiduPCS Github上有人通过Go语言写了一个Baidu网盘 ...
随机推荐
- [多校联考2 T3] 排列 (DP)
DP Description 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用 I 表示,反之这个位置是下降的,用 D表示.如排列 3,1,2,7,4,6,5 可以 ...
- GZFramwork数据库层《前言》Demo简介
本系列旨在熟悉GZFramwork数据库层操作,对数据库表进行增删改查,单据编号生成等: 详细见图: 普通单表操作: 数据库建模: 创建表脚本: from sys.sysreferences r jo ...
- 用TCGA收集的mRNA表达数据作差异表达
做差异表达的软件DEseq和edgeR所需要的数据格式必须是原始counts,经过normalization和log2后的数据都不适合,所以对于做差异表达计算的童鞋可以使用ExperimentHub下 ...
- 《BI那点儿事》数据流转换——OLE DB 命令转换
OLE DB命令对数据流中的数据行执行一个OLE DB命令.它针对数据表中的每一行进行更新操作,可以事先将要更新的数据存放在表中.或者针对一个有输入参数的存储过程,可以将这些参数存放在一个数据表中,不 ...
- ns3 Tutorial 中的日志模块(翻译)
转载地址:http://blog.sina.com.cn/s/blog_8ecca79b0101d7fe.html 1 日志模块的使用 在运行 first.cc 脚本时,我们已经简单 ...
- switch多分支语句简析
在编程中一个常见问题就是检测一个变量是否符合某个条件,switch以一个简单明了的方式来实现类似于"多选一"的选择,语法格式如下: /*switch首先计算表达式的值,如果表达式的 ...
- oracle 之 游标
本期主题 灰蓝 游标用来处理从数据库中检索的多行记录(使用SELECT语句)存放的是select 的结果 利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集 --隐式游标 begin upd ...
- 匿名函数和Lamda
不是本人所写!网络收集 C#中的匿名函数和Lamda是很有意思的东东,那么我们就来介绍一下,这到底是什么玩意,有什么用途了? 打开visual studio 新建一个控制台程序. 我们利用委托来写一个 ...
- ReentRantLock使用
synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候. 1.某个线程在等待一 ...
- wpf中ToolTip实现
定义样式: <UserControl.Resources> <Style TargetType="DataGridCell" BasedOn="{Sta ...