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


    

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


connect與accept時間相隔甚遠

client為阻塞方式。
server為select方式。

當client connect函數返回,一分鐘以後server的套接口描述符才
有數據。


下面是server端的accept代碼。

for( ; ; ){
        FD_ZERO(&readfds);            // clear set
        FD_SET(m_fdListenSocket, &readfds);       // add sock to set
        memset[/quote]-->-->( &clientAddr, 0, sizeof (sockaddr_in) );

                tval.tv_sec  = 0;
                tval.tv_usec = 10;

               err = ::select(0, &readfds, NULL, NULL, &tval);
               if ( -1 == err ) {
                break;
        }
        if (FD_ISSET(m_fdListenSocket, &readfds)){
#ifdef _WINDOWS
                int iSockaddrLen = sizeof (sockaddr_in);
#else
                socklen_t iSockaddrLen = sizeof (sockaddr_in);
#endif
                int client_socket = accept(m_fdListenSocket, (sockaddr *)&clientAddr, &iSockaddrLen );
            if (client_socket == -1)
            {
        break;
            }
}


下面是client端的連接代碼:
        // 建立socket
        sock_fd = socket( AF_INET, SOCK_STREAM, 0 );
#ifdef _DEBUG
        printf( "Call socket function, Return socket file desc: %d\n", sock_fd );
#endif

        if( -1 == sock_fd ){
                return -1;
        }

        memset( &serv_addr, 0, sizeof(sockaddr_in) );
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons( SERV_PORT );

        if( 0 == pIP_Addr ){
                serv_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
        } else {
                serv_addr.sin_addr.s_addr = inet_addr( pIP_Addr );
        }


        ret = connect( sock_fd, (sockaddr*) &serv_addr, sizeof(serv_addr));


client 在connect完成後,執行一個cpu利用率幾乎為100%的計算程序。

client是個雙cpu的機器,並且運行了兩個上面的同樣的程序,當只運行一個程序時,幾乎沒有延時。。

server 為windows 2000
client 為Linux 7.3


請高手指點,為什麼要等待那麼長時間。



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