2022-4-16 splice实现回射服务器《Linux高性能服务器笔记》
服务端
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/sendfile.h>
//ssize_t splice(int fd_in, loff_t *off_in, int fd_out,
// loff_t *off_out, size_t len, unsigned int flags);
int main(void){//1.连接到客户端struct sockaddr_in address;bzero(&address,sizeof(address));address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(9999);int sock = socket(AF_INET,SOCK_STREAM,0);if(sock == -1){perror("socket");return -1;}//2.绑定地址int ret = bind(sock,(struct sockaddr*)&address,sizeof(address));if(ret == -1){perror("bind");return -1;}//3.监听ret = listen(sock,5);if(ret == -1){perror("listen");return -1;}struct sockaddr_in client;socklen_t client_addrlength = sizeof(client);int connfd = accept(sock,(struct sockaddr*)&client,&client_addrlength);//检测是否连接到客户端if(connfd == -1){perror("connect");return -1;}else {char clientIP[16];inet_ntop(AF_INET,&client.sin_addr.s_addr,clientIP,sizeof(clientIP));unsigned short port = ntohs(client.sin_port);printf("client's ip is %s,port is %d.\n",clientIP,port);int pipefd[2];ret = pipe(pipefd);ret = splice(connfd,NULL,pipefd[1],NULL,32768,SPLICE_F_MORE|SPLICE_F_MOVE);if(ret == -1){perror("splice1");return -1;}ret = splice(pipefd[0],NULL,connfd,NULL,32768,SPLICE_F_MORE|SPLICE_F_MOVE);if(ret == -1){perror("splice2");return -1;}close(connfd);}close(sock);return 0;
}
客户端
//tcp 通信客户端
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>int main(void){//1.创建套接字int fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(0);}//2.连接服务器端struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;inet_pton(AF_INET,"192.168.131.136",&serveraddr.sin_addr.s_addr);serveraddr.sin_port = htons(9999);int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));if(ret == -1){perror("connect");exit(0);}//3.通信char *data = "hello , i am client.";write(fd,data,strlen(data));char recvBuf[1024] = {0}; while(read(fd,recvBuf,sizeof(recvBuf)) > 0){printf("recv data :%s\n",recvBuf);}// int len2 = read(fd,recvBuf,sizeof(recvBuf));// if (len2 == -1)// {// perror("read");// exit(-1);// }// else if(len2 > 0){// printf("recv client data : %s\n",recvBuf);// }else if(len2 == 0){// //表示服务端断开连接// printf("server closed.\n");// }close(fd);return 0;
}
服务端返回
客户端返回
2022-4-16 splice实现回射服务器《Linux高性能服务器笔记》相关推荐
- Linux高性能服务器编程——书籍阅读笔记
目录 前言 正文 第一章 1. 零拷贝函数 2. TCP/IP协议族 3. OSPF 4. ARP协议 5. RARP 6. ICMP协议 7. TCP协议 8. UDP协议 9. 封装 第四章 TC ...
- Linux 高性能服务器网络编程(一)
Linux 高性能服务器网络编程 Linux网络编程基础API Socket 地址API 通用socket 地址 专用Sokect地址 IP地址转换函数 创建socket(socket) 命名(绑定) ...
- Linux 高性能服务器开发笔记:Reactor 模型定时器 | 网络编程定时器
本文主要根据游双书本 Linux 高性能服务器开发 学习分析 linux 网络编程常用到的定时器模型,配备详细理解和分析,同时分析了 Linux 内核中定时器的低精度时间轮和高精度定时器实现思路还有 ...
- 《Linux高性能服务器编程》——导读
前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...
- 《Linux高性能服务器编程》学习笔记
<Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条 ...
- 【Todo】【读书笔记】Linux高性能服务器编程
在读 /Users/baidu/Documents/Data/Interview/服务器-检索端/<Linux高性能服务器编程.pdf> 其实之前读过,要面试了,需要温习. P260 So ...
- Linux高性能服务器开发——进程篇
本文主要是学习Linux高性能服务器开发需要提前了解的知识,后续还会涉及到虚拟内存方面的内容,各位看官可以多了解了解,看到文章内有将的不清楚或者讲错的地方请各位一定留言,我看到后会第一时间验证并修正的 ...
- Linux高性能服务器架构
1. 概述: 任何一行都有自己的军规, 我想这篇著名的文章就是游戏服务器程序员的军规. 也许你认为游戏服务器程序员日常并不涉及这样底层的实现, 而只是去完成策划提出的需求, 我觉得也有道理, 毕竟这些 ...
- linux高性能服务器编程书本总结
目录 目录分析 第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型 第二篇 核心篇 5 章到 15 章节 5-6章节 主要介绍 套接字编程API的使用和介绍 7章 是linux 服 ...
最新文章
- 实现不同域(Domain)之间的数据交换(转)
- WF4.0 基础篇 (三) 流程实例WorkflowApplication与设计WF程序的基本原则
- 通过微信公众号获取用户信息(java版)
- 【⛸️拒绝手滑,我们都是稳准狠⛸️】C++のmemset函数的小探究
- oracle表名最大长度6,Oracle中表名的最大长度是多less?
- [高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板
- .vue文件_Spring Boot 2.x(十六):玩转vue文件上传
- antd 表单域验证规则 - 只能输入数字字符,去除前导0
- 1044. 火星数字(20)
- Python编程中一些异常处理的小技巧
- jquery ajax 设置header的方式
- 解决方案:秒杀整体设计
- 【Maven】maven 插件 maven-surefire-plugin
- python创意动态图片_Python趣味创意编程
- html文件是fla,FLASH 全屏、按ESC 退出全屏模式Fla及HTML源文件
- 【 PG 入门系列 】PostgreSQL的客户端工具(五)
- 手把手教你获取一年免费通配符泛域名SSL证书
- 宠物商店——三层架构
- weka+em算法+java使用_WEKA学习笔记2 - lyle_5的个人页面 - OSCHINA - 中文开源技术交流社区...
- python+selenium3登录126邮箱并发送邮件
热门文章
- 体重指数(BMI)计算器
- 量子计算机基地边缘,成都提前布局6G、量子计算、边缘计算等前沿技术
- 2014年大学专业就业前景分析 -【计算机科学与技术专业】
- 6月项目总结--浅尝jsp(官网优化),移动端Echarts,mescroll试水,树形插件bootstrap-treeview
- ffmepg把PCM文件转换成AMR
- 人生成熟的四个重要标志
- Ubuntu学习(六)Linux安装压缩包版的软件
- mysql 8.0 解决报错Public Key Retrieval is not allowed
- oledb vc访问mdb数据库_vc实战oledb编程
- unity请求json数据并解析