带外数据

带外数据用于迅速告知对方本端发生的重要的事件。它比普通的数据(带内数据)拥有更高的优先级,不论发送缓冲区中是否有排队等待发送的数据,它总是被立即发送。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。

SIGURG信号的作用

在linux环境下,内核通知应用程序带外数据到达的方式有两种:

  1. 一种就是利用I/O复用技术的系统调用(如select)在接受到带外数据时将返回,并向应用程序报告socket上的异常事件。
  2. 另一种方法就是使用SIGURG信号。(下面代码)

代码:

#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 <signal.h>
#include <fcntl.h>#define BUF_SIZE 1024static int connfd;void sig_urg(int sig)
{int save_errno = errno;char buffer[BUF_SIZE];memset(buffer, '\0', BUF_SIZE);int ret = recv(connfd, buffer, BUF_SIZE - 1, MSG_OOB); // 接收带外数据printf("got %d bytes of oob data '%s\n' ", ret, buffer);errno = save_errno;
}void addsig (int sig, void (* sig_handler) (int))
{struct sigaction sa;memset(&sa, '\0', sizeof(sa));sa.sa_handler = sig_handler;sa.sa_flags |= SA_RESTART;sigfillset(&sa.sa_mask);assert(sigaction(sig, &sa, NULL) != -1);
}int main(int argc, char* argv[])
{if (argc <= 2){printf("usage: %s ip_address port_number\n", basename(argv[0]));return 1;}const char* ip = argv[1];int port = atoi(argv[2]);struct sockaddr_in address;bzero(&address, sizeof(address));address.sin_family = AF_INET;inet_pton(AF_INET, ip, &address.sin_addr);address.sin_port = htons(port);int sock = socket(PF_INET, SOCK_STREAM, 0);assert(socket >= 0);int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));assert(ret != -1);ret = listen(sock, 5);assert(ret != -1);struct sockaddr_in client;socklen_t client_addrlength = sizeof(client);connfd = accept(sock, (struct sockaddr*)&client, &client_addrlength);if (connfd < 0) {printf("errno is: %d\n", errno);} else {addsig(SIGURG, sig_urg);fcntl(connfd, F_SETOWN, getpid()); // 设置SIGURG信号之前,我们必须设置socket的宿主进程或进程组char buffer[BUF_SIZE];while (1) {memset(buffer, '\0', BUF_SIZE);ret = recv(connfd, buffer, BUF_SIZE - 1, 0);if (ret <= 0) {break;}printf("got %d bytes of normal data '%s\n", ret, buffer);}close(connfd);}close(sock);return 0;
}

客户端(本机模拟发送SIGURG)

服务端反应

reference:
linux高性能服务器编程——游双

Linux服务器编程 用SIGURG检测带外数据是否到达相关推荐

  1. 【Linux网络编程】TCP带外数据

    [Linux网络编程]TCP带外数据 [1]TCP 包的部首 TCP带外数据相关概念 紧急字段URG     : 当URG=1时,告诉系统此报文段中有紧急数据,应尽快传送. 紧急指针         ...

  2. 2022-4-19 同时读取带外数据和正常数据《Linux高性能服务器》笔记

    服务端 #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include&l ...

  3. TCP通过带外数据实现心跳检测机制

    带外数据以及Linux下的设置 带外数据的概念:建立连接的双端,如果有一端有紧急的消息,可以立刻通知对方,而不是通过消息排队的机制进行告知. TCP没有真正的带外数据,而是设置了紧急指针来实现这一模式 ...

  4. Linux服务器上设置全局代理访问外网并验证

    Linux服务器上设置全局代理访问外网并验证 昨天碰到了内网需要访问外网下载的情况,需要在服务器上设置代理,没别的,就记录一下自己跳过的坑. 1.前提是已经搭建好了一台代理服务器 2.Linux设置全 ...

  5. TCP协议--带外数据和超时重传

    <Linux高性能服务器编程>阅读笔记: 1. 带外数据   有些传输层协议具有带外(Out Of Band, OOB)数据的概念,用于迅速告知对方本端发生的重要事件.因此带外数据比普通数 ...

  6. 带外数据:TCP紧急模式分析

    TCP并未提供真正意义上的带外数据,而是紧急模式.TCP并未建立新的连接,或者使用独立的逻辑通道,而只是通过紧急模式的机制,在已有的TCP连接上传输带外数据. 发送端 TCP协议栈会为每个套接字维护一 ...

  7. Linux服务器编程--升序链表定时器和时间轮定时器的比较

    1 两种机制的比较 2 代码实现 两种机制的原理不赘述了,代码中有详细注释. 2.1 升序链表法 完整代码参见:https://github.com/GaoZiqiang/Cplus_daily_tr ...

  8. linux测试tcp长连接工具,Linux(服务器编程):44---TCP长连接、短连接(心跳检测)

    一.TCP连接的相关说明 ①使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手,可见,我们建立这条连接是有成本的, ...

  9. 从事UNIX/LInux服务器编程最方便的代码编译工具------(eclipse for c/c++)、(FileZilla)、(Secure CRT) 这三种一定要一起使用 之3...

    这篇博文主要是安装eclipse for c/c++.同时也让我感受到eclipse工具的强大,尽然也支持c++,虽然在linux编程中仅仅起到编码的作用但是功能不容小觑. 下面进行eclipse f ...

最新文章

  1. 毒霸主程序集成反流氓
  2. [网页设计]点睛价值
  3. 呼叫中心团队管理浅谈
  4. Android之父卸任意味着什么?
  5. linux查看指定用户的所有进程
  6. SendMessage、PostMessage原理和源代码详解
  7. C++提高部分_C++函数模板_注意事项---C++语言工作笔记082
  8. APP适配安卓手机刘海屏
  9. 反素数(高合成数?)
  10. JAVA实现上传,下载,jxl操作Excel和邮件发送
  11. 你有什么道理后悔没有早点知道?
  12. 不用任何软件!PDF转Word用微信这个功能,简单又方便!
  13. 关于小学计算机论文题目,经典小学计算机课论文选题 小学计算机课论文题目怎样定...
  14. 神经网络可视化工具Netron
  15. Win10+Vs+CMake安装OpenCV+contrib
  16. Metal每日分享,调整胶片颗粒感滤镜效果
  17. 华为手机 6.0 拍照相册选择权限问题
  18. 解决一直Gradle Build Running的问题
  19. 通过ADVICE来实现按功能进行权限控制
  20. 手写Vuex核心原理,再也不怕面试官问我Vuex原理

热门文章

  1. 调整自己--提升自己
  2. CentOS上安装Jekins
  3. 容器编排技术 -- kubernetes设计理念
  4. RMAN备份恢复报错 ORA-19573: cannot obtain exclusive enqueue for datafile 5
  5. 分布式系统面试 - 幂等性设计
  6. MAC下 Intellij IDEA GO语言插件安装及简单案例
  7. 【服务端渲染】手动部署 NuxtJs 项目
  8. windows git密码 删除
  9. 【树莓派】给树莓派安装中文输入法Fcitx及Google拼音输入法
  10. 【生活】我的2019年度总结