📄 server.c
字号:
#include <stdio.h>
#include <stdlib.h>#include <unistd.h>#include <string.h>
#include <pthread.h>#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/errno.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <sys/wait.h>
#define QLEN 5 /*最大排队长度*/
#define BUFSIZE 1024
main(int argc,char *argv[]) /*参数检验 */
{
if(argc!=2)
{printf("usage:%s PORT\n",argv[0]);
exit(1);
}
char buf[BUFSIZE],uname[16],pword[16];
int msock,new_socket;
unsigned short port;
struct hostent *lhost;
struct sockaddr_in saddr,caddr;
unsigned int alen;
int rlen;
int checkpword(char *, char * ,char *);int echo(int);
pthread_t th;pthread_attr_t ta;
pthread_mutex_t st_mutex;
saddr.sin_family = PF_INET; /*指定服务器地址参数*/
saddr.sin_addr.s_addr = INADDR_ANY;
port=(unsigned short)atoi(argv[1]);
saddr.sin_port =port;
if ((msock=socket(PF_INET,SOCK_STREAM,0))<0) /*创建socket连接*/
{printf("socket init error!\n");
exit (1);
}
if (bind(msock,(struct sockaddr *)&saddr,sizeof(saddr))!=0) /*绑定地址*/
{printf("bind socket error!\n");
exit(1);
}
listen(msock,QLEN); /*被动模式*/(void) pthread_attr_init(&ta);(void) pthread_attr_setdetachstate(&ta,PTHREAD_CREATE_DETACHED);/*(void) pthread_mutex_init(&st_mutex,0);*/
while(1){
printf("listening...\n");
if((new_socket=accept(msock,(struct sockaddr *)&caddr,&alen))<=0) /*接受连接*/
{ printf ("connected error!\n"); exit(1); }
pthread_create(&th, &ta, (void * (*)(void*))echo,(void*)new_socket); }
}
FILE *ropendb(const char *dbname) /*以只读方式打开用户信息文件*/
{
FILE *fp;
if((fp=fopen(dbname, "r")) == NULL)
{ printf("cann't open the file \n");
exit(-1);
}
return fp;
}
int closedb(FILE *fp) /*关闭用户信息文件*/
{
return fclose(fp);
}
int checkpword(char *dbname, char *name ,char *pword)
{
FILE *fp;
char namebuf[255], pwdbuf[255];
struct user *ubuf;
fp=ropendb(dbname);
for(bzero(namebuf,sizeof(namebuf)), bzero(pwdbuf,sizeof(pwdbuf)); !feof(fp); bzero(namebuf,sizeof(namebuf)), bzero(pwdbuf,sizeof(pwdbuf)))
{
fscanf(fp,"%s\t%s", namebuf, pwdbuf);
if(strcmp(namebuf, name) != 0)
continue;
else
{
if (strcmp(pwdbuf,pword)==0)
{closedb(fp);
return 1;}
else
{closedb(fp);
return 0;}
}
}
closedb(fp);
return -1;
}int echo(int new_socket){char buf[BUFSIZE],uname[16],pword[16];
write(new_socket,"username:",sizeof("username:"));
read(new_socket,buf,sizeof(buf));
strcpy(uname,buf);
printf("%s will log in...\n",uname);
write(new_socket,"password:",sizeof("password:"));
read(new_socket,buf,sizeof(buf));
strcpy(pword,buf);
if(checkpword("user.db",uname,pword)==1)
{printf("%s logged in...\n",uname);
write(new_socket,"logged in\n",strlen("logged in\n"));
while(read(new_socket,buf,sizeof(buf)))
{
printf("recved from [%s]:%s\n",uname,buf);
write(new_socket,buf,sizeof(buf));
} close(new_socket);
}
else
{write(new_socket,"not logged in\n",strlen("not logged in\n"));
printf("%s not logged in\n",uname); close(new_socket);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -