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

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

网络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. Android应用更换package name以及ui refactoring error问题的有效解决

    package name是Android系统中为每一个应用程序分配的一个标识,每个应用的标识都必须是不同的.在应用开发过程中,有时候可能需要对package name进行修改,这里主要总结修改pack ...

  2. PAT 1019. 数字黑洞 (20)

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有"数字黑洞&qu ...

  3. Delete Node in a Linked List

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  4. js 随笔

    setInterval:即使在方法中使用了stopInterval这个方法也要执行完才会停止自行重复执行,解决:使用return false来跳出方法. JS string和num:当一个是字符串数字 ...

  5. NOI2018准备Day4

    上午9点20至11点50就做出了一道题,一个很基础的二分挡住了,原因是浮点数精度问题的处理,现在还搞不懂,为什么用double存进去两位小数过不了,用double存进去两位小数再*100再/100就能 ...

  6. SQL Server 百万级数据提高查询速度的方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  7. ubuntu 安装VmTool

    VM tools 是Vmware的一组工具.主要用于虚拟主机显示优化与调整,另外还可以方便虚拟主机与本机的交互,如允许共享文件夹,甚至可以直接从本机向虚拟主机拖放文件.鼠标无缝切换.显示分辨率调整等, ...

  8. web 前端常用组件【03】Bootstrap Multiselect

    实际的项目网站中或多或少的或用到多选框,我选用的一款是 Bootstrap Multiselect. 官方文档:http://www.kuitao8.com/demo/20140224/1/boots ...

  9. Metatable让我从心认知了Lua(相知篇)

    自从在公司和Lua第一次相遇之后,我的IT生涯从此也开启了另一个新篇... 起初并没有和Lua产生相遇时的那种电石火花般的怦然心动...但... 说实话虽然我的心没有因此触动但至少也不排斥...因为公 ...

  10. 利用uploadify+asp.net 实现大文件批量上传。

    前言 现在网上文件上传组件随便一搜都是一大堆,不过看大家一般都在用uploadify这个来上传文件.由于项目需要,我在来试了一下.因为第一次使用,也遇到了很多问题,特此记录! ------------ ...