嵌入式Linux網(wǎng)絡(luò)編程之:網(wǎng)絡(luò)高級(jí)編程
2.select()
使用fcntl()函數(shù)雖然可以實(shí)現(xiàn)非阻塞I/O或信號(hào)驅(qū)動(dòng)I/O,但在實(shí)際使用時(shí)往往會(huì)對(duì)資源是否準(zhǔn)備完畢進(jìn)行循環(huán)測(cè)試,這樣就大大增加了不必要的CPU資源的占用。在這里可以使用select()函數(shù)來(lái)解決這個(gè)問(wèn)題,同時(shí),使用select()函數(shù)還可以設(shè)置等待的時(shí)間,可以說(shuō)功能更加強(qiáng)大。下面是使用select()函數(shù)的服務(wù)器端源代碼??蛻舳顺绦蚧旧吓c10.2.3小節(jié)中的例子相同,僅加入一行sleep()函數(shù),使得客戶端進(jìn)程等待幾秒鐘才結(jié)束。
/*net_select.c*/
#includesys/types.h>
#includesys/socket.h>
#includestdio.h>
#includestdlib.h>
#includestring.h>
#includesys/time.h>
#includesys/ioctl.h>
#includeunistd.h>
#includenetinet/in.h>
#definePORT4321
#defineMAX_QUE_CONN_NM5
#defineMAX_SOCK_FDFD_SETSIZE
#defineBUFFER_SIZE1024
intmain()
{
structsockaddr_inserver_sockaddr,client_sockaddr;
intsin_size,count;
fd_setinset,tmp_inset;
intsockfd,client_fd,fd;
charbuf[BUFFER_SIZE];
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror(socket);
exit(1);
}
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(PORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
bzero((server_sockaddr.sin_zero),8);
inti=1;/*允許重復(fù)使用本地地址與套接字進(jìn)行綁定*/
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,i,sizeof(i));
if(bind(sockfd,(structsockaddr*)server_sockaddr,
sizeof(structsockaddr))==-1)
{
perror(bind);
exit(1);
}
if(listen(sockfd,MAX_QUE_CONN_NM)==-1)
{
perror(listen);
exit(1);
}
printf(listening....n);
/*將調(diào)用socket()函數(shù)的描述符作為文件描述符*/
FD_ZERO(inset);
FD_SET(sockfd,inset);
while(1)
{
tmp_inset=inset;
sin_size=sizeof(structsockaddr_in);
memset(buf,0,sizeof(buf));
/*調(diào)用select()函數(shù)*/
if(!(select(MAX_SOCK_FD,tmp_inset,NULL,NULL,NULL)>0))
{
perror(select);
}
for(fd=0;fdMAX_SOCK_FD;fd++)
{
if(FD_ISSET(fd,tmp_inset)>0)
{
if(fd==sockfd)
{/*服務(wù)端接收客戶端的連接請(qǐng)求*/
if((client_fd=accept(sockfd,
(structsockaddr*)client_sockaddr,sin_size))==-1)
{
perror(accept);
exit(1);
}
FD_SET(client_fd,inset);
printf(Newconnectionfrom%d(socket)n,client_fd);
}
else/*處理從客戶端發(fā)來(lái)的消息*/
{
if((count=recv(client_fd,buf,BUFFER_SIZE,0))>0)
{
printf(Receivedamessagefrom%d:%sn,
client_fd,buf);
}
else
{
close(fd);
FD_CLR(fd,inset);
printf(Client%d(socket)hasleftn,fd);
}
}
}/*endofifFD_ISSET*/
}/*endofforfd*/
}/*endifwhilewhile*/
close(sockfd);
exit(0);
}
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論