資料介紹
? 10.3 網絡高級編程
在實際情況中,人們往往遇到多個客戶端連接服務器端的情況。由于之前介紹的如connet()、recv()和send()等都是阻塞性函數,如果資源沒有準備好,則調用該函數的進程將進入睡眠狀態,這樣就無法處理I/O多路復用的情況了。本節給出了兩種解決I/O多路復用的解決方法,這兩個函數都是之前學過的fcntl()和select()(請讀者先復習第6章中的相關內容)。可以看到,由于在Linux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。
1.fcntl()
函數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(“listen”);
exit(1);
}
printf(“Listening.。..\n”);
/* 調用fcntl()函數給套接字設置非阻塞屬性 */
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()等都是阻塞性函數,如果資源沒有準備好,則調用該函數的進程將進入睡眠狀態,這樣就無法處理I/O多路復用的情況了。本節給出了兩種解決I/O多路復用的解決方法,這兩個函數都是之前學過的fcntl()和select()(請讀者先復習第6章中的相關內容)。可以看到,由于在Linux中把socket也作為一種特殊文件描述符,這給用戶的處理帶來了很大的方便。
1.fcntl()
函數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(“listen”);
exit(1);
}
printf(“Listening.。..\n”);
/* 調用fcntl()函數給套接字設置非阻塞屬性 */
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()的資源不可用(沒有任何未處理的等待連接的
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C++ Socket網絡編程大全源代碼下載 25次下載
- Socket網絡基礎編程 3次下載
- vc-網絡編程(socket)詳解 0次下載
- Windows-Socket-網絡編程詳解 0次下載
- Windows Socket網絡編程(二) —套接字編程原理 0次下載
- Socket網絡編程 0次下載
- TCP-IP_Socket網絡編程 0次下載
- Linux下基于Socket的網絡編程 0次下載
- Linux-socket網絡編程 0次下載
- Linux下Socket網絡編程 0次下載
- linux-socket網絡編程詳解 0次下載
- linux-網絡編程-socket編程 0次下載
- SOCKEt編程介紹 4次下載
- 基于Socket網絡編程的遠程物流防偽系統的設計 28次下載
- 基于UDP協議的Socket網絡編程模式的實現
- 簡單認識高級處理器 743次閱讀
- 工業樹莓派的Socket通信之旅:探索智能工業應用的無限可能 751次閱讀
- ABB高級編程Error Handler 780次閱讀
- 如何搭建Python編程環境 4945次閱讀
- Studio 5000高級指令FIFO的應用案例 3093次閱讀
- Socket緩存究竟如何影響TCP的性能 1580次閱讀
- 基于TCP/IP網絡協議和SOCKET接口實現組態軟件通訊模塊的設計 3738次閱讀
- TCP和UDP的通信詳細資料總結 3037次閱讀
- 網絡編程你有沒有理解的透徹 1383次閱讀
- 用Python制作編程語言的關系網絡圖 5153次閱讀
- 一切皆Socket!Socket是什么? 5215次閱讀
- S7-300編程PPT詳解 5839次閱讀
- 網絡數據傳輸socket和http優缺點 2.8w次閱讀
- udp和tcp的區別在哪里 8485次閱讀
- 基于CompactRIO的高級可編程自動控制器 2513次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多