QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 586|回复: 2

请版主大侠高手帮忙呀!!

[复制链接]
发表于 2003-11-25 15:45:28 | 显示全部楼层 |阅读模式
在下有一道难题想请版主大侠或高手指教!!谢谢!!
题目要求是:在LINUX下实现多用户访问服务器的程序.
下面第一个是服务器端(server.c)的程序,第二个是客户端(client.c);但我编的这个只能实现一个用户来访问服务器的功能,所以还请哪们高手帮着看看:应如何修改才能实现多用户访问服务器的功能.谢谢......

服务器端(SERVER.C)

#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<unistd.h>
#include&lt;sys/select.h&gt;
#include&lt;sys/ioctl.h&gt;
#include&lt;errno.h&gt;
#include&lt;signal.h&gt;

main()
{
        fd_set rfds;
        FD_ZERO(&amp;rfds);
        FD_SET(0,&amp;rfds);
      
        char buf[100];
        int listener=socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in  svr_addr;
        bzero((void*)&amp;svr_addr, sizeof(svr_addr));
        svr_addr.sin_family=AF_INET;
        svr_addr.sin_port=htons(12345);
        svr_addr.sin_addr.s_addr=INADDR_ANY;
        bind(listener, (struct sockaddr*)&amp;svr_addr, sizeof(svr_addr));
        listen(listener, 10);
        puts("server started\r\n");
               
        struct sockaddr_in cli_addr;
        socklen_t len=sizeof(cli_addr);
        int cli_fd=accept(listener, (struct sockaddr*)&amp;cli_addr, &amp;len);
        FD_SET(cli_fd,&amp;rfds);
        while(1)
        {
          FD_SET(0,&amp;rfds);
          FD_SET(cli_fd,&amp;rfds);  
          select(cli_fd+1,&amp;rfds,0,0,0);
                if(FD_ISSET(0,&amp;rfds)){
                  ssize_t count=read(0,buf,sizeof(buf));
                  send(cli_fd,buf,count,0);
                }
                if(FD_ISSET(cli_fd,&amp;rfds)){
                  int count=recv(cli_fd,buf,sizeof(buf),0);
                  if(count&lt;=0)break;
                  write(1,buf,count);
                }
                }
         
        
        close(cli_fd);
      
        close(listener);

客户端(client.c)

#include&lt;sys/socket.h&gt;
#include&lt;sys/types.h&gt;
#include&lt;arpa/inet.h&gt;
#include&lt;netinet/in.h&gt;
#include&lt;string.h&gt;
#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;sys/select.h&gt;
#include&lt;sys/socket.h&gt;
#include&lt;sys/types.h&gt;
#include&lt;arpa/inet.h&gt;
#include&lt;netinet/in.h&gt;
#include&lt;string.h&gt;
#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;
#include&lt;netdb.h&gt;
#include&lt;arpa/inet.h&gt;
#include<unistd.h>
#include&lt;sys/select.h&gt;
#include&lt;sys/ioctl.h&gt;
#include&lt;errno.h&gt;
#include&lt;signal.h&gt;

main()
{
        fd_set rfds;
        FD_ZERO(&amp;rfds);
        FD_SET(0,&amp;rfds);
        
        char buf[100];
        int client = socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in svr_addr;
        bzero((void *) &amp;svr_addr, sizeof(svr_addr));
        svr_addr.sin_family = AF_INET;
        svr_addr.sin_port = htons(12345);
        svr_addr.sin_addr.s_addr = inet_addr("xxx.xxx.xxx.xxx");
        connect(client, (struct sockaddr *) &amp;svr_addr, sizeof(svr_addr));
        FD_SET(client,&amp;rfds);
        while (1)
           {
                FD_SET(client,&amp;rfds);
                FD_SET(0,&amp;rfds);
                select(client+1,&amp;rfds,NULL,NULL,NULL);
                if(FD_ISSET(0,&amp;rfds)){
                  ssize_t count=read(0,buf,sizeof(buf));
                  send(client,buf,count,0);
                }
              
                if(FD_ISSET(client,&amp;rfds)){
       
                  int count=recv(client,buf,sizeof(buf),0);
                  if(count&lt;=0)break;
                  write(1,buf,count);
                 
               }
         }
        close(client);


}
发表于 2003-11-25 17:06:41 | 显示全部楼层
why don't you use xinetd or tcpserver ?
回复

使用道具 举报

 楼主| 发表于 2003-11-25 17:29:36 | 显示全部楼层
这位大侠,您说的那两种方法,在下以后会尝试,但眼下是先解决当前问题!!谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-5-31 18:19 , Processed in 0.071427 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表