www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]在實際情況中,人們往往遇到多個客戶端連接服務(wù)器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的fcntl()和select()。

10.3網(wǎng)絡(luò)高級編程

在實際情況中,人們往往遇到多個客戶端連接服務(wù)器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的fcntl()和select()(請讀者先復習第6章中的相關(guān)內(nèi)容)。可以看到,由于在Linux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。

1.fcntl()

函數(shù)fcntl()針對socket編程提供了如下的編程特性。

n 非阻塞I/O:可將cmd設(shè)置為F_SETFL,將lock設(shè)置為O_NONBLOCK。

n 異步I/O:可將cmd設(shè)置為F_SETFL,將lock設(shè)置為O_ASYNC。

下面是用fcntl()將套接字設(shè)置為非阻塞I/O的實例代碼:

/*net_fcntl.c*/

#include<sys/types.h>

#include<sys/socket.h>

#include<sys/wait.h>

#include<stdio.h>

#include<stdlib.h>

#include<errno.h>

#include<string.h>

#include<sys/un.h>

#include<sys/time.h>

#include<sys/ioctl.h>

#include<unistd.h>

#include<netinet/in.h>

#include<fcntl.h>

#definePORT1234

#defineMAX_QUE_CONN_NM5

#defineBUFFER_SIZE1024

intmain()

{

structsockaddr_inserver_sockaddr,client_sockaddr;

intsin_size,recvbytes,flags;

intsockfd,client_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)用fcntl()函數(shù)給套接字設(shè)置非阻塞屬性*/

flags=fcntl(sockfd,F_GETFL);

if(flags<0||fcntl(sockfd,F_SETFL,flags|O_NONBLOCK)<0)

{

perror("fcntl");

exit(1);

}

while(1)

{

sin_size=sizeof(structsockaddr_in);

if((client_fd=accept(sockfd,

(structsockaddr*)&client_sockaddr,&sin_size))<0)

{

perror("accept");

exit(1);

}

if((recvbytes=recv(client_fd,buf,BUFFER_SIZE,0))<0)

{

perror("recv");

exit(1);

}

printf("Receivedamessage:%s\n",buf);

}/*while*/

close(client_fd);

exit(1);

}

運行該程序,結(jié)果如下所示:

$./net_fcntl

Listening....

accept:Resourcetemporarilyunavailable

可以看到,當accept()的資源不可用(沒有任何未處理的等待連接的請求)時,程序就會自動返回。

2.select()

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

/*net_select.c*/

#include<sys/types.h>

#include<sys/socket.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/time.h>

#include<sys/ioctl.h>

#include<unistd.h>

#include<netinet/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;fd<MAX_SOCK_FD;fd++)

{

if(FD_ISSET(fd,&tmp_inset)>0)

{

if(fd==sockfd)

{/*服務(wù)端接收客戶端的連接請求*/

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:%s\n",

client_fd,buf);

}

else

{

close(fd);

FD_CLR(fd,&inset);

printf("Client%d(socket)hasleft\n",fd);

}

}

}/*endofifFD_ISSET*/

}/*endofforfd*/

}/*endifwhilewhile*/

close(sockfd);

exit(0);

}

運行該程序時,可以先啟動服務(wù)器端,再反復運行客戶端程序(這里啟動兩個客戶端進程)即可,服務(wù)器端運行結(jié)果如下所示:

$./server

listening....

Newconnectionfrom4(socket)/*接受第一個客戶端的連接請求*/

Receivedamessagefrom4:Hello,First!/*接收第一個客戶端發(fā)送的數(shù)據(jù)*/

Newconnectionfrom5(socket)/*接受第二個客戶端的連接請求*/

Receivedamessagefrom5:Hello,Second!/*接收第二個客戶端發(fā)送的數(shù)據(jù)*/

Client4(socket)hasleft/*檢測到第一個客戶端離線了*/

Client5(socket)hasleft/*檢測到第二個客戶端離線了*/

$./clientlocalhostHello,First!&./clientlocalhostHello,Second

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

