資料介紹
? 10.3 網(wǎng)絡高級編程
在實際情況中,人們往往遇到多個客戶端連接服務器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的fcntl()和select()(請讀者先復習第6章中的相關內(nèi)容)。可以看到,由于在Linux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。
1.fcntl()
函數(shù)fcntl()針對socket編程提供了如下的編程特性。
n 非阻塞I/O:可將cmd設置為F_SETFL,將lock設置為O_NONBLOCK。
n 異步I/O:可將cmd設置為F_SETFL,將lock設置為O_ASYNC。
下面是用fcntl()將套接字設置為非阻塞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》
#define PORT 1234
#define MAX_QUE_CONN_NM 5
#define BUFFER_SIZE 1024
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes, flags;
int sockfd, client_fd;
char buf[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);
int i = 1;/* 允許重復使用本地地址與套接字進行綁定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if (bind(sockfd, (struct sockaddr *)&server_sockaddr,
sizeof(struct sockaddr)) == -1)
{
perror(“bind”);
exit(1);
}
if(listen(sockfd,MAX_QUE_CONN_NM) == -1)
{
perror(“l(fā)isten”);
exit(1);
}
printf(“Listening.。..\n”);
/* 調(diào)用fcntl()函數(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(struct sockaddr_in);
if ((client_fd = accept(sockfd,
(struct sockaddr*)&client_sockaddr, &sin_size)) 《 0)
{
perror(“accept”);
exit(1);
}
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) 《 0)
{
perror(“recv”);
exit(1);
}
printf(“Received a message: %s\n”, buf);
} /*while*/
close(client_fd);
exit(1);
}
運行該程序,結果如下所示:
$ 。/net_fcntl
Listening.。..
accept: Resource temporarily unavailable
可以看到,當accept()的資源不可用(沒有任何未處理的等待連接的
在實際情況中,人們往往遇到多個客戶端連接服務器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數(shù),如果資源沒有準備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),這樣就無法處理I/O多路復用的情況了。本節(jié)給出了兩種解決I/O多路復用的解決方法,這兩個函數(shù)都是之前學過的fcntl()和select()(請讀者先復習第6章中的相關內(nèi)容)。可以看到,由于在Linux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。
1.fcntl()
函數(shù)fcntl()針對socket編程提供了如下的編程特性。
n 非阻塞I/O:可將cmd設置為F_SETFL,將lock設置為O_NONBLOCK。
n 異步I/O:可將cmd設置為F_SETFL,將lock設置為O_ASYNC。
下面是用fcntl()將套接字設置為非阻塞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》
#define PORT 1234
#define MAX_QUE_CONN_NM 5
#define BUFFER_SIZE 1024
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes, flags;
int sockfd, client_fd;
char buf[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);
int i = 1;/* 允許重復使用本地地址與套接字進行綁定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if (bind(sockfd, (struct sockaddr *)&server_sockaddr,
sizeof(struct sockaddr)) == -1)
{
perror(“bind”);
exit(1);
}
if(listen(sockfd,MAX_QUE_CONN_NM) == -1)
{
perror(“l(fā)isten”);
exit(1);
}
printf(“Listening.。..\n”);
/* 調(diào)用fcntl()函數(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(struct sockaddr_in);
if ((client_fd = accept(sockfd,
(struct sockaddr*)&client_sockaddr, &sin_size)) 《 0)
{
perror(“accept”);
exit(1);
}
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) 《 0)
{
perror(“recv”);
exit(1);
}
printf(“Received a message: %s\n”, buf);
} /*while*/
close(client_fd);
exit(1);
}
運行該程序,結果如下所示:
$ 。/net_fcntl
Listening.。..
accept: Resource temporarily unavailable
可以看到,當accept()的資源不可用(沒有任何未處理的等待連接的
網(wǎng)絡高級編程
加入交流群
掃碼添加小助手
加入工程師交流群
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C++ Socket網(wǎng)絡編程大全源代碼下載 27次下載
- Socket網(wǎng)絡基礎編程 3次下載
- vc-網(wǎng)絡編程(socket)詳解 0次下載
- Windows-Socket-網(wǎng)絡編程詳解 0次下載
- Windows Socket網(wǎng)絡編程(二) —套接字編程原理 0次下載
- Socket網(wǎng)絡編程 0次下載
- TCP-IP_Socket網(wǎng)絡編程 0次下載
- Linux下基于Socket的網(wǎng)絡編程 0次下載
- Linux-socket網(wǎng)絡編程 0次下載
- Linux下Socket網(wǎng)絡編程 0次下載
- linux-socket網(wǎng)絡編程詳解 0次下載
- linux-網(wǎng)絡編程-socket編程 0次下載
- 基于Socket網(wǎng)絡編程的遠程物流防偽系統(tǒng)的設計 28次下載
- 基于Linux的Socket網(wǎng)絡編程的性能優(yōu)化
- 基于UDP協(xié)議的Socket網(wǎng)絡編程模式的實現(xiàn)
- 【AI技術支持】ESP8684-WROOM-01C模組socket綁定失敗問題處理 1.3k次閱讀
- socket 客戶端與服務器的實現(xiàn) 1.2k次閱讀
- socket 發(fā)送和接收數(shù)據(jù)方法 2.6k次閱讀
- socket 網(wǎng)絡通信協(xié)議解析 6.8k次閱讀
- socket 編程基礎入門 1.8k次閱讀
- C語言中的socket編程基礎 2k次閱讀
- 如何在Python中使用socket 1.1k次閱讀
- KUKA機器人socket通訊配置方法 4.1k次閱讀
- 工業(yè)樹莓派的Socket通信之旅:探索智能工業(yè)應用的無限可能 1.4k次閱讀
- TCP和UDP的通信詳細資料總結 3.6k次閱讀
- 網(wǎng)絡編程你有沒有理解的透徹 1.8k次閱讀
- 一切皆Socket!Socket是什么? 5.8k次閱讀
- 網(wǎng)絡數(shù)據(jù)傳輸socket和http優(yōu)缺點 3w次閱讀
- udp和tcp的區(qū)別在哪里 9k次閱讀
- 基于CompactRIO的高級可編程自動控制器 3k次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關型降壓3.5A單節(jié)鋰電池充電管理電路技術手冊
- 0.74 MB | 1次下載 | 免費
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產(chǎn)品手冊
- 0.43 MB | 1次下載 | 免費
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創(chuàng)新應用
- 3.11 MB | 43次下載 | 免費
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構、3路千兆網(wǎng),賦能多元化工業(yè)場景
- 3.05 MB | 12次下載 | 免費
- 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學習資源包
- 10.55 MB | 8次下載 | 免費
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論