server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
int main(int argc, char const *argv[])
{
if (argc != 2)
{
printf("please input %s <port>\n", argv[0]);
return -1;
}
//创建流失套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //链接
if (sockfd < 0)
{
perror("socket err");
return -1;
}
printf("sockfd:%d\n", sockfd);
struct sockaddr_in saddr, caddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1])); // int a=atoi(argv[2]) "8888"int a=atoi("8888")/a=8888
//saddr.sin_addr.s_addr=inet_addr(argv[1]); //inet_addr(argv[1])
//设置服务器自动获取自己主机的ip
//saddr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY 0x00000000 "0.0.0.0"
//saddr.sin_addr.s_addr=INADDR_ANY;
saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
socklen_t len = sizeof(caddr);
//2绑定套接字 ip和端口(自己)
if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
{
perror("bind err");
return -1;
}
printf("blind ok.\n");
if (listen(sockfd, 5) < 0)
{
perror("listen err");
return -1;
}
printf("listen ok\n");
int ret;
char buf[128];
while (1)
{
int acceptfd = accept(sockfd, (struct sockaddr *)&caddr, &len);
if (acceptfd < 0)
{
perror("accept err");
return -1;
}
printf("acceptfd:%d\n", acceptfd); //通信
printf("client:ip=%s port=%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));
char buf[128];
ssize_t ret;
while (1)
{
//fgets(arr,sizeof(arr));
ret = recv(acceptfd, buf, sizeof(buf), 0);
if (ret < 0)
{
perror("rec err");
return -1;
}
else if (ret == 0)
{
printf("clinet exit\n");
break;
}
else
{
if (strncmp(buf, "list", 4) == 0)
{ //打开当前目录读文件判断文件是普通文件将文件名传给客户端
list_server(acceptfd, buf, sizeof(buf));
}
else if (strncmp(buf, "put ", 4) == 0)
{ //接收文件(本地:打开新建文件接收客户端发送过来的内容写到文件)
put_server(acceptfd, buf, sizeof(buf));
}
else if (strncmp(buf, "get ", 4) == 0)
{ //发送文件
//本地:打开文件读内容发送给客户端
get_server(acceptfd, buf, sizeof(buf));
}
}
}
close(acceptfd);
}
close(sockfd);
//close(acceptfd);
return 0;
}
//3get
void get_server(int acceptfd, char *buf, int size) //buf->put xxx.c
{
//打开文件
int fd = open(buf + 4, O_RDONLY);
if (fd < 0)
{
perror("open file err.");
return;
}
int ret; //实际读到的个数
while ((ret = read(fd, buf, size - 1)) != 0)
{
buf[ret] = '\0';
send(acceptfd, buf, size, 0);
}
strcpy(buf, "get ok.");
send(acceptfd, buf, size, 0);
}
//2
void put_server(int acceptfd, char *buf, int size)
{
int fd = open(buf + 4, O_TRUNC | O_CREAT | O_WRONLY, 0666);
if (fd < 0)
{
perror("open err");
return;
}
while (1)
{
if (recv(acceptfd, buf, size, 0) < 0)
{
perror("recv err");
return;
}
if (strncmp(buf, "put ok.", 7) == 0)
break;
write(fd, buf, strlen(buf));
}
}
//list
void list_server(int acceptfd, char *buf, int size)
{
DIR *dir = opendir("./");
if (dir == NULL)
{
perror("opendir err");
return;
}
struct dirent *dp = NULL;
struct stat st;
while ((dp = readdir(dir)) != NULL)
{
stat(dp->d_name, &st);
if (S_ISREG(st.st_mode))
{
strcpy(buf, dp->d_name);
send(acceptfd, buf, size, 0);
}
}
//发送结束标志
strcpy(buf, "list ok.");
send(acceptfd, buf, size, 0);
}
client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
void show(void); //声明
void list_client(int sockfd, char *buf, int size);
void put_client(int sockfd, char *buf, int size);
void get_client(int sockfd, char *buf, int size);
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("please input %s <ip> <port>\n", argv[0]);
return -1;
}
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("sockfd err");
return -1;
}
// 填充结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[2]));
saddr.sin_addr.s_addr = inet_addr(argv[1]);
if (connect(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
{
perror("connect err");
return -1;
}
char buf[128];
// ssize_t ret;
while (1)
{
//1.请求窗口
show();
//获取请求
fgets(buf, sizeof(buf), stdin);
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] == '\0';
send(sockfd, buf, sizeof(buf), 0);
if (strncmp(buf, "list", 4) == 0)
{ //循环接收服务器发送过来的普通文件名输出到终端
list_client(sockfd, buf, sizeof(buf));
}
else if (strncmp(buf, "put ", 4) == 0)
{//上传文件(本地:打开文件读内容发送给服务器)
put_client(sockfd, buf, sizeof(buf));
}
else if (strncmp(buf, "get ", 4) == 0)
{ //下载服务器路径下的文件
//本地:(打开新建文件接收服务器发送过来的内容写到文件)
get_client(sockfd, buf, sizeof(buf));
}
else if (strncmp(buf, "quit", 4) == 0)
{
break;
}
}
close(sockfd);
return 0;
} // list 循环接收服务器发送过来的普通文件名输出到终端
void list_client(int sockfd, char *buf, int size)
{
while (1)
{
if (recv(sockfd, buf, size, 0) < 0)
{
perror("recv err");
return;
}
if (strncmp(buf, "list ok.", 8) == 0)
break;
}
} //put上传文件(本地:打开文件读内容发送给服务器)
void put_client(int sockfd, char *buf, int size) //buf->put xxx.c
{
int fd = open(buf + 4, O_RDONLY);
if (fd < 0)
{
perror("open err");
return;
}
int ret;
while ((ret = read(fd, buf, size - 1)) != 0)
{
buf[ret] = '\0';
send(sockfd, buf, size, 0);
}
strcpy(buf, "put ok.");
send(sockfd, buf, size, 0);
}
//get
void get_client(int sockfd, char *buf, int size)
{
int fd = open(buf + 4, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd < 0)
{
perror("open err");
return;
}
while (1)
{
if (recv(sockfd, buf, size, 0) < 0)
{
perror("recv err");
return;
}
if (strncmp(buf, "get ok.", 7) == 0)
{
break;
}
write(fd, buf, strlen(buf));
}
}
void show(void)
{
printf("************list*********\n");
printf("************put filename*\n");
printf("************get filename*\n");
printf("************quit*********\n");
}