北京 2025年7月3日 /美通社/ -- 近日,北京積算科技有限公司(以下簡稱"積算科技")正式推出GPU裸金屬算力服務(wù)套件,幫助客戶實現(xiàn)并行環(huán)境的分鐘級部署與出廠級性能校準,在GPU裸金屬算力上...

關(guān)鍵字: 金屬 GPU 性能優(yōu)化 操作系統(tǒng)

上海 2025年5月20日 /美通社/ -- 2025年5月15日至18日,全球神經(jīng)介入領(lǐng)域頂級盛會——世界神經(jīng)介入治療大會(WLNC)暨東方腦血管病大會(OCIN)于上海國際會議中心隆重舉行,吸引了來自全球神經(jīng)介入領(lǐng)...

關(guān)鍵字: 機器人 VI AN 操作系統(tǒng)

Docker 是一種基于操作系統(tǒng)層級的虛擬化技術(shù),它將軟件及其依賴項打包為容器,使得應(yīng)用程序可以在任何支持 Docker 的環(huán)境中運行。

關(guān)鍵字: Docker 操作系統(tǒng)

北京2025年2月28日 /美通社/ -- 日前,《服務(wù)器操作系統(tǒng)遷移指南》(以下簡稱《指南》)經(jīng)中國電子工業(yè)標準化技術(shù)協(xié)會批準后正式發(fā)布,將于3月正式實施。《指南》由浪潮信息牽頭,中國電子技術(shù)標準化研究院、阿里云、統(tǒng)信...

關(guān)鍵字: 操作系統(tǒng) 編寫 CPU 內(nèi)存

業(yè)界最真實、最互聯(lián)、最具未來性的操作系統(tǒng)變得更智能、更快速、更敏銳 紐約2025年1月30日 ?/PRNewswire/ -- Stagwell(納斯達克股票代碼:STGW...

關(guān)鍵字: ASSEMBLY STAGE AI 操作系統(tǒng)

在Linux操作系統(tǒng)中,文件操作是進程與存儲系統(tǒng)交互的重要方式。對于同一個文件,一個進程是否可以在其生命周期內(nèi)多次調(diào)用open函數(shù)打開它,并進行讀寫操作呢?答案是肯定的。本文將深入探討這一機制,并通過代碼示例展示如何在進...

關(guān)鍵字: 文件 Linux 操作系統(tǒng)

北京2025年1月20日 /美通社/ -- 近日,微展世(北京)數(shù)字科技有限公司(簡稱"微展世")在北京成功舉辦了2025產(chǎn)品發(fā)布與戰(zhàn)略簽約盛典。作為微展世的重要戰(zhàn)略合作伙伴,軟通動力及其子公司鴻湖萬...

關(guān)鍵字: 開源 操作系統(tǒng) 鴻蒙 OS

北京2025年1月16日 /美通社/ -- 軟硬一體具身智能人形機器人是未來智能產(chǎn)業(yè)的重大機遇,大模型智能體應(yīng)用在千行百業(yè)深入廣泛推進,世界模型、具身智能也正加快從實驗室走向場景應(yīng)用和商業(yè)落地。軟通動力聚焦人形機器人場景...

關(guān)鍵字: 機器人 模型 智能計算 操作系統(tǒng)

拉斯維加斯2025年1月11日 /美通社/ -- 2025年1月8日,于拉斯維加斯舉辦的消費電子展(CES)上,全球AI跨語言溝通設(shè)備領(lǐng)導品牌時空壺,正式發(fā)布Timekett...

關(guān)鍵字: 操作系統(tǒng) BLE OS CE

以開源鴻蒙賦能工業(yè)創(chuàng)新升級 北京2025年1月10日 /美通社/ -- 1月7日,軟通動力攜子公司鴻湖萬聯(lián),與微展世(北京)數(shù)字科技有限公司(簡稱"微展世")在廣州簽署戰(zhàn)略合作協(xié)議,三方將聯(lián)合開發(fā)基...

關(guān)鍵字: 操作系統(tǒng) 開源 數(shù)字化 OS
關(guān)閉