📄 server.c
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>#include <malloc.h>
////////structures and dates declare!////////////////
#define MSGMAX 100 #define BUFMAX 104 //buffer=head+msg
#define LGIN 1
#define ERROR 2
#define LRES 3 #define SHRE 4#define SHOK 5#define SRCH 6#define SRES 7#define QUIT 8int end=0;
struct Message
{
int head;
unsigned char content[MSGMAX];
};/////////functions/////////////////////////////void sendERROR(int client_sockfd,char * alert){ printf("Enter sendERROR\n"); struct Message snd; unsigned char *buf2; //snd buffer! buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking! snd.head=ERROR; strcpy(snd.content,alert); printf("pop:%s\n",snd.content); memset(buf2,'\0', BUFMAX); buf2=(unsigned char *)&snd; printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); end=1;};void dealwithSRCH(struct Message msg,int client_sockfd){ printf("Enter dealwithSRCH\n"); struct Message snd; unsigned char *buf2; //snd buffer! buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking! char *search; search=strtok(msg.content,"\n"); int i; char filebuffer[1000]; char *result; FILE *file;
if((file=fopen("sharelist.txt","r+"))==NULL){
printf("can not open file!\n");
return;
} //build buffer for sharelist.txt memset(filebuffer,'\0',sizeof(filebuffer)); fseek(file,0L,SEEK_END); //set to the END i=ftell(file); fseek(file,0L,SEEK_SET); //set to the begin i=fread(filebuffer,1,i,file);//read all !so hard way fclose(file); //filter the empty line!// strtok(filebuffer,"\n"); //searching result=strtok(filebuffer,"#"); while(result!=NULL){ if(strncmp(result,search,strlen(result))==0 || strcmp("txt",search)==0){ printf("find file\n"); //build snd msg! memset(&snd,'\0',BUFMAX); memset(buf2,'\0', BUFMAX); snd.head=SRES; strcpy(snd.content,result);//get filename strcat(snd.content,"#"); result=strtok(NULL,"\n"); //get rest strcat(snd.content,result); strcat(snd.content,"\n"); result=strtok(NULL,"#"); // printf("1.snd=%s\n",snd.content); //send! buf2=(unsigned char *)&snd; // printf("2.snd=%s\n",snd.content); printf("send %d bytes,content is %s \n",write(client_sockfd, buf2, BUFMAX),snd.content); // printf("3.snd=%s\n",snd.content); }else{ strtok(NULL,"\n"); result=strtok(NULL,"#"); //point next }//end if }//end while //snd eof memset(&snd,'\0',BUFMAX); memset(buf2,'\0', BUFMAX); snd.head=SRES; strcpy(snd.content,"\n"); buf2=(unsigned char *)&snd; printf("2.snd=%s\n",snd.content); printf("send %d bytes\n",write(client_sockfd, buf2, BUFMAX)); };void dealwithSHRE(struct Message msg,int client_sockfd,char * ip,char * user){ printf("Enter dealwithSHRE\n"); char *eachfile; char *port; char writetoshare[100]; char *contentbuffer; FILE *file; struct Message snd; unsigned char *buf2; //snd buffer! buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking! int flag=0; //varify the format of file printf("all is : %s",msg.content); //filter the \n of msg.content! shit! contentbuffer=strtok(msg.content,"\n"); port=strtok(contentbuffer,"#"); eachfile=strtok(NULL,"#"); while(eachfile!=NULL){ //printf("file:%s\n",eachfile); printf("cmp:%d vs %d\n",strcspn(eachfile,".txt"),strlen(eachfile)-4); if(strcspn(eachfile,".txt")!=strlen(eachfile)-4){ //got error format error! sendERROR(client_sockfd,"error format\n"); return; } //save the share file if (flag==0){ strcpy(writetoshare,eachfile); flag=1; }else strcat(writetoshare,eachfile); strcat(writetoshare,"#"); strcat(writetoshare,user); strcat(writetoshare,"#"); strcat(writetoshare,ip); strcat(writetoshare,"#"); strcat(writetoshare,port); strcat(writetoshare,"\n"); //printf("now:%s!!!\n",writetoshare); eachfile=strtok(NULL,"#"); } //save the share file information to sharelist.txt if((file=fopen("sharelist.txt","a+"))==NULL){
printf("can not open file:sharelist.txt\n");
return;
} printf("write=%s",writetoshare); fwrite(writetoshare,1,strlen(writetoshare),file);//copy to file fclose(file); //respone snd.head=SHOK; strcpy(snd.content,"\n"); memset(buf2,'\0', BUFMAX); buf2=(unsigned char *)&snd; printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); };void dealwithLGIN(struct Message msg,int client_sockfd,char * u){ printf("Enter dealwithLGIN\n"); char *username; username=(char *)malloc(20); char *password;//temp char realpwd[50];//password had been decode char userlist[1000]; // buffer for userlist char usrpwd[50],*splits="#";//temp int i;//temp char *onematch;//temp struct Message snd; unsigned char *buf2; //snd buffer! buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking! username=strtok(msg.content,"#"); //get username
password=strtok(NULL,"\n");//get pwd
//decrypt password printf("u:%s,p:%s\n",username,password);
for(i=1;i<strlen(password);i++)
realpwd[i-1]=password[i]+password[0]-'0'; //check the identity form database(userlist.txt)
FILE *file;
if((file=fopen("userlist.txt","r+"))==NULL){
printf("can not open file!\n");
return;
} //generate search string strcpy(usrpwd,username); strcat(usrpwd,splits); strcat(usrpwd,realpwd); //build buffer for userlist.txt memset(userlist,'\0',sizeof(userlist)); fseek(file,0L,SEEK_END); //set to the END i=ftell(file); fseek(file,0L,SEEK_SET); //set to the begin i=fread(userlist,1,i,file);//read all !so hard way fclose(file); ///////test/////////////////////////////////////////////////// /*printf("userpwd:%s\n",usrpwd); //test printf("%s\n",userlist); //test printf("%d\n",i); //test*/ //search and match onematch=strtok(userlist,"\n"); while(onematch!=NULL){ //printf("onematch:%s;usrpwd:%s\n",onematch,usrpwd); if(strncmp(onematch,usrpwd,strlen(onematch))==0){ printf("find\n"); snd.head=LRES; strcpy(snd.content,"log in succuss\n"); memset(buf2,'\0', BUFMAX); buf2=(unsigned char *)&snd; printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); strcpy(u,username); printf("in user:%s\n",username); return ; } onematch=strtok(NULL,"\n"); } //not find send error sendERROR(client_sockfd,"invalid log in"); return ;};
int main()
{
int server_sockfd, client_sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;//size of client_addr
unsigned char buf[BUFMAX];//rcv buffer
struct Message msg;//the package rcv pid_t pid; char username[20];//log in sucuss username client_len = sizeof(client_addr); //set the server addr
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//get my ip add
server_addr.sin_port = htons(8092);
//create socket SOCK_STREAM for TCP
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("create server socket error");
}
// bind socket with my ip
if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind server socket error");
}
//listen and create connection,at most 5 connections
if (listen(server_sockfd, 5) < 0) {
perror("listen server socket error");
}
printf("<BEGIN>\n");
for (;;) {
printf("Waiting for connect...\n");
//get client sock client_len=sizeof(client_addr);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_len); ////////////////fork//////////////////// pid=fork(); if(pid>0){} else if(pid==0){ /////////////end fork////////////////////// printf("client ip:%s,sockfd:%d\n",inet_ntoa(client_addr.sin_addr.s_addr),client_sockfd);
while(1){ //read & write
memset(&msg,'\0', sizeof(&msg)); memset(buf,'\0', sizeof(buf)); //so important!!!!! must use the unsigned buffer read(client_sockfd, buf, sizeof(buf)); msg=*(struct Message *)buf;
// printf("recive request %d,%s\n", msg.head,msg.content); //test
if(msg.head==LGIN){ memset(&username,'\0',20);
dealwithLGIN(msg,client_sockfd,&username); //printf("name:%s\n",username); break; } }//end while if(username[0]!='\0'){//log in sucuss while(1){ //read & write
memset(&msg,'\0', sizeof(&msg)); memset(buf,'\0', sizeof(buf)); //so important!!!!! must use the unsigned buffer read(client_sockfd, buf, sizeof(buf)); msg=*(struct Message *)buf; if(msg.head==SHRE){//deal with share file //printf("begin share\n"); dealwithSHRE(msg,client_sockfd,inet_ntoa(client_addr.sin_addr.s_addr),username);
}else if (msg.head==SRCH){ dealwithSRCH(msg,client_sockfd); }else if(msg.head==QUIT){ printf("byebye:%s\n",username); break; } }//end while } close(client_sockfd); /////////////////////////fork////////////// }else{ perror("fork error");} //return 0;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -