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网盘 ...
随机推荐
- Android 自动化测试 Emmagee
Emmagee 是一个性能测试小工具 用来监控指定被测应用在使用过程中占用机器的CPU, 内存,流量资源的性能小工具 阅读目录 Emmagee 介绍 Emmagee是网易杭州研究院QA团队开发的一个简 ...
- C++字符串与转移字符
先看以下代码: #include<iostream> #include<string> using namespace std; int main() { string str ...
- jquery mobile的事件
有个问题困扰了我两天,知道今天才解决. 那就是page的pagecreate事件,只调用一次 如果想随时更新,就要调用pageshow事件,每次都会调用, 这个事情再次告诉我,基础要扎实啊,不然会浪费 ...
- .net Web开发学习日志 —C/S和B/S结构区别
查看到<C/S和B/S结构区别整理> B/S结构与C/S结构都是有各自的优缺点: 前者无需安装,只要有浏览器即可,随时随地查询相关的业务,业务扩展强,维护强,共享强.在跨浏览器较难,响应速 ...
- Oracle新增客户端网络配置使用scott出现错误
错误一 测试提示用户密码过期 解决方法:使用sys用户登录数据库 sqlplus sys/密码 as sysdba; 修改scott用户密码 alter user scott identifie ...
- 解决asp.net Core Mvc网页汉字乱码问题
跟着www.asp.net网页的教程做电影网站的例子时,将一些英文标签和按钮改成了汉字的,结果出现了乱码. 在网上搜索这方面的信息也不太多,看到大家众说纷纭,最后有解决问题的,也没有说清楚具体的办法, ...
- 4s前置摄像头调用
最近做了个抓拍的功能需要调用前置摄像头,在5s,6s,6plus上面都能正常调用,但是在4s上调用摄像头会出现白色.开始以为是手机的原因,后来百度4s的前后摄像头的像素,发现前置摄像头的像素非常低,于 ...
- 如何让popWindow显示在view上方
看了bilibili的客户端搜索按钮,很喜欢大爱!自己也想做个类似的(相似度 10% 哈哈) popWin的出现退出动画也可以自己设定,用过其方法setAnimationStyle(R.style.x ...
- 初学jquery,自己写的一个jquery幻灯片,代码有些笨拙,希望有大神可以指点一二,精简一下代码
html代码 <div class="picCon"> <div class="bigPic"> <ul> <li c ...
- SQL Server Profiler教程
SQL Server Profiler是SQL Server企业版自带的一个sql 语句跟踪和分析工具,功能十分强大.熟练地使用它,对我们分析数据库性能问题很有帮助,比如当数据访问使用EF等ORM框架 ...