资源简介
在linux中,使用tcp实现一个简单的文件服务器功能,可以查看、上传、下载文件

代码片段和文件信息
#include //printf
#include //inet_addr htons
#include
#include //socket bind listen accept connect
#include //sockaddr_in
#include //exit
#include //close
#include
#include
#include
#include
#define N 128
#define errlog(errmsg) do{\
perror(errmsg);\
printf(“%s --> %s --> %d\n“ __FILE__ __func__ __LINE__);\
exit(1);\
}while(0)
void do_help()
{
printf(“*****************************************************\n“);
printf(“***** 输入 / 功能 ***************\n“);
printf(“***** list / 查看服务器所在目录的文件*****\n“);
printf(“***** get filename / 下载服务器所在目录的文件*****\n“);
printf(“***** put filename / 上传文件到服务器*************\n“);
printf(“***** quit / 退出 ***************\n“);
printf(“*****************************************************\n“);
return ;
}
void do_list(int sockfd)
{
char buf[N] = {};
//告知服务器执行查看目录文件名的功能
strcpy(buf “L“);
send(sockfd buf N 0);
//接收数据并打印
while(1)
{
recv(sockfd buf N 0);
//结束标志
if(strncmp(buf “OVER****“ 8) == 0)
{
break;
}
printf(“*** %s\n“ buf);
}
printf(“文件接收完毕\n“);
return ;
}
int do_download(int sockfd char *filename)
{
char buf[N] = {};
int fd;
ssize_t bytes;
//发送指令以及文件名,告知服务器实现下载的功能
sprintf(buf “G %s“ filename);
send(sockfd buf N 0);
//接收数据判断文件是否存在
recv(sockfd buf N 0);
//如果文件不存在,打印指令
if(strncmp(buf “NO“ 2) == 0)
{
printf(“文件%s不存在,请重新输入\n“ filename);
return -1;
}
//如果文件存在,创建文件
if((fd = open(filename O_CREAT | O_WRONLY | O_TRUNC 0664)) < 0)
{
errlog(“fail to open“);
}
//接收数据并写入文件
while((bytes = recv(sockfd buf N 0)) > 0)
{
if(strncmp(buf “OVER****“ 8) == 0)
{
break;
}
write(fd buf bytes);
}
printf(“文件下载完毕\n“);
return -1;
}
int do_upload(int sockfd char *filename)
{
char buf[N] = {};
int fd;
ssize_t bytes;
//打开文件,判断文件是否存在
if((fd = open(filename O_RDONLY)) < 0)
{
//如果文件不存在,则退出函数,重新输入
if(errno == ENOENT)
{
printf(“文件%s不存在,请重新输入\n“ filename);
return -1;
}
else
{
errlog(“fail to open“);
}
}
//如果文件存在,告知服务器执行上传的功能
sprintf(buf “P %s“ filename);
send(sockfd buf N 0);
//读取文件内容并发送
while((bytes = read(fd buf N)) > 0)
{
send(sockfd buf bytes 0);
}
sleep(1);
strcpy(buf “OVER****“);
send(sockfd buf N 0);
printf(“文件上传完毕\n“);
return 0;
}
int main(int argc const char *argv[])
{
int sockfd;
struct sockaddr_in serveraddr;
socklen_t addrlen = sizeof(serveraddr);
char buf[N] = {};
if(argc < 3)
{
printf(“您输入的参数太少了: %s \n“ argv[0]);
exit(1);
}
//第一步:创建套接字
if((sockfd = socket(AF_INET SOCK_STREAM 0)) < 0)
{
errlog(“fail to socket“);
}
//第二步:填充服务器网络信息结构体
//inet_addr:将点分十进制ip地址转化为网络字节序的整型数据
//htons:将主机字节序转化为网络字节序
//atoi:将数字型字符串转化为整型数据
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
server
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 205 2017-10-28 09:29 1_tcp_ftp\99.txt
文件 4611 2017-10-28 11:24 1_tcp_ftp\client.c
文件 205 2017-10-28 11:24 1_tcp_ftp\Makefile
文件 4175 2017-10-28 11:24 1_tcp_ftp\server.c
目录 0 2017-10-28 11:25 1_tcp_ftp
----------- --------- ---------- ----- ----
9196 5
- 上一篇:矩阵变换器
- 下一篇:基于RS485总线的PC与单片机多机通信系统设计
相关资源
- TCP IP通信labview程序
- Modbus协议官方文档中、英文全
- 虚拟光驱deamon 适用于64位服务器的
- Omron ETN21模块进行modbustcp通讯
- 编写简单的RMI程序 多线程web 服务器
- IOCP 类 简单的IOCP(IO完成端口)服务
- 组态王中S7-300TCP驱动
- 基于Apache Mina实现的TCP长连接和短连接
- CVI下的TCP服务器和客户端
- 代码客:G-TcpServer(IOCP) 1.0 正式版及
- TCP 发包工具(windows)
- SOCKET 网络编程 计算机网络 作业 客户
- 用Socket写的简易FTP服务器和客户端
- VxWorks TCPIP协议栈
- socket小工具(可方便建立TCP UDP的soc
- vc 编写的基于TCP协议的客户/服务器
- Tomcat6.x
- 基于CSocket的多人聊天室
- 采用WINSOCK2 编写的TCP/UDP通信程序
- 简单服务器端口监听和显示客户端发
- Modbus TCP Client
- 基于串口设备的嵌入式Web服务器系统
- 基于SC28L198的多串口服务器设计
- 基于LW IP的嵌入式串口服务器的设计与
- 基于Linux的串口服务器设计
- 一种嵌入式串口共享服务器的设计
- 易语言 TCP使用HTTP、SOCKES5代理IP。
- 西门子S7-1200 MODBUS-TCP通讯编程
- 200SMART Modbus-TCP通信程序演示-轮询(多
- 轻量级文件服务器Fdfs搭建(fastDFS+n
评论
共有 条评论