socket网络编程-----I/O复用之select函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h> #define BUFSIZE 255 int rw_opt(int rdfd,int wdfd)
{
int num;
char buf[BUFSIZE];
memset(buf,,sizeof(buf));
num = read(rdfd,buf,sizeof(buf));
if(wdfd == )
write(,">>>",);
write(wdfd,buf,num);
if(strncmp(buf,"quit",) == )
return ;
return num;
} int main()
{
int sockfd,ret;
int acceptfd;
struct sockaddr_in s_addr;
sockfd = socket(AF_INET,SOCK_STREAM,);
if(sockfd == -)
{
printf("socket error!\n");
return ;
} memset(&s_addr,,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons();
s_addr.sin_addr.s_addr = htons(INADDR_ANY);
ret = bind(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
if(ret == -)
{
printf("bind error!\n");
return ;
} ret = listen(sockfd,);
if(ret == -)
{
printf("listen error!\n");
return ;
} int addrlen = sizeof(struct sockaddr);
acceptfd = accept(sockfd,(struct sockaddr *)&s_addr,&addrlen);
if(acceptfd == -)
{
printf("accept error!\n");
}
else
{
printf("%s-----%d\n",inet_ntoa(s_addr.sin_addr),ntohs(s_addr.sin_port));
} fd_set rdfds;
struct timeval timeout;
timeout.tv_sec = ;
timeout.tv_usec = ;
while()
{
FD_ZERO(&rdfds);
FD_SET(,&rdfds);
FD_SET(acceptfd,&rdfds);
ret = select(acceptfd+,&rdfds,NULL,NULL,&timeout);
if(ret < )
{
printf("polling Monitor failed!\n");
continue;
}
if(FD_ISSET(,&rdfds))
{
ret = rw_opt(,acceptfd);
if(ret == )
break;
}
if(FD_ISSET(acceptfd,&rdfds))
{
ret = rw_opt(acceptfd,);
if(ret == )
break;
}
}
close(acceptfd);
close(sockfd);
return ;
}
ser.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h> #define BUFSIZE 255 int rw_opt(int rdfd,int wdfd)
{
int num;
char buf[BUFSIZE];
memset(buf,,sizeof(buf));
num = read(rdfd,buf,sizeof(buf));
if(wdfd == )
write(,">>>",);
write(wdfd,buf,num);
if(strncmp(buf,"quit",) == )
return ;
return num;
} int main(int argc,char **argv)
{
int sockfd,ret;
int acceptfd;
struct sockaddr_in s_addr;
sockfd = socket(AF_INET,SOCK_STREAM,);
if(sockfd == -)
{
printf("socket error!\n");
return ;
} memset(&s_addr,,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons();
s_addr.sin_addr.s_addr = inet_addr(argv[]);
ret = connect(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
if(ret == -)
{
printf("connect error!\n");
return ;
}
fd_set rdfds;
struct timeval timeout;
timeout.tv_sec = ;
timeout.tv_usec = ; while()
{
FD_ZERO(&rdfds);
FD_SET(,&rdfds);
FD_SET(sockfd,&rdfds);
ret = select(sockfd+,&rdfds,NULL,NULL,&timeout);
if(ret < )
{
printf("polling Monitor failed!\n");
continue;
}
if(FD_ISSET(,&rdfds))
{
ret = rw_opt(,sockfd);
if(ret == )
break;
}
if(FD_ISSET(sockfd,&rdfds))
{
ret = rw_opt(sockfd,);
if(ret == )
break;
} }
close(sockfd);
return ;
}
cli.c
socket网络编程-----I/O复用之select函数的更多相关文章
- socket网络编程-----I/O复用之poll函数
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...
- UNIX网络编程——I/O复用:select和poll函数
我们看到TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题是就在客户阻塞于(标准输入上)fgets调用,服务器进程会被杀死.服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然 ...
- Linux网络编程——I/O复用之poll函数
一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Socket网络编程--聊天程序(9)
这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...
- Socket网络编程-IO各种概念及多路复用
Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步 函数或方法被调用的时候,调用者是否得到最 ...
- 网络编程-I/O复用
I/O模型 Unix下可用的I/O模型有五种: 阻塞式I/O 非阻塞式I/O I/O复用(select和poll.epoll) 信号驱动式I/O(SIGIO) 异步I/O(POSIX的aio_系列函数 ...
- 项目总结——深入浅出socket网络编程
前言: 为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求. 首先大家应该明确的是s ...
- windows socket 网络编程
样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...
随机推荐
- form表单js提交
form表单js提交 $('#form1').submit(); 延迟form表单提交 function submitcheck() { $('#light').css('display', ...
- django的CBV设计模式
一.什么的是CBV cbv是class base view的缩写,是django中基于类来设计视图函数的,我们一开始接触的这种形式----path('login',views.login),叫fbv, ...
- js统一设置富文本中的图片宽度
var txt = layedit.getContent(ieditor);//获取编辑器内的文本var regex = new RegExp('<img', 'gi');txt = txt.r ...
- MySQL安装脚本0104-亲试ok
#!/bin/bash export host_ip=192.168.7.79 export password=123456 echo '#1.取master主机ip的后三位作为master的se ...
- git之我常用的命令
撤销修改: git checkout -- file 撤销暂存区: git reset HEAD git reset HEAD file 撤销版本库:git reset --hard HEAD^回到上 ...
- 2-Reverse Integer(简单)
Description: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outp ...
- Qt UI tips
窗口居中: adjustSize(); move((availableGeometry.width() - width()) / 2, (availableGeometry.height() - h ...
- arrow function
简介 JavaScript 中,函数可以用箭头语法(”=>”)定义,有时候也叫“lambda表达式”.这种语法主要意图是定义轻量级的内联回调函数.例如: // Arrow function: [ ...
- go-ethereum源码分析 PartII 共识算法
首先从共识引擎-Engine开始记录 Engine是一个独立于具体算法的共识引擎接口 Author(header) (common.Address, error) 返回打包header对应的区块的矿工 ...
- Github 搭建 Hexo 纯静态化个人博客平台
以前一直想搭建一个属于自己的博客平台,有余种种原因一直未能实现,最近闲来无事,参照网上的教程,搭建了属于自己的博客.自己的博客网站,样式自由,不需要受限于各大平台. 本篇为从零开始的基础篇,本篇所包含 ...