📄 server.c
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include<pthread.h>
#define BUFMAX 100
int server_sockfd, client_sockfd;
struct sockaddr_in server_addr, client_addr;
int client_len;
char buf[BUFMAX];
int buflen;
int total=0;
int store=5;
char name[20];
char pwd[20];
char username[BUFMAX][20];
char password[BUFMAX][20];
char storename[20][20]={"admin","zhouyuan","a","b"};
char storepwd[20][20]={"admin","111","a","b"};
char file[BUFMAX][BUFMAX];
char port[BUFMAX][BUFMAX];
char ip[BUFMAX][BUFMAX]={{0},{0}};
char buf1[BUFMAX];
char buf3[BUFMAX];
char buf4[BUFMAX];
int len1;
int len2;
char temp[BUFMAX];
char *ptr1,*ptr2,*ptr;
int g,i;
char *addrIP;
char portnumber[50];
char *search="#";
int markfile=1;
char arr[20];
char *find;
pid_t pid;
//多线程登陆服务器
int thread(void)
{
addrIP=inet_ntoa(client_addr.sin_addr);
for (;;)
{
memset(buf1, '\0', sizeof(buf1));
memset(buf3, '\0', sizeof(buf3));
memset(buf, '\0', sizeof(buf));
int count=0;
buflen=read(client_sockfd, buf, BUFMAX);
printf("hello say: %s\n", buf);
strncpy(buf3,buf, 4);
//处理登陆验证用户名和密码
if((buf3[0]=='L')&&(buf3[1]=='G')&&(buf3[2]=='I')&&(buf3[3]=='N'))
{
memset(pwd, '\0', sizeof(pwd));
memset(name, '\0', sizeof(name));
char *str="LRESWelcome Login!\n";
ptr1=strstr(buf,"N");
ptr1=ptr1+1;
len1=strlen(ptr1);
ptr2=strstr(ptr1,"#");
len2=strlen(ptr2);
strncpy(name,ptr1,len1-len2);
strncpy(pwd,ptr2+1,len2-1);
//解码
int val=pwd[0]-'0';
for(i=1;i<strlen(pwd)-1;i++)
{ pwd[i-1]=pwd[i]+val;}
i=i-1;
pwd[i]='\0';
int m=0;
for(i=0;i<store;i++)
{
if(strcmp(name,storename[i])==0&&strcmp(pwd,storepwd[i])==0)
{
m=1; break;}
}
if(m)
{
buflen = strlen(str);
write(client_sockfd, str, BUFMAX);
}
else{
str="EROR用户名或密码输入错误\n";
write(client_sockfd, str, BUFMAX);
break;
}
}
//处理传来的分享文件判断.txt文件,如果全为txt文件,存到file[][]数组里,全局变量增加1。
//将usename[][]和ip[][]和port[][],分别存储。
else if((buf3[0]=='S')&&(buf3[1]=='H')&&(buf3[2]=='R')&&(buf3[3]=='E'))
{
memset(portnumber, '\0', sizeof(portnumber));
markfile=1;
char*a;
char *b=&buf3[3];
a=strstr(buf,b);
a=a+1;
len1=strlen(a);
b=strstr(a,"#");
len2=strlen(b);
for(g=0;g<strlen(buf);g++)
{
if(buf[g]=='#')
count++;
}
strncpy(portnumber,a,len1-len2);
a=b;
char *c=a;
for(g=1;g<=count;g++)
{
a=a+1;
len1=strlen(a);
if(g!=count)
{
b=strstr(a,"#");
len2=strlen(b);
}
else
len2=1;
int j=0;
for(i=len1-len2-3;i<len1-len2;i++)
{
temp[j]=a[i];
j++;
}
if(strcmp(temp,"txt")!=0)
{
char *str="EROR注意传递.txt文件\n";
buflen=strlen(str);
markfile=0;
write(client_sockfd, str,buflen);
break;
}
a=b;
}
if(markfile)
{
total=total+1;
memset(username[total], '\0', sizeof(username[total]));
memset(password[total], '\0', sizeof(password[total]));
memset(ip[total], '\0', sizeof(ip[total]));
memset(port[total], '\0', sizeof(port[total]));
char *str="SHOK\n";
write(client_sockfd, str, BUFMAX);
len1=strlen(c);
strncpy(file[total],c,len1-1);
strcpy(ip[total],addrIP);
strcpy(port[total],portnumber);
strcpy(username[total],name);
strcpy(password[total],pwd);
printf("%s",file[total]);
printf("%d\n",total);
}
}
//处理搜索文件功能,找到所有的文件,依次匹配,如果部分匹配,则传给client
else if((buf3[0]=='S')&&(buf3[1]=='R')&&(buf3[2]=='C')&&(buf3[3]=='H'))
{
char*a;
char filename[BUFMAX];
memset(filename, '\0', sizeof(filename));
char *b=&buf3[3];
a=strstr(buf,b);
a=a+1;
char *str="SRES";
strcpy(filename,a);
for(i=1;i<=total;i++)
{//文件名匹配
ptr=strstr(file[i],"#");
while(ptr)
{
memset(arr,'\0',sizeof(arr));
memset(buf1, '\0', sizeof(buf1));
len1=strlen(ptr);
ptr=ptr+1;
ptr1=strstr(ptr,"#");
if(ptr1){
len2=strlen(ptr1);}
else len2=0;
strncpy(arr,ptr,len1-len2-1);
find=strstr(arr,filename);
if(find)
{
strcat(buf1,str);
strcat(buf1,arr);
strcat(buf1,"#");
strcat(buf1,username[i]);
strcat(buf1,"#");
strcat(buf1,ip[i]);
strcat(buf1,"#");
strcat(buf1,port[i]);
strcat(buf1,"#");
strcat(buf1,"\n");
printf("%s\n",buf1);
write(client_sockfd, buf1, BUFMAX);
printf("%s\n",arr);
}
ptr=ptr1;
}
}
char *tr="SRES\n";//文件查找结束
write(client_sockfd, tr, BUFMAX);
}//处理客户端传来的quit指令
else if((buf3[0]=='Q')&&(buf3[1]=='U')&&(buf3[2]=='I')&&(buf3[3]=='T'))
{
close(client_sockfd);
break;
}
}
return 0;
}
int main()
{
pthread_t id;
memset(temp, '\0', sizeof(temp));
//建立server socket
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8000115);
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("create server socket error");
}
//绑定server端socket
if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind server socket error");
}
if (listen(server_sockfd, 5) < 0) {
perror("listen server socket error");
}
printf("Welcome, world!\n");
for (;;)
{
client_len = sizeof(client_addr);
printf("Waiting for hello...\n");
client_sockfd =accept(server_sockfd, (struct sockaddr *)&client_addr, &client_len);
int i,ret; ret=pthread_create(&id,NULL,(int*) thread,NULL);//多线程
if(ret!=0){
printf ("Create pthread error!\n");
exit (1);
}
// pthread_join(id,NULL);
}
close(client_sockfd);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -