2014-09-11 107 views
0

我有一個像服務器一樣工作的程序(listen() s,bind() s和accept()來自其他IP中相同程序的多個連接),並且同時將用戶輸入如UNIX shell。管理連接到多個主機的套接字

用戶輸入用於命令,並且有一個命令CONNECT帶有地址和端口號規範。

我想讓它連接到多個主機,我想我必須爲每個連接使用一個套接字。

當我在CONNECT用戶請求上創建套接字時,如何管理這些套接字?

我應該使用全局套接字array,並在創建連接時創建並添加套接字?

+0

郵編大約什麼都你試過至今。 – 2014-09-11 05:09:58

+0

是的,這將是棘手。您將需要每個套接字的線程或主select()在多個套接字上等待。 – 2014-09-11 05:13:58

+0

我正在使用'select()'來管理已接受()'接受的連接。我需要一種方法來管理連接()連接到的主機的套接字。 – user2418202 2014-09-11 05:19:36

回答

0

我假設你想管理服務器中的多個客戶端。對?

所以,你必須採取插槽一些預定義的陣列,同時將服務於每一個

前。

long accept_sock[10];//This should be global 
        //initilize it with -1 at entry point 
while(1) 
{ 
    struct sockaddr client; /* for BSDish accept() call */ 
    int    clientsize; 
    clientsize = sizeof(struct sockaddr_in); 
    long sock ; 

    for(int i=0;i<10;i++) 
    { 
     if(accept_sock[i] == -1) 
     {  
      sock= accept(server_sock, &client, &clientsize); 

      if(sock != -1) 
      { 
       acepct_sock[i] =sock; 
       break; 
      } 
     } 
    } 

    for(int i=0;i<10;i++) 
    { 
     if(accept_sock[i] != -1) 
     {  
      //do process 
     } 
    } 
} 
0
I think you need Concurrent Servers.There are two main classes of servers, iterative and concurrent. An iterative server iterates through each client, handling it one at a time. A concurrent server handles multiple clients at the same time. The simplest technique for a concurrent server is use select/fork(). 


#define FD_SETSIZE 20 /* MAX number of client */ 

    for (i = 0; i < FD_SETSIZE; i++) 
       client[i] = -1; 
     FD_ZERO(&allset); 
     FD_SET(listenfd, &allset); 

     for (; ;) { 
       rset = allset; 
       nready = select(maxfd+1, &rset, NULL, NULL, NULL); 

       if (FD_ISSET(listenfd, &rset)) {  /* new client connection */ 
         printf("listening socket readable\n"); 
         clilen = sizeof(cliaddr); 
         connfd = accept(listenfd, (SA *) &cliaddr, &clilen); 

         for (i = 0; i < FD_SETSIZE; i++) 
           if (client[i] < 0) { 
             client[i] = connfd;  /* save descriptor */ 
             break; 
           } 
         if (i == FD_SETSIZE) 
           printf("too many clients"); 

         FD_SET(connfd, &allset);  /* add new descriptor to set */ 
         if (connfd > maxfd) 
           maxfd = connfd;     /* for select */ 
         if (i > maxi) 
           maxi = i;        /* max index in client[] array */ 

         if (--nready <= 0) 
           continue;        /* no more readable descriptors */ 
       } 

       for (i = 0; i <= maxi; i++) { /* check all clients for data */ 
         if ((sockfd = client[i]) < 0) 
           continue; 
         if (FD_ISSET(sockfd, &rset)) { 
           /* do process */ 
         } 
       } 
     }