MSG_OOB : 仅仅是通过tcp头的urgent 模式传送的,

且只会读取一个字节作为oob数据

例如:send(sockfd,"1234",strlen("1234"),MSG_OOB);

只有最后一个字节:4 将被当作oob数据 ,其他数据"123"将被当作普通数据读取

需要注意:

此类数据通过信号 SIGURG 来通知 ,所以需要使用 signal / sigaction 来注册一个信号处理函数.

在signal 之前首先需要 fcntl(clientfd,F_SETOWN,getpid())

由于此信号是由套接字产生的, 而套接字的拥有者是操作系统 . 只有把套接字的拥有者设置为当前进程, SIGURG才会被

传递到此进程, 否则将接受不到SIGURG信号,只能接受普通数据.

MSG_PEEK  :  偷窥一下缓冲区中有没有数据,  recv(clientfd,buf,BUFSIZ,MSG_PEEK)  ,并不会从缓冲区移除数据.

MSG_DONTWAIT : 不阻塞

oob_recv.c

#include "util.h"

#include

static void urg_handler(int sig);

int clientfd = 0;

int main(int argc, char ** argv)

{

int listenfd = socket(AF_INET, SOCK_STREAM,0);

struct sockaddr_in serv_addr,client_addr;

memset(&serv_addr,0,sizeof(serv_addr));

memset(&client_addr,0,sizeof(client_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

serv_addr.sin_addr.s_addr = INADDR_ANY;

if(bind(listenfd,(SA*)&serv_addr,sizeof(serv_addr)) < 0){

perror("bind");

return 0;

}

if(listen(listenfd,BACKLOG) < 0){

perror("listen");

return 0;

}

socklen_t client_socklen =sizeof(client_addr);

clientfd = accept(listenfd,(SA*)&client_addr,&client_socklen);

//注意, 如果不设置套接字拥有者, 此进程将收不到SIGURG 信号.

fcntl(clientfd,F_SETOWN,getpid());

//注册信号函数

signal(SIGURG,urg_handler);

int n = 0;

char buf[BUFSIZ];

// while(1){

// printf("检查数据是否存在\n");

// n = recv(clientfd,buf,BUFSIZ,MSG_PEEK|MSG_DONTWAIT);

// printf("数据长度 : %d ,errno:%d\n", n,errno);

// if(n > 0){

// puts("有数据了");

// break;

// }

//

// }

//接受普通数据.

while((n = recv(clientfd,buf,BUFSIZ,0)) != 0){

if( -1 == n){

perror("recv error");

printf("error no : %d\n" ,errno);

continue;

}

buf[n] = 0;

printf("normal buf:%s\n",buf);

}

close(clientfd);

close(listenfd);

return 0;

}

static void urg_handler(int sig)

{

char buf[30];

//接受OOB数据, 只能接受最后一个字节, 其他字节作为普通数据接受

int n = recv(clientfd ,buf,30,MSG_OOB);

printf("oob len : %d\n" , n);

buf[n] = 0;

printf("oob data:%s\n" , buf);

}

oob_send.c

#include "util.h"

int main(int argc, char ** argv)

{

if ( argc != 3){

puts(" ip port");

return 0;

}

int sockfd = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in sin;

memset(&sin,0,sizeof(sin));

sin.sin_port = htons(atoi(argv[2]));

sin.sin_addr.s_addr = inet_addr(argv[1]);

sin.sin_family = AF_INET;

connect(sockfd,(SA*)&sin,sizeof(sin));

char data[] = "data1" , data2[] = "data2";

char oob_data1[] = "oobdata1" , oob_data2[] = "oob_data2";

write(sockfd,data,strlen(data));

//发送oob数据 , 只有最后一个字节将被当作oob数据

send(sockfd,oob_data1,strlen(oob_data1),MSG_OOB);

write(sockfd,data2,strlen(data2));

//发送oob数据 , 只有最后一个字节将被当作oob数据

send(sockfd,oob_data2,strlen(oob_data2),MSG_OOB);

close(sockfd);

return 0;

}

结果:

normal buf:data1

oob len : 1

oob data:1

normal buf:oobdata

oob len : 1

oob data:2

normal buf:data2oob_data

php msg oob,一个例子说明 MSG_OOB MSG_PEEK MSG_DONTWAIT相关推荐

  1. ROS学习-创建一个ROS msg和一个srv

    目录 ROS msg和srv的介绍 使用msg 创建一个msg 使用rosmsg命令 使用srv 创建一个srv 使用rossrv命令 msg和srv的通用步骤 使用Help 简要总结回顾 ROS m ...

  2. 趣味python教程_Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...

    原标题:Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 人生苦短,编程苦手,不妨学起Python, ...

  3. 用一个例子来解释ThreadLocal

    ThreadLocal叫线程本地变量,他为每个线程都创建了一个副本变量,每个线程都只能访问自己的副本变量. 我们直接用一个例子来解释ThreadLocal. class Message{private ...

  4. [asp.net core]SignalR一个例子

    摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...

  5. R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE

    R语言使用lm构建线性回归模型.并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图.可视化模型的残差.模型预测中系统误差的一个例子 .自定义函数计算R方指标和均方根误差RMSE 目 ...

  6. python中self_一个例子带你入门Python装饰器

    ============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...

  7. ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...

    数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子 以备份oracle数据为例 本机IP:192.168.0.1 远程IP:192.168.0.111 备份脚本 ora_bak ...

  8. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  9. 用一个例子告诉你gdb调试工具如何使用

                                        用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式 ...

  10. C++中const——由一个例子想到的

    前天同学实现了<C++ Primer>中关于虚函数的一个例子,拿过来问我,代码如下: #include<iostream> #include<string> usi ...

最新文章

  1. java 前端基础知识_【计算机·知识】关于前端的计算机基础知识
  2. 哪些人适合学软件测试呢
  3. SQL Server-聚焦事务、隔离级别详解(二十九)
  4. Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题
  5. Google深度揭秘TPU:一文看懂内部原理,以及为何碾压GPU
  6. ansible(自动化运维中)——ansible常用模块
  7. MyGeneration的NHibernate代码生成模版
  8. 【练习5.9】图像掩码、礼帽、cvCopy、图像融合、cvCvtColor
  9. PowerDesigner表结构和字段大小写转换
  10. springmvc接收日期字段处理方式
  11. 无处 不在的无线智能——6g 的关键驱动与研究挑战_一文看懂什么是 6G
  12. 5G+AI能带来什么新机遇?工业和学术界大咖带来一次深度剖析
  13. 研磨设计模式笔记之简单工厂模式
  14. 基于xxtea算法文件加密工具
  15. DSPE磷脂用作药用辅料具有乳化、药物增溶的作用;CAS:1069-79-0
  16. 最新emlog5.3.1系统YiT模板源码
  17. Qt中关于emit和moc_*.cpp的自动生成
  18. SDUT F - 判断回文串
  19. 织梦dedecms 采集笔记
  20. React使用antd

热门文章

  1. 阿里云的端口映射问题
  2. 【台州世通兰陵王系列】服务器的1U、2U、4U是指什么?
  3. 基于Redis的分布式链家二手房房源数据爬虫系统 毕业设计
  4. c/c++游戏编程之Easyx图形库基础
  5. linux poodle漏洞,Claws Mail 3.11.0发布 修复了POODLE 漏洞
  6. 《数学之美》阅读笔记
  7. java中if条件函数怎么用_if函数,多个条件怎么使用
  8. C语言:L1-009 N个数求和 (20 分)
  9. 记录安装tensorflow-gpu,版本选择问题,短平快解决战斗
  10. 《趣味知识博文》小W与小L带你聊天式备考CDA Level Ⅰ(三)