资源简介
在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与单片机多机通信系统设计
相关资源
- Dr.COM客户端破解[自动获取服务器地址
- Modbus TCP/IP协议说明书
- TCP/IP协议包
- 基于LabVIEW2013的远程多点温度测控系统
- 《TCPIP 网络编程》尹圣雨 源码.zip
- Qt使用tcp实现的简单服务端和客户端(
- visionpro的TCPIP通讯设置
- 基于TCP的聊天室包含客户端与服务器
- 基于linux系统的ftp服务器
- Modbus Poll
- cc3200 tcp 串口透传
- KUKA Router.zip
- MyTCP.zip
- 串口 网络调试工具
- WCF 聊天室,wcf 回调 TCP双工
- windows 2008r2服务器安装华为RH2288Hv3
- esp8266的SDK开发 TCP、UDP服务器端
- labview 与s7-200smart modbus tcp 通讯2.0
- live555流媒体服务器windows版
- 领克车机DNS服务器配置文件
- 手把手教你建立sock5代理服务器
- TCPReconnetDemo
- LINUX下的一个多线程的服务器和客户端
- tcpdump-4.9.0-5.el7.x86_64.rpm
- NFS服务器离线安装包
- labview的TCP大文件发送和接收
- 5个qt多线程
- web服务器易语言语言
- TwinCAT3 Modbus TCP通讯.pdf
- exchange2010迁移到另一台服务器
评论
共有 条评论