服务端

#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高性能服务器笔记》相关推荐

  1. Linux高性能服务器编程——书籍阅读笔记

    目录 前言 正文 第一章 1. 零拷贝函数 2. TCP/IP协议族 3. OSPF 4. ARP协议 5. RARP 6. ICMP协议 7. TCP协议 8. UDP协议 9. 封装 第四章 TC ...

  2. Linux 高性能服务器网络编程(一)

    Linux 高性能服务器网络编程 Linux网络编程基础API Socket 地址API 通用socket 地址 专用Sokect地址 IP地址转换函数 创建socket(socket) 命名(绑定) ...

  3. Linux 高性能服务器开发笔记:Reactor 模型定时器 | 网络编程定时器

    本文主要根据游双书本 Linux 高性能服务器开发 学习分析 linux 网络编程常用到的定时器模型,配备详细理解和分析,同时分析了 Linux 内核中定时器的低精度时间轮和高精度定时器实现思路还有 ...

  4. 《Linux高性能服务器编程》——导读

    前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...

  5. 《Linux高性能服务器编程》学习笔记

    <Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...

  6. Linux 高性能服务器编程——多线程编程

    问题聚焦:     在简单地介绍线程的基本知识之后,主要讨论三个方面的内容:     1 创建线程和结束线程:     2 读取和设置线程属性:     3 线程同步方式:POSIX信号量,互斥锁和条 ...

  7. 【Todo】【读书笔记】Linux高性能服务器编程

    在读 /Users/baidu/Documents/Data/Interview/服务器-检索端/<Linux高性能服务器编程.pdf> 其实之前读过,要面试了,需要温习. P260 So ...

  8. Linux高性能服务器开发——进程篇

    本文主要是学习Linux高性能服务器开发需要提前了解的知识,后续还会涉及到虚拟内存方面的内容,各位看官可以多了解了解,看到文章内有将的不清楚或者讲错的地方请各位一定留言,我看到后会第一时间验证并修正的 ...

  9. Linux高性能服务器架构

    1. 概述: 任何一行都有自己的军规, 我想这篇著名的文章就是游戏服务器程序员的军规. 也许你认为游戏服务器程序员日常并不涉及这样底层的实现, 而只是去完成策划提出的需求, 我觉得也有道理, 毕竟这些 ...

  10. linux高性能服务器编程书本总结

    目录 目录分析 第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型 第二篇 核心篇 5 章到 15 章节 5-6章节 主要介绍 套接字编程API的使用和介绍 7章 是linux 服 ...

最新文章

  1. 实现不同域(Domain)之间的数据交换(转)
  2. WF4.0 基础篇 (三) 流程实例WorkflowApplication与设计WF程序的基本原则
  3. 通过微信公众号获取用户信息(java版)
  4. 【⛸️拒绝手滑,我们都是稳准狠⛸️】C++のmemset函数的小探究
  5. oracle表名最大长度6,Oracle中表名的最大长度是多less?
  6. [高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板
  7. .vue文件_Spring Boot 2.x(十六):玩转vue文件上传
  8. antd 表单域验证规则 - 只能输入数字字符,去除前导0
  9. 1044. 火星数字(20)
  10. Python编程中一些异常处理的小技巧
  11. jquery ajax 设置header的方式
  12. 解决方案:秒杀整体设计
  13. 【Maven】maven 插件 maven-surefire-plugin
  14. python创意动态图片_Python趣味创意编程
  15. html文件是fla,FLASH 全屏、按ESC 退出全屏模式Fla及HTML源文件
  16. 【 PG 入门系列 】PostgreSQL的客户端工具(五)
  17. 手把手教你获取一年免费通配符泛域名SSL证书
  18. 宠物商店——三层架构
  19. weka+em算法+java使用_WEKA学习笔记2 - lyle_5的个人页面 - OSCHINA - 中文开源技术交流社区...
  20. python+selenium3登录126邮箱并发送邮件

热门文章

  1. 体重指数(BMI)计算器
  2. 量子计算机基地边缘,成都提前布局6G、量子计算、边缘计算等前沿技术
  3. 2014年大学专业就业前景分析 -【计算机科学与技术专业】
  4. 6月项目总结--浅尝jsp(官网优化),移动端Echarts,mescroll试水,树形插件bootstrap-treeview
  5. ffmepg把PCM文件转换成AMR
  6. 人生成熟的四个重要标志
  7. Ubuntu学习(六)Linux安装压缩包版的软件
  8. mysql 8.0 解决报错Public Key Retrieval is not allowed
  9. oledb vc访问mdb数据库_vc实战oledb编程
  10. unity请求json数据并解析