⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 练习
💻 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 + -