实现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之后 ...
随机推荐
- 字符串截取函数substr()
substr(参数1,参数2[,参数3]); 该系统函数返回被截后的子字符串,它接受2个必选参数,参数1为要截取的字符串,参数2为截取的开始位置,参数3可选,表示截取长度. 例子:substr(&qu ...
- window对象的screen详解
screen.availHeight 返回屏幕的高度(不包括Windows任务栏)screen.availWidth 返回屏幕的宽度(不包括Windows任务栏)screen.colo ...
- 关于a标签和submit标签
a如果没有连接“#”:“javascript:void(0)”;或“(胡乱写一堆)” 这两个标签点击都有刷新功能,所以会清空你的数据.
- Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. ...
- 产品经理技能之MRD的笔记之一
原文:http://www.woshipm.com/pmd/131946.html/comment-page-1 产品经理技能之MRD 一.MRD与BRD的不同之处 BRD:这么做有什么好处,并说明好 ...
- git 本地分支与远程分支
github上已经有master分支 和dev分支 在本地 git checkout -b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 在本地 ...
- Linux常用命令笔记
~ 我的home目录/ 系统根目录进入home目录:cd \进入跟目录:cd /Maven编译:mvn clean deploy -U -Dmaven.test.skip=true dependenc ...
- mysql ERROR 1045 (28000): Access denied for user解决方法
一 这种情况下是 root@% update mysql.user set host='%' where user='root' and host='localhost'; flush privile ...
- Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法
Visual Studio2012打开时弹出"遇到异常:这可能是由某个扩展导致的"错误的解决办法: 具体问题如下: 分析原因:网上搜集了以下,出现异常的原因是安装了第三方控件,然后 ...
- 我的 GitHub 100 连击
终于达成 gayhub 的第一个100连击了,感觉自己整个人颜色都不一样了,完全蜕变了. PS: GitHub 汉化插件 52cik/github-hans 感兴趣的赶紧 get 起来吧. 遇到瓶颈 ...