藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月6日 10:18


寫多進程並發服務器程序的一個問題!!

我的程序框架如下:
int unicomServer::Run()
{
        pid_t pid;         
        int iStatus;
        socklen_t addr_size = (int)sizeof(remote_sin);
       
          while (1)
          {
                  conn_socket = accept(Mysocket, (struct sockaddr *)&remote_sin, &addr_size);                   
                  if (conn_socket < 0)
                  {
                              socket_error = MySOCKET_ACCEPT_ERROR;
                              return -1;
                    }
                    if ((pid = fork()) >; 0)
                    {
                            //while (wait(&iStatus) != pid);                            close(conn_socket);//父進程關閉連接描述符
                            continue;                           
                    }
                    else if (pid == 0)
                    {
                            close(Mysocket);//子進程關閉監聽描述符
                            analyzePackage(conn_socket);
                            exit(0);
                    }
            }

              return 0;
}
現在的問題是:
1.如果有多個客戶端來請求那麼主進程應該分配多個socket,然後主進程fork多個進程處理多個socket的請求,然後再將結果通過不同的socket返回給不同的客戶端,不過如果按我這麼寫,在fork之後的父進程裡close(conn_socket)似乎將連接關閉之後,再來客戶端還是分配原來的那個socket,如:客戶端1的socket是4,客戶端2的socket還是4,客戶端3可能還是4,那麼我再處理完成請求之後,如何區分將拿一個請求發給socket對應的客戶端呢?如果選擇在復進程中不關閉socket,倒是可以解決這個問題,不過如果不關閉socket那麼客戶端多了之後是不是因打開的socket描述符過多而報錯呢?如果解決這一個問題呢?
2.在復進程中是否要加上while (wait(&iStatus) != pid);    這句呢,如果加上似乎要阻塞,直到處理完成當前請求之後才能分配下一個socket,也就是處理下一個請求,那麼這樣似乎是一個請求一個請求那麼處理的,似乎沒有起到並發服務器的作用,那麼這裡是否有必要加上wait呢?

寫多進程並發服務器程序的一個問題!!

你的程序結構有問題.網上討論並發服務器模型及講解實例的文章很多,去看看吧.我以前看過的一篇,介紹服務器模型的文章,先看看
http://www.fanqiang.com/a4/b7/20010508/112359.html

寫多進程並發服務器程序的一個問題!!

-->   
我的結構的問題在哪裡???



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com