山寨版tftp客户端

2024-06-12 14:32
文章标签 客户端 tftp 山寨

本文主要是介绍山寨版tftp客户端,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

吐舌头主要功能:

1. 上传文件到服务器

2. 从服务器上下载文件

3. 列出服务器上的文件

/*************************************************************************> File Name: client.c> Author: 联合作战实验室> Mail: v.manstein@qq.com> Created Time: Sat 25 Mar 2017 16:55:10 PM CST************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>#define err_log(errlog)  do{printf("%s:%s,%d\n", __FILE__, __func__, __LINE__);\perror(errlog);exit(1);}while(0)#define  N  128// ./client  192.168.8.211 10001int process_list(struct sockaddr_in serveraddr)
{int sockfd;char buf[N] = {};if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){err_log("failed to socket");}if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){err_log("Failed to connect");}printf("Client connect success.\n");strcpy(buf, "L");if(send(sockfd, buf, N, 0) < 0){err_log("Failed to send");}while(recv(sockfd, buf,N, 0) > 0){printf("%s\n", buf);}close(sockfd);return 0;
}int process_get(struct sockaddr_in serveraddr, char * filename)
{int sockfd;char buf[N] = {};int fd;int nbyte;if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){err_log("failed to socket");}if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){err_log("Failed to connect");}sprintf(buf, "G %s", filename); // G filenameif(send(sockfd, buf, N, 0) < 0){err_log("Failed to send");}if(recv(sockfd, buf, N, 0) < 0){err_log("Failed to recv");}if(buf[0] == 'N'){printf("%s is not exists!\n", filename);close(sockfd);return -1;}fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664);if(fd < 0){close(sockfd);err_log("failed to open");}while((nbyte = recv(sockfd, buf, N, 0)) > 0){write(fd, buf, nbyte);}printf("Download done.\n");close(fd);close(sockfd);return 0;
}
int process_put(struct sockaddr_in serveraddr, char *filename)
{int sockfd;char buf[N] = {};int fd;int nbyte;if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){err_log("failed to socket");}if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){err_log("Failed to connect");}sprintf(buf, "P %s", filename); // G filenameif(send(sockfd, buf, N, 0) < 0){err_log("Failed to send");}fd = open(filename, O_RDONLY);if(fd < 0){close(sockfd);err_log("failed to open");}usleep(50);while((nbyte = read(fd, buf, N)) > 0){send(sockfd, buf, nbyte, 0);usleep(50);}printf("upload done.\n");close(fd);close(sockfd);return 0;
}
int process_help(void)
{printf("************************************************************\n")printf("get file: download file form server.\n");printf("put file: upload file to server.\n");printf("list: list all file on server.\n");printf("help: print help info.\n");printf("************************************************************\n")	return 0;}int main(int argc, const char *argv[])
{char buf[N] = {};struct sockaddr_in serveraddr, clientaddr;socklen_t addrlen = sizeof(struct sockaddr_in);if(argc < 3){fprintf(stderr,"Usage:%s serverip port.\n", argv[0]);return -1;}serveraddr.sin_family = AF_INET ;serveraddr.sin_addr.s_addr = inet_addr(argv[1]) ;serveraddr.sin_port = htons(atoi(argv[2]));while(1){printf("Input:");fgets(buf, N, stdin);buf[strlen(buf)-1] = '\0';// listif(strncmp(buf, "list", 4) == 0) // list all files{process_list(serveraddr);}else if(strncmp(buf, "get", 3) == 0) // get filename{process_get(serveraddr, buf+4);}else if(strncmp(buf, "put", 3) == 0) // put filename{process_put(serveraddr, buf+4);}else if(strncmp(buf, "help", 3) == 0) // help{process_help();}else if(strncmp(buf, "quit", 3) == 0) // quit{break;}else{printf("Invalid cmd!\n");}}return 0;
}


这篇关于山寨版tftp客户端的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054486

相关文章

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

Redis 客户端Jedis使用---连接池

Jedis 是Redis 的Java客户端,通过一段时间的使用,jedis基本实现redis的所有功能,并且jedis在客户端实现redis数据分片功能,Redis本身是没有数据分布功能。 一、下载jedis 代码 jedis 代码地址:https://github.com/xetorthio/jedis 再次感受到开源的强大。呵呵,大家有时间可以看看源码。 二、项目中如何使用Jedi

Java Socket服务器端与客户端的编程步骤总结

一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象; 可以通过InetAddress类的静态方法获得InetAddress的对象; InetAddress.getLocalHost(); InetAddress.getByName(""); 类主要方法: String - address.getHostName(); String - addre

9.7(UDP局域网多客户端聊天室)

服务器端 #include<myhead.h>#define SERIP "192.168.0.132"#define SERPORT 8888#define MAX 50//定义用户结构体typedef struct{struct sockaddr_in addr;int flag;}User;User users[MAX];//用户列表void add_user(struct s

【知识分享】MQTT实战-使用mosquitto客户端连接emqx服务器

一、简介     MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,旨在实现物联网设备之间的低带宽、高延迟的通信。MQTT协议设计简洁,使用TCP/IP协议进行通信,适用于各种网络环境,尤其适合在有限的网络带宽和不稳定的网络连接条件下进行通信。     MQTT的工作原理是基于发布/订阅模式的消息传递,它包括两个主要