- 論壇徽章:
- 0
|
client為阻塞方式。
server為select方式。
當(dāng)client connect函數(shù)返回,一分鐘以后server的套接口描述符才
有數(shù)據(jù)。
下面是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完成后,執(zhí)行一個(gè)cpu利用率幾乎為100%的計(jì)算程序。
client是個(gè)雙cpu的機(jī)器,并且運(yùn)行了兩個(gè)上面的同樣的程序,當(dāng)只運(yùn)行一個(gè)程序時(shí),幾乎沒有延時(shí)。。
server 為windows 2000
client 為L(zhǎng)inux 7.3
請(qǐng)高手指點(diǎn),為什么要等待那么長(zhǎng)時(shí)間。 |
|