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

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

网络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. 程序Bug---易错点

    只有当图像与HTML文档在同一目录时,才能用相对地址显示.

  2. CF#345 (Div1)

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  3. linux运维中的命令梳理(二)

    回想起来,从事linux运维工作已近5年之久了,日常工作中会用到很多常规命令,之前简单罗列了一些命令:http://www.cnblogs.com/kevingrace/p/5985486.html今 ...

  4. Resample the mask

    我们所用功能像和mask的size不同时,我们首先要对mask进行resample,令其和功能像的size相同才可以. 根据严超赣老师的回复,有三种方法:http://restfmri.net/for ...

  5. Integer.valueof(null)报错

    原文  http://javacat360.iteye.com/blog/2024378 主题 Java 昨天,一同事问我一个问题,估计是他前段日子面试遇到的 问题很简单,String.valueof ...

  6. javascript:查找“跳号”号码

    业务背景:航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的 ...

  7. unix环境高级编程基础知识之第一篇

    陆陆续续看完了圣经第一章,熟悉了unix的整个编程流程,c语言的用处在这里得到伸张. 从unix的体系结构,原来操作系统包括内核及一些其他软件,我们常常误称为linux内核为操作系统,这俨然成为一种共 ...

  8. Spring IOC 源码浅析

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  9. hbase-site.xml 配置详解

    hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完全正确'的,还要包含文件系统的scheme.例如,要表示hdfs中的'/hbase'目 ...

  10. Lucene.Net的服务器封装+APi组件 (开源)

    为什么要封装 真不知道用什么标题合适,我这几天在研究Lucene.Net,觉得把Lucene.Net封装为一个独立的服务器,再提供一个给客户端调用的Api组件应该是一件很意思的事,主要优势有以下: 1 ...