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网盘 ...
随机推荐
- php 中的常量
1.__FINE__ 返回当前常量所在的行号. 2.__FILE__ 返回文件的完整路径和文件名. 3.__FUNCTION__ 返回函数名称. 4.__CLASS__ 返回类名称. 5.__METH ...
- 深入浅出设计模式——组合模式(Composite Pattern)
模式动机 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行.(递归调用)由于容 ...
- AngularJS 特性—SinglePage、template、Controller
单页Web应用(SinglePage) 顾名思义,只使用一个页面的Web应用程序.单页面应用是指用户通过浏览器加载独立的HTML页面,Ajax加载数据页面无刷新,实现操作各种操作. 模板(templa ...
- Criterion & DetachedCriteria
今天笔记主要是记录笔记,以及代码: criteria: 创建查询接口:createCriteria(class) 查询条件接口:add(各种条件); Restrictions 提供了设置参数的各种接口 ...
- ssh框架介绍
SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架. Struts Struts是一个基于Sun J2EE平台的MVC框架, ...
- 高斯混合模型与EM算法
对于高斯混合模型是干什么的呢?它解决什么样的问题呢?它常用在非监督学习中,意思就是我们的训练样本集合只有数据,没有标签. 它用来解决这样的问题:我们有一堆的训练样本,这些样本可以一共分为K类,用z(i ...
- 基于线程池和连接池的Http请求
背景:最新项目需求调用http接口,所以打算使用最新的httpClient客户端写一个工具类,写好了以后在实际应用过程中遇到了一些问题,因为数据量还算 大,每次处理大概要处理600-700次请求,平均 ...
- 转!!mybatis在xml文件中处理大于号小于号的方法
第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DA ...
- android,NDK android.mk相关
1.c++ try...catch的支持 需要在Android.mk 中添加 LOCAL_CPPFLAGS += -fexceptions,或者在Application.mk中添加APP_CPPFLA ...
- 通过java输出当前系统时间
获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowString ...