服务端代码:
服务端
#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 <unistd.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
int change(char cmd[128])
{
if(!strcmp("ls",cmd)) { return 1;}
else if(!strcmp("ps",cmd)) { return 2;}
else if(strstr(cmd,"cd")!=NULL) { return 3;}
else if(!strcmp("g",cmd)) { return 4;}
else if(strstr(cmd,"get")!=NULL){ return 5;}
else if(strstr(cmd,"put")!=NULL){ return 6;}
}
char *getbehind(char cmd[128])
{
char *p;
p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void getmessage(char cmd[128],int cfd)
{
char readbuf[8000];
char *p=getbehind(cmd);
read(cfd,readbuf,8000);
int fd = open(p,O_RDWR|O_CREAT,0666);
write(fd,readbuf,strlen(readbuf));
printf("receive successfully\n");
close(fd);
memset(readbuf,0,8000);
}
void choosecmd(char cmd[128],int c_fd)
{
int sfd;
FILE *fdb;
char *readbuf = (char*)malloc(128);
char freadbuf[128];
char *p = (char *)malloc(8000);
int ret;
ret = change(cmd);
switch(ret){
case 1:
fdb = popen("ls", "r");
fread(freadbuf,sizeof(freadbuf),1,fdb);
write(c_fd,freadbuf,sizeof(freadbuf));
memset(freadbuf,0,sizeof(freadbuf));
printf("ok\n");
break;
case 2:
system("ps");
break;
case 3:
p = getbehind(cmd);
chdir(p);
memset(p,0,sizeof(p));
break;
case 4:
read(c_fd,freadbuf,128);
printf("%s\n",freadbuf);
exit(1);
break;
case 5:
readbuf = getbehind(cmd);
if(access(readbuf,F_OK) == -1){
write(c_fd,"NO file",strlen("NO file"));
}
else{
sfd = open(readbuf,O_RDWR,0666);
read(sfd,p,8000);
write(c_fd,p,strlen(p));
close(sfd);
memset(p,0,8000);
}
break;
case 6:
getmessage(cmd,c_fd);
break;
}
}
int main(int argc,char **argv)
{
//socket
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char Writebuf[128];
char Readbuf[128];
int nread;
int clen;
int s_fd;
int c_fd;
s_fd = socket(AF_INET, SOCK_STREAM,0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
if(argc!=3){
perror("argc");
exit(0);
}
memset(&s_addr,0,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
//bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//listen
listen(s_fd,10);
//accept
printf("wait connecting\n");
memset(&c_addr,0,sizeof(struct sockaddr_in));
clen = sizeof(struct sockaddr_in);
while(1){
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd == -1){
perror("accept");
exit(-1);
}
printf("connect,%s\n",inet_ntoa(c_addr.sin_addr));
//read
if(fork() == 0){
while(1){
nread = read(c_fd, Readbuf,128);
choosecmd(Readbuf,c_fd);
// printf("nread:%d,get from IP context:%s\n",nread,Readbuf);
memset(Readbuf,0,sizeof(Readbuf));
}
}
}
return 0;
}
客户端代码:
客户端代码:
#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 <unistd.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
int change(char cmd[128])
{
if(!strcmp("lls",cmd)) { return 1;}
else if(strstr(cmd,"lcd")!=NULL) { return 2;}
else if(!strcmp("g",cmd)) { return 3;}
else if(!strcmp("ls",cmd)) { return 4;}
else if(strstr(cmd,"cd")!=NULL) { return 5;}
else if(strstr(cmd,"get")!=NULL) { return 6;}
else if(strstr(cmd,"put")!=NULL) { return 7;}
}
char *getbehind(char cmd[128])
{
char *p;
p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void getmessage(char cmd[128],int cfd)
{
char readbuf[8000];
char *p=getbehind(cmd);
read(cfd,readbuf,8000);
if(strlen(readbuf) != strlen("NO file")){
int fd = open(p,O_RDWR|O_CREAT,0666);
write(fd,readbuf,strlen(readbuf));
printf("receive successfully\n");
close(fd);
memset(readbuf,0,8000);
}
else{
printf("NO file\n");
}
}
void putmessage(char cmd[128],int c_fd)
{
int sfd;
char *p = (char *)malloc(8000);
memset(p,0,8000);
char *readbuf = (char *)malloc(128);
readbuf = getbehind(cmd);
if(access(readbuf,F_OK) == -1){
printf("No file\n");
}
else{
sfd = open(readbuf,O_RDWR,0666);
read(sfd,p,8000);
write(c_fd,p,strlen(p));
close(sfd);
memset(p,0,8000);
}
}
void choosecmd(char cmd[128],int c_fd)
{
FILE *fdb;
int ret = change(cmd);
char freadbuf[128];
char *p = (char *)malloc(8000);
switch(ret){
case 1:
system("ls");
break;
case 2:
p = getbehind(cmd);
chdir(p);
memset(p,0,8000);
break;
case 3:
printf("unconnecting\n");
write(c_fd,"away host",128);
close(c_fd);
exit(-1);
break;
case 4:
read(c_fd,p,1024);
printf("%s\n",p);
memset(p,0,1024);
break;
case 5:
printf("host folder open or exit successful\n");
break;
case 6:
getmessage(cmd,c_fd);
break;
case 7: putmessage(cmd,c_fd);
break;
}
}
// int socket(int domain, int type, int protocol);
int main(int argc,char **argv)
{
//socket
char Readbuf[1024];
char Writebuf[128];
struct sockaddr_in c_addr;
int clent;
int c_fd;
int nread;
char buf[256];
if(argc != 3){
perror("argc");
exit(1);
}
c_fd = socket(AF_INET, SOCK_STREAM,0);
if(c_fd == -1){
perror("socket");
exit(-1);
}
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
//connect
// int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
clent = sizeof(struct sockaddr_in);
if(connect(c_fd,(struct sockaddr *)&c_addr,clent)){
perror("connect");
exit(-1);
}
//write send
printf("connect...\n");
while(1){
gets(Writebuf);
printf("cmd:%s\n",Writebuf);
write(c_fd,Writebuf,strlen(Writebuf));
choosecmd(Writebuf,c_fd);
printf("************************cmd**********************\n");
memset(Writebuf,0,strlen(Writebuf));
}
return 0;
}
所需.h头文件
#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 <unistd.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
int change(char cmd[128])
{
if(!strcmp("ls",cmd)) { return 1;}
else if(!strcmp("ps",cmd)) { return 2;}
else if(strstr(cmd,"cd")!=NULL) { return 3;}
else if(!strcmp("g",cmd)) { return 4;}
else if(strstr(cmd,"get")!=NULL){ return 5;}
else if(strstr(cmd,"put")!=NULL){ return 6;}
}
char *getbehind(char cmd[128])
{
char *p;
p = (char *)malloc(128);
p = strtok(cmd," ");
p = strtok(NULL," ");
return p;
}
void getmessage(char cmd[128],int cfd)
{
char readbuf[8000];
char *p=getbehind(cmd);
read(cfd,readbuf,8000);
int fd = open(p,O_RDWR|O_CREAT,0666);
write(fd,readbuf,strlen(readbuf));
printf("receive successfully\n");
close(fd);
memset(readbuf,0,8000);
}
void choosecmd(char cmd[128],int c_fd)
{
int sfd;
FILE *fdb;
char *readbuf = (char*)malloc(128);
char freadbuf[128];
char *p = (char *)malloc(8000);
int ret;
ret = change(cmd);
switch(ret){
case 1:
fdb = popen("ls", "r");
fread(freadbuf,sizeof(freadbuf),1,fdb);
write(c_fd,freadbuf,sizeof(freadbuf));
memset(freadbuf,0,sizeof(freadbuf));
printf("ok\n");
break;
case 2:
system("ps");
break;
case 3:
p = getbehind(cmd);
chdir(p);
memset(p,0,sizeof(p));
break;
case 4:
read(c_fd,freadbuf,128);
printf("%s\n",freadbuf);
exit(1);
break;
case 5:
readbuf = getbehind(cmd);
if(access(readbuf,F_OK) == -1){
write(c_fd,"NO file",strlen("NO file"));
}
else{
sfd = open(readbuf,O_RDWR,0666);
read(sfd,p,8000);
write(c_fd,p,strlen(p));
close(sfd);
memset(p,0,8000);
}
break;
case 6:
getmessage(cmd,c_fd);
break;
}
}
int main(int argc,char **argv)
{
//socket
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
char Writebuf[128];
char Readbuf[128];
int nread;
int clen;
int s_fd;
int c_fd;
s_fd = socket(AF_INET, SOCK_STREAM,0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
if(argc!=3){
perror("argc");
exit(0);
}
memset(&s_addr,0,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
//bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//listen
listen(s_fd,10);
//accept
printf("wait connecting\n");
memset(&c_addr,0,sizeof(struct sockaddr_in));
clen = sizeof(struct sockaddr_in);
while(1){
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd == -1){
perror("accept");
exit(-1);
}
printf("connect,%s\n",inet_ntoa(c_addr.sin_addr));
//read
if(fork() == 0){
while(1){
nread = read(c_fd, Readbuf,128);
choosecmd(Readbuf,c_fd);
// printf("nread:%d,get from IP context:%s\n",nread,Readbuf);
memset(Readbuf,0,sizeof(Readbuf));
}
}
}
return 0;
}
功能:实现在局域网里收发文件
ls:查看当前文件
lls:查看服务器文件
cd+空格+文件名(…),服务器进入文件夹或返回上一级
lcd+空格+文件名(…),本地进入文件夹或返回上一级
get+空格+文件名:得到服务器文件
put+空格+文件名: 发送给服务器
师从江江编程(江兴畿),畿你太美 噢噢 baby 你干嘛~嗨嗨~哎呦