发送数据的端

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
int main(void){struct sockaddr_in server_address;bzero(&server_address, sizeof(server_address));server_address.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr.s_addr);server_address.sin_port = htons(9999);int sockfd = socket(PF_INET, SOCK_STREAM, 0);assert(sockfd >= 0);if(connect(sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0){perror("connect");printf("connection failed\n");}else {const char*oob_data = "abc";const char*normal_data = "123";send(sockfd, normal_data, strlen(normal_data), 0);send(sockfd, oob_data, strlen(oob_data), MSG_OOB);send(sockfd, normal_data, strlen(normal_data), 0);}close(sockfd);return 0;
}

接受数据端

#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<signal.h>
#include<fcntl.h>
#define BUF_SIZE 1024
static int connfd;void sig_urg(int sig){/*如果系统调用或库函数正确执行的话,*errno的值是不会被清零(置0,注意这里是不会被清零,*不是不会被改变)的,假若执行函数A的时候发生了错误errno被改变,*接下来直接执行函数B,如果函数B正确执行的话,*errno还保留函数A发生错误时被设置的值。*///保留原来的errno可以保证函数的可以重入性/*“可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据;可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。”*/int save_errno = errno;char buffer[BUF_SIZE];memset(buffer, '\0', BUF_SIZE);//接收外带数据int ret = recv(connfd, buffer, BUF_SIZE, 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_mask字段可指定一组信号,不允许它们中断此处理器程序的执行sigfillset(&sa.sa_mask);//对同一个信号的中断不会被递归的调用//可能需要重复看看牛客的信号讲解assert(sigaction(sig, &sa, NULL) != -1);
}int main(void){struct sockaddr_in address;bzero(&address, sizeof(address));address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;//inet_pton(AF_INET, "127.0.0.1", &address.sin_addr.s_addr);address.sin_port = htons(9999);int sock = socket(PF_INET, SOCK_STREAM, 0);assert(sock >= 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){perror("accept");}else{//加到信号处理集合当中//其中信号处理函数sig_urg用来打印外带数据addsig(SIGURG, sig_urg);fcntl(connfd, F_SETOWN, getpid());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;
}

2022-7-6 使用SIGURG来接受外带数据,不知道为什么打印不出来相关推荐

  1. Linux(程序设计):59---SIGHUP、SIGPIPE、SIGURG信号处理(附SIGURG信号处理普通数据与外带数据案例)

    本文介绍3个与网络编程有关的3个信号 一.SIGHUP信号处理 信号产生的情景: 1.如果终端接口检测到一个连接断开,则将此信号送给与该终端相关的控制进程(会话首进程) 此信号被送给session结构 ...

  2. mysql max_allowed_packet 参数 限制接受的数据包大小

    MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致大数据写入或者更新失败. 查看目前配置: mysql> s ...

  3. ESP8266 WIFI模块学习之路(7)——自写Android手机APP接受单片机数据

    上一篇是写关于自写Android手机APP给单片机下发数据的,这次我将写一下APP如何接受单片机数据. 其实使用调试助手,或者别人开的的APP同样能够实现接受单片机数据,但想学习的,我还是建议能够自己 ...

  4. 【Python爬虫】2022年数学建模美赛B题数据爬取

    2022年数学建模美赛B题数据爬取 背景 2022年的美赛刚刚落下帷幕,该题的一个主要难点在于数据的获取.很多人无法找到有效的数据,或者是无法获取数据. 比如找到了如下米德湖的水文数据,但是发现并没有 ...

  5. 解决QT接受串口数据时数据更新不及时,串口数据太多导致程序界面崩溃,串口接收数据过快等问题

    1.问题背景 最近在使用上位机测试传感器接受数据是否正常,发现了很多问题,由于没有系统的学过Qt,用到什么库就学什么库,导致库中的函数很多不清晰,产生了标题中的一系列问题,经过不断的尝试,终于解决上述 ...

  6. 怎样把vc6的MSComm控件接受的数据实时的显示在编辑框,并把数据实时惠存txt文件中

    怎样把vc6的MSComm控件接受的数据实时的显示在编辑框,并把数据实时存入txt文件中 我在做一个基于VC6的MSComm控件的电机上位机控制,数据帧格式采用9600bps,8位数据位,奇校验,1位 ...

  7. 2022年首届“钉钉杯”大学生大数据挑战赛初赛题目

    初赛 A:银行卡电信诈骗危险预测  一.问题背景:  数字支付正在发展,但网络犯罪也在发展.电信诈骗案件持续高发,消费者 受损比例持续走高.报告显示,64%的被调查者曾使用手机号码同时注册多个账户,包 ...

  8. 收割10W大奖+大厂面试+成果发表 | 2022『猛犸杯』国际组学数据创新大赛开放报名

    由中国生物信息学学会(筹).广东省科技基础条件平台中心指导,深圳国家基因库.鹏城实验室.深圳华大生命科学研究院主办的2022『猛犸杯』国际组学数据创新大赛开放报名. 点击下方链接参与报名 022『猛犸 ...

  9. 2022年7月31日DAMA-CDGA/CDGP数据治理认证班开启!

    2022年7月31日DAMA-CDGA/CDGP数据治理认证班开启! [DAMA数据治理认证简介] 为了便于国内广大数据从业者学习相关认证,DAMA中国以国际数据管理协会(简称"DAMA国际 ...

最新文章

  1. Qt Creator指定项目属性
  2. python_day_5:20180720
  3. 多比Web 3D展示(3D机房/3D监控)中间件多比Web 3D展示(3D机房/3D监控)中间件免费下载购买地址...
  4. 如何编写出拥抱变化的代码
  5. 无码系列-7-代码的语文修养_上篇
  6. selenium定位方式
  7. 连载丨《极简设计:苹果崛起之道》——硅谷伊甸园(二)
  8. hooks taro 下拉刷新_Hooks
  9. 吊炸天——74款APP完整源码
  10. 日志服务器文档,日志服务器的搭建.docx
  11. ANdroid8.0以上创建快捷方式
  12. 锐取电视墙服务器型号,锐取录播系统 CL4000系列多媒体录播一体机--投影时代产品专区...
  13. 追寻宇宙的形状--庞加莱猜想
  14. 有线等效隐私 (WEP)
  15. 基于JAVA共享汽车管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  16. 大数据分析助迈凯轮车队角逐F1
  17. Linux-centos-7安装
  18. C# 模拟鼠标移动和点击(转载)
  19. C语言自定义函数的调用
  20. 多媒体互动投影解决方案——虚拟翻书

热门文章

  1. edp和edt哪个好_香水等级科普 | EDP和EDT你都分清楚了吗?
  2. Python实现《明日方舟》干员寻访模拟器第三期:原始但实用的卡池机制,不过要小心!
  3. MySQL · 引擎特性 · InnoDB Adaptive hash index介绍
  4. Java文件操作-I/O流
  5. Python的pip3的作用与用法
  6. STM32单片机(9) LCD1602显示屏输出实验
  7. ijkplayer 使用
  8. 一般向量空间的基变换_向量几何--3-D空间中的基变换与坐标变换【转】 - 回到未来 - C++博客...
  9. 基于51单片机的智能宠物喂食系统
  10. 补水黑科技 绿洲AirWater A3加湿器正式发布