多用户登录怎样实现?
我用c语言写了一个简单的学生选课系统,单个用户还还是可以实现的,可是多用户一起登录的时候还是没有解决,希望哪位高手帮帮?
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include"list_head.h"
extern void lodin();
extern void lodout();
LIST_HEAD(stu_list);
LIST_HEAD(teac_list);
#define SERVPORT 5555
#define MAX(a,b) (a) > (b) ? (a):(b)
#define BACKLOG 10
void server()
{
int sockfd,client_fd,i = 0;;
struct sockaddr_in remote_addr;
struct sockaddr_in their_addr;
socklen_t sin_size;
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) ==-1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(SERVPORT);
their_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(their_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG) ==-1)
{
perror("listen");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size)) == -1)
{
perror("accept");
continue;
}
printf("received a connectio from %s\n",inet_ntoa(remote_addr.sin_addr));
if(!fork())
{
close(sockfd);
main_admin(client_fd);
i++;
exit(0);
}
close(client_fd);
if(i == 100)
break;
}
close(sockfd);
}
int main()
{
lodout();
server();
lodin();
return 0;
}
上面是服务端的代码;
下面是客户端的代码
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/socket.h>
#define SERVPORT 5555
#define MAXSIZE 1024
#define MAX(a,b) (a)>(b)?(a):(b)
void client(int argc,char *argv[])
{
int sockfd,maxfd;
char sendbuf[MAXSIZE]={0};
char recvbuf[MAXSIZE]={0};
struct hostent *host;
struct sockaddr_in serv_addr;
fd_set rfds;
int num;
if(argc < 2)
{
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if((host = gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname");
exit(1);
}
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) ==-1)
{
perror("socket");
exit(1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr*)host->h_addr);
// serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) ==-1)
{
perror("connect");
exit(1);
}
FD_ZERO(&rfds);
while(1)
{
FD_SET(0,&rfds);
FD_SET(sockfd,&rfds);
maxfd = MAX(0,sockfd)+1;
select(maxfd,&rfds,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&rfds))
{
bzero(recvbuf,1024);
recv(sockfd,recvbuf,1024,0);
printf("%s",recvbuf);
}
if(FD_ISSET(0,&rfds))
{
read(0,sendbuf,1024);
sendbuf[strlen(sendbuf)] = '\0';
if(sendbuf[0] == '\0')
continue;
if((num=send(sockfd,sendbuf,strlen(sendbuf)-1,0))== -1)
{
perror("send");
exit(1);
}
bzero(sendbuf,1024);
}
}
close(sockfd);
}
int main(int argc,char *argv[])
{
client(argc,argv);
return 0;
}