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

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

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

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

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

以下是程序:

1. serevr.c

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h> #define PORT 4455
#define MAX_LEN 5 //1. 初始化socket - tcp
int init_socket()
{
//1-1. socket
int sfd = socket(AF_INET,SOCK_STREAM,);
if(sfd == -)
{
perror("socket");
exit();
}
//1-2 REUSEADDR
int val = ;
int ret = setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,(void *)&val,sizeof(val));
if(ret == -)
{
perror("setsockopt");
exit();
}
// 1-3 bind
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(PORT);
ret = bind(sfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(ret == -)
{
perror("bind");
exit();
}
// 1-4 listen
ret = listen(sfd,MAX_LEN);
if( ret == -)
{
perror("listen");
exit();
} printf("Srever is ready ...\n");
return sfd;
}
//2. 处理接收,设置为非阻塞型的
int deal_accept(int sfd)
{
// 2-1 accept
int cfd = accept(sfd,NULL,NULL);
if(cfd == -)
{
perror("accept");
exit();
}
// 2-2 获得cfd属性
int flags = fcntl(cfd,F_GETFL);
if(flags == -)
{
perror("fcntl F_GETFL");
exit();
}
// 2-2 判断flags是否具有O_NONBLOCK属性
if(!(flags&O_NONBLOCK))
{
flags |= O_NONBLOCK;
int ret = fcntl(cfd,F_SETFL,flags);
if(ret == -)
{
perror("fcntl F_SETFL");
exit();
}
}
return cfd;
} void deal_communication(int cfd)
{
char buf[] = {'\0'};
while()
{
memset(buf,'\0',sizeof(buf));
recv(cfd,buf,sizeof(buf),);
printf("client say : %s\n",buf);
if(strncmp(buf,"quit",) == ) break;
sleep();
}
return ;
} int main()
{
//1. 初始化socket - tcp
int sfd = init_socket();
//2. 处理接收,设置为非阻塞型的
int cfd = deal_accept(sfd);
//3. 通信
deal_communication(cfd);
return ;
}

2. client.c

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h> #define IP "127.0.0.1"
#define PORT 4455
//1. 初始化socket
int init_socket()
{
// 1-1 socket
int sfd = socket(AF_INET,SOCK_STREAM,);
if(- == sfd )
{
perror("socket");
exit();
}
// 1-2 connect
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(IP);
saddr.sin_port = htons(PORT);
int ret = connect(sfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(- == ret )
{
perror("connect");
exit();
} return sfd;
} void deal_communication(int sfd)
{
char buf[] = {'\0'};
while()
{
memset(buf,'\0',sizeof(buf));
printf("请输入:");
scanf("%s",buf);
send(sfd,buf,strlen(buf),);
printf("client say :%s\n",buf);
if(strncmp("quit",buf,) == )
break;
}
return ;
} int main()
{
//1. 初始化socket
int sfd = init_socket();
//2. 通信
deal_communication(sfd);
return ;
}

实现socket非阻塞设置的更多相关文章

  1. 看到关于socket非阻塞模式设置方式记录一下。

    关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...

  2. linux 客户端 Socket 非阻塞connect编程

    开发测试环境:虚拟机CentOS,windows网络调试助手        非阻塞模式有3种用途        1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...

  3. Java NIO Socket 非阻塞通信

    相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...

  4. NIO Socket非阻塞模式

    NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...

  5. python socket非阻塞及python队列Queue

    一. python非阻塞编程的settimeout与setblocking+select 原文:www.th7.cn/Program/Python/201406/214922.shtml 侧面认证Py ...

  6. Tcp Socket非阻塞recv

    最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...

  7. UNIX环境高级编程——非阻塞设置

    非阻塞I/O使我们可以调用open.read和write这样的I/O操作,并使这些操作不会永远阻塞.如果这种操作不能完成, 则调用立即出错返回,表示该操作如继续执行将阻塞. 对于一个给定的描述符有两种 ...

  8. Linux 网络编程七(非阻塞socket:epoll--select)

    阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...

  9. 面向连接的socket数据处理过程以及非阻塞connect问题

    对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后 ...

随机推荐

  1. 使用gulp将移动端px转为rem

    使用gulp的插件可以很方便的将xp转为rem,在布局的时候使用@1x .@2x布局,即10rem=device-width:@1x即设计图为320px,1rem对应的10px像素,相对的@2x即为布 ...

  2. HTML 学习笔记 JavaScript (实现)

    HTML中的脚本 必须位于<script></script>标签之间 脚本可被放置在HTML页面的<body>和<head>部分中 <script ...

  3. IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

    WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...

  4. Linux commands frequently used

    touch <filename>.sh gedit <filename>.sh bash <filename>.sh & ps auxw|grep < ...

  5. 046医疗项目-模块四:采购单模块—采购单审核(Dao,Service,Action三层)

    当医院把采购单提交之后,由监管单位进行采购单审核,由卫生院及卫生局进行审核.卫生局可以审核所有医院创建的采购单,卫生院只审核本辖区医院创建的采购单. 操作流程: 点击"采购单审核" ...

  6. 安装Docker Toolbox后出现的问题

    Installing Docker Toolbox on Windows with Hyper-V Installed Installing Docker on Windows is a fairly ...

  7. SharePoint GroupedItemPicker Control

    这个控件SharePoint用来选择Field ,和Content Type, 以下是一个完整的示例. <SharePoint:GroupedItemPicker ID="Select ...

  8. Java的注解(Annotation)

    1.什么是注解 Annotation is code about the code, that is metadata about the program itself. Java注解,是Java5. ...

  9. Working Set缓存算法(转)

    为了加深对缓存算法的理解,特转此篇,又由于本文内容过多,故不做翻译,原文地址Working Set页面置换算法 In the purest form of paging, processes are ...

  10. 【转】加快网站访问速度——Yslow极限优化

    Yslow是一套雅虎的网页评分系统,详细的列出了各项影响网页载入速度的参数,这里不做多说. 我之前就一直参考Yslow做博客优化,经过长时间的学习也算是有所收获,小博的YslowV2分数达到了94分( ...