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网盘 ...
随机推荐
- VS2010/2012配置优化记录笔记
VS2010/2012配置优化记录笔记 在某些情况下VS2010/2012运行真的实在是太卡了,有什么办法可以提高速度吗?下面介绍几个优化策略,感兴趣的朋友可以参考下,希望可以帮助到你 有的时候V ...
- signtool
https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx C:\Users\Administrator\.nuget\packa ...
- How can I view currently running MySQL queries?( 查看正在运行的MySQL语句/脚本命令)
show processlist;show processlist\G;SHOW FULL PROCESSLIST;SHOW FULL PROCESSLIST\G; REF:http://dev.my ...
- 怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框
从远程客户端访问服务器上的WebService能够显示,但点击调用相关的方法时显示“只能用于来自本地计算机的请求”,这时提醒我们还需要在服务器进行相关的配置才能让其他机器正常访问该WebService ...
- 试用VSCode
VSCode是代码编辑器,不是IDE. 优点: 1.内置ES6代码高亮和提示,语法验证 2.除了支持到变量定义处Go to definition,还支持弹框显示变量定义出peek definition ...
- WCF 4.0 进阶系列 -- 随笔汇总
WCF4.0 进阶系列–前言 WCF4.0 进阶系列--第一章 WCF简介 WCF4.0进阶系列--第二章 寄宿WCF服务 WCF4.0进阶系列--第三章 构建健壮的程序和服务 WCF4.0进阶系列- ...
- iOS FMDB的使用
简介: SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite ...
- mac 安装redis
一.下载 官网http://redis.io/ (搞不懂为啥被墙) 二.安装 将下载的tar.gz文件复制到 /usr/local 文件夹下 解压 sudo tar -zxvf redis3.1.6. ...
- Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- 程序设计入门——C语言 第1周编程练习 1逆序的三位数(5分)
第1周编程练习 查看帮助 返回 第1周编程练习题,直到课程结束之前随时可以来做.在自己的IDE或编辑器中完成作业后,将源代码的全部内容拷贝.粘贴到题目的代码区,就可以提交,然后可以查看在线编译和运 ...