实现socket非阻塞设置

摘要:
刚开始学习,难免有些疏漏之处,请各位多多指教。程序亲测可以使用。网络IO模型分为阻塞IO、非阻塞IO、异步IO、IO复用、信号驱动IO。

刚开始学习,难免有些疏漏之处,请各位多多指教。

程序亲测可以使用。废话不多说。

网络IO模型分为阻塞IO、非阻塞IO、异步IO、IO复用、信号驱动IO。

阻塞IO: 有数据时,直接读;没有数据时,等待读。

非阻塞IO: 无论内核有没有数据都读。

以下是程序:

1. serevr.c

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 
6 #include <sys/types.h>    
7 #include <sys/socket.h>
8 #include <netinet/in.h>
9 #include <arpa/inet.h>
10 #include <sys/stat.h>
11 #include <fcntl.h>
12 
13 
14 
15 #define PORT 4455
16 #define MAX_LEN 5
17 
18 //1. 初始化socket  -  tcp
19 intinit_socket()
20 {
21     //1-1. socket
22     int sfd = socket(AF_INET,SOCK_STREAM,0);
23     if(sfd == -1)
24 {
25         perror("socket");
26         exit(1);
27 }
28     //1-2 REUSEADDR
29     int val = 1;
30     int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(val));
31     if(ret == -1)
32 {
33         perror("setsockopt");
34         exit(1);
35 }
36     //1-3 bind
37     structsockaddr_in saddr;
38     saddr.sin_family =AF_INET;
39     saddr.sin_addr.s_addr =INADDR_ANY;
40     saddr.sin_port =htons(PORT); 
41     ret = bind(sfd,(struct sockaddr *)&saddr,sizeof(saddr));
42     if(ret == -1)
43 {
44         perror("bind");
45         exit(1);
46 }
47     //1-4 listen
48     ret =listen(sfd,MAX_LEN);
49     if( ret == -1)
50 {
51         perror("listen");
52         exit(1);
53 }
54     
55     printf("Srever is ready ...
");
56     returnsfd;
57 }
58 //2. 处理接收,设置为非阻塞型的
59 int deal_accept(intsfd)
60 {
61     //2-1 accept
62     int cfd =accept(sfd,NULL,NULL);
63     if(cfd == -1)
64 {
65         perror("accept");
66         exit(1);
67 }
68     //2-2 获得cfd属性
69     int flags =fcntl(cfd,F_GETFL);
70     if(flags == -1)
71 {
72         perror("fcntl F_GETFL");
73         exit(1);
74 }
75     //2-2 判断flags是否具有O_NONBLOCK属性
76     if(!(flags&O_NONBLOCK))
77 {
78         flags |=O_NONBLOCK;
79         int ret =fcntl(cfd,F_SETFL,flags);
80         if(ret == -1)
81 {
82             perror("fcntl F_SETFL");
83             exit(1);
84 }
85 }
86     returncfd;
87 }
88 
89 void deal_communication(intcfd)
90 {
91     char buf[64] = {'

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[Paddle学习笔记][05][对抗生成网络]Google 74版本上传附件没有“选择文件”按钮下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UCOSIII任务创建

UCOSIII任务创建: 首先要确保UCOSIII移植成功; 一般以下几个步骤就行了: 第一步:写好任务所需的 优先级、堆栈、控制块等; 然后顺便声明下任务函数; 第二步:开始创建函数 源码: 1 #include "led.h" 2 #include "delay.h" 3 #include "sys.h" 4 #include "usart.h"...

java进程间通信

Java进程间通信可以采用的办法: Socket/RMI/WEBService/WebServer, 这些都可以实现直接的数据交换 Database/File, 这些可以实现间接的数据交换   看你的业务是否要求实时, 如果不需要, 用数据库交换比较简单  除了Socket之外,当然首选的IPC可以使用RMI,或者CORBA也可以。其实JAVA的CORB...

树形DP+RMQ+单调队列(Bob’s Race HDU4123)

题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q,这些运行员的起点房间编号都是连续的,问最多可以选择多少个运动员跑步? 分析:就是给出一颗树形图,先用dp求出每个点所能经过的最远距离,然后用rmq求区间最值,...

linux系统监控示例:vmstat

一。基础演示: [nwom@WLAN-linux-3 ~]$ vmstat -n 2 10 ([nwom@WLAN-linux-3~]vmstat –n 2 10 以每2秒钟的频率执行10次取样) procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----...

标准Socket与Delphi中的Socket

标准的Socket的应用程序框架如下:Server方: Socket()[ 新建一个Socket]--Bind()[ 同服务器地址邦定 ]--Listen() --Accept()--block wait--read()[接受消息,在windows平台中,方法为send(TCP),或者是sendto(UDP)]--处理服务请求--Write()[发送消息,...

反弹shell的各种姿势

在渗透过程中,往往因为端口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入。 反弹shell是打开内网通道的第一步,也是权限提升过程中至关重要的一步。本文所有姿势整理自网络,并基于同一个假设的前提下完成测试和验证。(假设:攻击者主机为:192.168.99.242,本地监听1234端口,如有特殊情况以下会备注说明。...