新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 嵌入式Linux網(wǎng)絡編程之:網(wǎng)絡高級編程

嵌入式Linux網(wǎng)絡編程之:網(wǎng)絡高級編程

作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

本文引用地址:http://2s4d.com/article/257115.htm

2.()

使用()函數(shù)雖然可以實現(xiàn)非阻塞I/O或信號驅動I/O,但在實際使用時往往會對資源是否準備完畢進行循環(huán)測試,這樣就大大增加了不必要的CPU資源的占用。在這里可以使用()函數(shù)來解決這個問題,同時,使用()函數(shù)還可以設置等待的時間,可以說功能更加強大。下面是使用select()函數(shù)的服務器端源代碼??蛻舳顺绦蚧旧吓c10.2.3小節(jié)中的例子相同,僅加入一行sleep()函數(shù),使得客戶端進程等待幾秒鐘才結束。

/*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;/*允許重復使用本地地址與套接字進行綁定*/

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)

{/*服務端接收客戶端的連接請求*/

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ā)來的消息*/

{

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相關文章:linux教程




評論


相關推薦

技術專區(qū)

關閉
×

Digikey let's do
· 2025年第1期限时报名开启,5月8日截止
· Digikey助力,提供一站式免费器件支持
· 跟大佬一起 【DIY 功率监测与控制系统】