实现socket非阻塞设置
刚开始学习,难免有些疏漏之处,请各位多多指教。
程序亲测可以使用。废话不多说。
网络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非阻塞设置的更多相关文章
- 看到关于socket非阻塞模式设置方式记录一下。
关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接 ...
- linux 客户端 Socket 非阻塞connect编程
开发测试环境:虚拟机CentOS,windows网络调试助手 非阻塞模式有3种用途 1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...
- Java NIO Socket 非阻塞通信
相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...
- NIO Socket非阻塞模式
NIO主要原理和适用 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事件发生时,他会通知我们 ...
- python socket非阻塞及python队列Queue
一. python非阻塞编程的settimeout与setblocking+select 原文:www.th7.cn/Program/Python/201406/214922.shtml 侧面认证Py ...
- Tcp Socket非阻塞recv
最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...
- UNIX环境高级编程——非阻塞设置
非阻塞I/O使我们可以调用open.read和write这样的I/O操作,并使这些操作不会永远阻塞.如果这种操作不能完成, 则调用立即出错返回,表示该操作如继续执行将阻塞. 对于一个给定的描述符有两种 ...
- Linux 网络编程七(非阻塞socket:epoll--select)
阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...
- 面向连接的socket数据处理过程以及非阻塞connect问题
对于面向连接的socket类型(SOCK_STREAM,SOCK_SEQPACKET)在读写数据之前必须建立连接,首先服务器端socket必须在一个客户端知道的地址进行监听,也就是创建socket之后 ...
随机推荐
- 一个App需要的东西
1.短信申请平台 (发送验证码需要的短信) http://www.yuntongxun.com/api/sms?nl=sy_cp 容联云通讯
- lua 模块与环境
编写一个模块的最简单方法: -- complex.lua -- 模块实际上是一个表 complex = {} -- 定义模块函数 function complex.add(c1,c2) ... end ...
- sg函数与博弈论
这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...
- 浅析MySQL数据碎片的产生(data free)
浅析MySQL数据碎片的产生 2011-03-30 09:28 核子可乐译 51CTO 字号:T | T MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生 ...
- MVC HTTP 错误 403.14 - Forbidden
HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 最可能的原因: 没有为请求的 URL 配置默认文档,并且没有在服务器上启用目录浏览. 可尝试的操作: ...
- [资料]自动化e2e测试 -- WebDriverJS,Jasmine和Protractor
1. http://sentsin.com/web/658.html 2. http://www.tuicool.com/articles/AnE3Mb 3. http://www.doc88.com ...
- mybatis 3.2.8 + log4j2.0.2 控制台输出sql语句
mybatis3.2.7有一个bug,使用log4j2 (2.0.2)版本时,会找不到类 ,导致启动失败,详见 https://github.com/mybatis/mybatis-3/issues/ ...
- SQLServer 分布式查询MySQL
这学期开了分布式数据库这门课,开始编程实现,今天调试了一早上,写下此配置文件方便查询. 本文实现的是SQLServer2008 Express 链式添加MySql-5.6.10数据库,进行远程操作. ...
- Java调用C/C++编写的第三方dll动态链接库(zz)
这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...
- QTableView 添加进度条
记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 要在.pro文件里添加 CONFIG += c++ ProgressBarDeleg ...