山寨版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

相关文章

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的工作原理是基于发布/订阅模式的消息传递,它包括两个主要

【深入解析】AI工作流中的HTTP组件:客户端与服务端执行的区别

在当今快速发展的技术环境中,AI工作流的设计和实现变得愈发重要。尤其是在处理HTTP组件时,前端执行与后端执行之间的区别,往往会对系统的安全性和数据的准确性产生深远的影响。今天,我们就来深入探讨这一话题,揭示前端执行如何有效避免风控,以及它在获取本地数据方面的优势。 AI工作流+各种大模型=能用AI-工作流传送门:https://www.nyai.chat/chat?invite=nyai_

Spring boot 项目作为客户端调用 服务端websocket

文章目录 java客户端请求websocketSpring boot 导入包客户端调用方法测试执行方法connectWebSocketHandshakeMessagesendHandshakeWebSocketConfig.queue.take方法对应实体类配置 yaml 资源WebSocketConfig 配置类注入配置websocketUrl:LinkedBlockingQueueLin

vsftpd配置用户和密码让其他客户端连接

一、第一个主机:vsftpd下载及配置 前置准备: #卸载防火墙yum -y remove firewalld#为了不让防火墙有影响,iptables配置也清空iptables -Fvim /etc/selinux/confSELINUX=disabled #主要是把它改为disabled或者permissiveSELINUXTYPE=targeted#重启linux让selin

TCP通信客户端简单示例

#include <stdio.h> #include <winsock.h> #pragma comment(lib,"ws2_32.lib") int main() { //第一步:初始化Socket函数库 WSADATA wsaData; WSAStartup(0x202,&wsaData); //第二步:创建流式套接字 SOCKET sock=socket(AF_INET,SOCK_

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。批量字符串(Bulk St