哈,这一次终于轮到我来总结啦!经过今天的不懈努力,在借鉴前辈的基础上,终于完成了这一阶段的goal!
功能:通过客户端输入指令,“ls pwd cd get put”等等能实现客户端查看服务端文件,获取和发送文件功能。
ls列出服务端文件,lls列出客户端本地文件,get xxx表示从服务端获取一个文件,因而put xxx表示从客户端发送一个文件到服务端。cd和lcd功能大致差不多,最后quit退出软件。
代码区
这是文件的基础配置。将命令都宏定义,最后在case的时候简洁明了。
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PWD 1
#define GET 2
#define LS 0
#define IFGO 3
#define CD 4
#define PUT 5
#define LLS 6
#define LCD 7
#define LPWD 8
#define QUIT 9
#define DOFILE 10
struct Msg
{
int type;
char cmd[1024];
char buf[128];
};
client.c
main函数:
int main(int argc,char **argv)
{
int c_fd;
struct Msg msg;
if(argc!=3)
{
printf("输入数据有错\n");
exit(-1);
}
//1.socket
// int socket(int domain, int type, int protocol);
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1)
{
printf("Socket Error!\n");
exit(-1);
}
c_addr.sin_family=AF_INET;
c_addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
//3.connect
// int connect(int sockfd, const struct sockaddr *addr,
// socklen_t addrlen);
int n_connect=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));
if(n_connect==-1)
{
printf("Connect Error!\n");
exit(-1);
}
printf("connect ...\n");
// 4.send
int mark=0;
while(1)
{
memset(msg.cmd,0,sizeof(msg.cmd));
if(mark==