socket网络编程-----I/O复用之poll函数
#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/poll.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));
} struct pollfd fds[];
fds[].fd=;
fds[].fd=acceptfd;
fds[].events=POLLIN|POLLOUT;
fds[].events=POLLIN|POLLOUT;
while()
{
ret=poll(fds, , -);
if(ret<)
{
perror("poll");
continue;
}
if(fds[].revents&POLLIN)
{
ret=rw_opt(, acceptfd);
if(ret == )
break;
}
if(fds[].revents&POLLIN)
{
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/poll.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 ;
} struct pollfd fds[];
fds[].fd=;
fds[].fd=sockfd;
fds[].events=POLLIN|POLLOUT;
fds[].events=POLLIN|POLLOUT; while()
{
ret=poll(fds, , -);
if(ret<)
{
perror("poll");
continue;
}
if(fds[].revents&POLLIN)
{
ret=rw_opt(,sockfd);
if(ret == )
break;
}
if(fds[].revents&POLLIN)
{
ret=rw_opt(sockfd, );
if(ret == )
break;
}
}
close(sockfd);
return ;
}
cli.c
socket网络编程-----I/O复用之poll函数的更多相关文章
- Linux网络编程——I/O复用之poll函数
一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...
- socket网络编程-----I/O复用之select函数
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...
- Linux网络编程——tcp并发服务器(poll实现)
想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...
- Socket网络编程--聊天程序(9)
这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...
- Socket网络编程-IO各种概念及多路复用
Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步 函数或方法被调用的时候,调用者是否得到最 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 项目总结——深入浅出socket网络编程
前言: 为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求. 首先大家应该明确的是s ...
- windows socket 网络编程
样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...
- SOCKET网络编程细节问题1
SOCKET网络编程快速上手(二)——细节问题(1) 三.细节问题一个也不能少 Socket编程说简单也简单,程序很容易就能跑起来,说麻烦还真是麻烦,程序动不动就出问题.记得刚开始写网络代码的时候,那 ...
随机推荐
- JAVA写接口傻瓜(#)教程(四)
接上篇 7.sevlert 啊啊啊终于写到最重要的实现部分了.Servlet = Service + Applet,表示小服务程序.Servlet 是在服务器上运行的小程序.这个词是在 Java ap ...
- nginx日志相关运维操作记录
在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计. 1)Nginx日志的标准格式(可参考: ...
- 缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props。
报错信息: 严重性 代码 说明 项目级别 文件 行 禁止显示状态 工具错误 这台计算机上缺少此项目引用的 NuGet 程序包.使用“NuGet 程序包还原”可下载这些程序包.有关更多信息,请参见 ht ...
- 解决MySQL数据库连接太多,多数Sleep
1.查看当前所有连接的详细资料: mysqladmin -uroot -proot processlist 客户端使用: show full processlist 2.只查看当前连接数(Thread ...
- 【lintcode】 二分法总结 I
二分法:通过O(1)的时间,把规模为n的问题变为n/2.T(n) = T(n/2) + O(1) = O(logn). 基本操作:把长度为n的数组,分成前区间和后区间.设置start和end下标.i ...
- angular ,require.js, angular-async-loader实现单页面路由,控制器js文件分离
https://github.com/heboliufengjie/appRoute/tree/re re 分支,实现,路由配置,控制器js文件分离
- 总结get和post区别---面试用
总结get和post区别---面试用 我是搬运工!!!! get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比p ...
- 关于FFmpeg工具的使用总结
FFmpeg官网:http://ffmpeg.org/ 安装ffmpeg: http://www.cnblogs.com/freeweb/p/6897907.html 主要参数: -i 设定输入流 - ...
- Java抽象类总结规定
1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. 3. 抽 ...
- vue跳坑笔记
序号 报错截图 关键词 解决办法 1 - code EPERM errno 4048 syscall scandir operation not permitted 清除npm缓存,命令: npm c ...