资料介绍
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次下载 | 免费
评论
查看更多