📄 subject_62372.htm
字号:
<p>
序号:62372 发表者:okwang 发表日期:2003-11-26 14:52:51
<br>主题:请版主大侠高手给看看谢谢!!!!
<br>内容:在下有一道难题想请版主大侠或高手指教!!谢谢!!<BR>题目要求是:在LINUX下实现多用户访问服务器的程序.<BR>下面第一个是服务器端(server.c)的程序,第二个是客户端(client.c);但我编的这个只能实现一个用户来访问服务器的功能,所以还请哪们高手帮着看看:应如何修改才能实现多用户访问服务器的功能.谢谢......<BR><BR>服务器端(SERVER.C)<BR><BR>#include<sys/socket.h><BR>#include<sys/types.h><BR>#include<arpa/inet.h><BR>#include<netinet/in.h><BR>#include<string.h><BR>#include<stdio.h><BR>#include<stdlib.h><BR>#include<netdb.h><BR>#include<arpa/inet.h><BR>#include<unistd.h><BR>#include<sys/select.h><BR>#include<sys/ioctl.h><BR>#include<errno.h><BR>#include<signal.h><BR><BR>main()<BR>{<BR> fd_set rfds; <BR> FD_ZERO(&rfds);<BR> FD_SET(0,&rfds);<BR> <BR> char buf[100];<BR> int listener=socket(AF_INET, SOCK_STREAM, 0);<BR> struct sockaddr_in svr_addr;<BR> bzero((void*)&svr_addr, sizeof(svr_addr));<BR> svr_addr.sin_family=AF_INET;<BR> svr_addr.sin_port=htons(12345);<BR> svr_addr.sin_addr.s_addr=INADDR_ANY;<BR> bind(listener, (struct sockaddr*)&svr_addr, sizeof(svr_addr));<BR> listen(listener, 10);<BR> puts("server started\r\n");<BR> <BR> struct sockaddr_in cli_addr;<BR> socklen_t len=sizeof(cli_addr);<BR> int cli_fd=accept(listener, (struct sockaddr*)&cli_addr, &len);<BR> FD_SET(cli_fd,&rfds);<BR> while(1)<BR> {<BR> FD_SET(0,&rfds);<BR> FD_SET(cli_fd,&rfds); <BR> select(cli_fd+1,&rfds,0,0,0);<BR> if(FD_ISSET(0,&rfds)){<BR> ssize_t count=read(0,buf,sizeof(buf));<BR> send(cli_fd,buf,count,0);<BR> }<BR> if(FD_ISSET(cli_fd,&rfds)){<BR> int count=recv(cli_fd,buf,sizeof(buf),0);<BR> if(count<=0)break;<BR> write(1,buf,count);<BR> }<BR> }<BR> <BR> <BR> close(cli_fd);<BR> <BR> close(listener);<BR><BR>客户端(client.c)<BR><BR>#include<sys/socket.h><BR>#include<sys/types.h><BR>#include<arpa/inet.h><BR>#include<netinet/in.h><BR>#include<string.h><BR>#include<stdio.h><BR>#include<stdlib.h><BR>#include<sys/select.h><BR>#include<sys/socket.h><BR>#include<sys/types.h><BR>#include<arpa/inet.h><BR>#include<netinet/in.h><BR>#include<string.h><BR>#include<stdio.h><BR>#include<stdlib.h><BR>#include<netdb.h><BR>#include<arpa/inet.h><BR>#include<unistd.h><BR>#include<sys/select.h><BR>#include<sys/ioctl.h><BR>#include<errno.h><BR>#include<signal.h><BR><BR>main()<BR>{<BR> fd_set rfds;<BR> FD_ZERO(&rfds);<BR> FD_SET(0,&rfds);<BR> <BR> char buf[100];<BR> int client = socket(AF_INET,SOCK_STREAM,0);<BR> struct sockaddr_in svr_addr;<BR> bzero((void *) &svr_addr, sizeof(svr_addr));<BR> svr_addr.sin_family = AF_INET;<BR> svr_addr.sin_port = htons(12345);<BR> svr_addr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");<BR> connect(client, (struct sockaddr *) &svr_addr, sizeof(svr_addr));<BR> FD_SET(client,&rfds);<BR> while (1)<BR> { <BR> FD_SET(client,&rfds);<BR> FD_SET(0,&rfds);<BR> select(client+1,&rfds,NULL,NULL,NULL);<BR> if(FD_ISSET(0,&rfds)){<BR> ssize_t count=read(0,buf,sizeof(buf));<BR> send(client,buf,count,0);<BR> }<BR> <BR> if(FD_ISSET(client,&rfds)){<BR> <BR> int count=recv(client,buf,sizeof(buf),0);<BR> if(count<=0)break;<BR> write(1,buf,count);<BR> <BR> }<BR> }<BR> close(client);<BR><BR><BR>}<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:zzjhsj 回复日期:2003-11-26 15:22:47
<br>内容:1.把listener socket放入rfds<BR>2. int cli_fd=accept(listener, (struct sockaddr*)&cli_addr, &len);放到select后listener可读分支<BR>3.select 函数的第一个参数为set中sock最大的一个,这样用错了<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -