多用户登录怎样实现?

a596097791 2010-06-12 07:13:30
我用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;
}
...全文
333 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
alicktony 2010-06-15
  • 打赏
  • 举报
回复
while(1)做一个循环,不停的去accept就行了
tan625747 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 a596097791 的回复:]

是别的用户是可以进来的,只是进来后多对父进程的链表进行复制,然后在进行添加或删减自己链表中的内容。最后在把自己链表内容写到指定的文件中,可是这样会把别的进程所写内容给改了。我现在困扰的是怎样让多个进程能够只对同一个链表进行操作?
[/Quote]

不了解多进程


好像你上面的也没有用到多进程,你可以用多线程试一下呀,这样就可以用一个链表对多个socket进行管理

xixiao 2010-06-14
  • 打赏
  • 举报
回复
楼主是牛人
cejay 2010-06-14
  • 打赏
  • 举报
回复
牛人呀,很少见有人用C写的应用程序
honemay 2010-06-13
  • 打赏
  • 举报
回复
你接收到一个客户端连接后,在while(1)循环里处理完这个客户端请求后
你close(sockfd);。。你把服务都关闭了。肯定接受不了其他的客户端了
a596097791 2010-06-13
  • 打赏
  • 举报
回复
是别的用户是可以进来的,只是进来后多对父进程的链表进行复制,然后在进行添加或删减自己链表中的内容。最后在把自己链表内容写到指定的文件中,可是这样会把别的进程所写内容给改了。我现在困扰的是怎样让多个进程能够只对同一个链表进行操作?
ww884203 2010-06-13
  • 打赏
  • 举报
回复
说的对,楼主是牛人
ylu029 2010-06-13
  • 打赏
  • 举报
回复
楼主是牛人。
周靖峰 2010-06-12
  • 打赏
  • 举报
回复
楼主你太牛了
AlanBruce 2010-06-12
  • 打赏
  • 举报
回复
UP


UP

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