前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[apue] syslog 导致 accept 出错?

[apue] syslog 导致 accept 出错?

作者头像
海海
发布于 2022-08-19 02:20:08
发布于 2022-08-19 02:20:08
1.3K00
代码可运行
举报
文章被收录于专栏:goodcitizengoodcitizen
运行总次数:0
代码可运行

前几天在看apue第16章关于socket的例子,就是一个非常典型的socket服务器,关键代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 void serve (int sockfd)
 2 {
 3     int ret; 
 4     int clfd; 
 5     int status; 
 6 
 7     FILE *fp; 
 8     pid_t pid; 
 9     char buf[BUFLEN]; 
10 
11     for (;;) { 
12         clfd = accept (sockfd, NULL, NULL); 
13         if (clfd < 0) { 
14             syslog (LOG_ERR, "accept error: %d, %s", errno, strerror (errno)); 
15             //if (errno == EOPNOTSUPP)
16             //{
17             //    syslog (LOG_INFO, "retry.."); 
18             //    continue; 
19             //}
20 
21             exit (1); 
22         }
23 
24         fp = popen ("/usr/bin/uptime", "r"); 
25         if (fp == NULL) { 
26             sprintf (buf, "error: %s\n", strerror (errno)); 
27             ret = send (clfd, buf, strlen (buf), 0); 
28             syslog (LOG_ERR, "write back %d for error", ret); 
29         } else { 
30             while (fgets (buf, BUFLEN, fp) != NULL) 
31             {
32                 ret = send (clfd, buf, strlen (buf), 0); 
33                 // very amazing, add these log will lead to accept failed with EOPNOTSUPP (95)
34                 // maybe syslog used dgram socket confuse us..
35                 syslog (LOG_ERR, "write back %d", ret); 
36             }
37 
38             pclose (fp); 
39         }
40 
41         close (clfd); 
42     }
43 }

当accept成功返回一个连接clfd后,使用这个serve方法来服务客户端的请求,简单说就是通过popen启动uptime命令返回当前系统运行时长,然后将uptime的输出导出到clfd上返回给客户端。

正常的输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yunhai@localhost 16.chapter]$ ./uptime_tcp_clt
connect ok
 02:02:26 up 6 days,  4:40,  5 users,  load average: 0.00, 0.00, 0.00

 但是与书上例子不同,为了查看服务端的活动情况,我在serve中加了几句syslog输出(line 35,标黄的那句),以便通过  tail -f /var/log/messages 来查看服务运行的情况。

正常情况下服务输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ruptimed: write back 70

 但是神奇的事情发生了,我再次启动客户端后,连不上服务器了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[yunhai@localhost 16.chapter]$ ./uptime_tcp_clt
connect failed, retry...
connect failed, retry...
connect failed, retry...

 再看服务器进程,居然已经退出了,回来查看daemon日志,发现这么一句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ruptimed: accept error: 95, Operation not supported

原来accept出错导致服务器退出了,错误码是95,EOPNOTSUPP。

如果我将加入的syslog注释掉,就一切正常,所以我怀疑是使用syslog和syslogd进程在进行UDP通讯传输日志时,干扰了accept从而导致后者失败。

但是这个过程具体是怎样的,目前还不得而知,只知道我用的端口是4201,改用其它端口也是这样。

我尝试过在失败后重启accept操作,结果陷入无穷循环,每次都得相同的错误。

只要把新加的这句注释掉,就一切正常了。

更进一步,只要在 accept 之前有任何 syslog,accept 就会失败,amazing……

服务端代码

客户端代码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《Linux高性能服务器编程》学习小结3
下面的每一个logical指定一个实际运行着的服务器,如前面小结1 2 中所述的多进程或者多线程服务器;三个字段分别指定:服务器的ip4地址,服务器服务端口,以及进程池中的进程与这个服务器保持多少个连接;
wanyicheng
2021/02/04
3.1K0
《Linux高性能服务器编程》学习小结3
[apue] 如何处理 tcp 紧急数据(OOB)?
在上大学的时候,我就听说了 OOB 这个概念(Out Of Band 带外数据,又称紧急数据)。当时老师给的解释就是在当前处理的数据流之外的数据,用于紧急的情况。然后就没有然后了……
海海
2022/08/19
9320
2-UNIX网络编程-进阶学习前的基础知识储备
诚实点,并不是假设读的人C语言基础很差,而事实是,自己的C语言基础实在太差,要补学基础知识之后才可以进行后续的学习,惭愧!
zoujunjie202
2022/07/27
4200
2-UNIX网络编程-进阶学习前的基础知识储备
网络编程 - Linux Socket编程
  socket(套接字)是网络编程编程的一种技巧。通过socket不仅可以实现跨进程通信,还可以实现跨主机的网络通信。使用这种技术,就可以实现全国各地的通讯。例如:深圳的一台电脑接收来自北京一台电脑发来的信息。   本篇不涉及太底层的网络原理,仅说明socket的基本使用方法。主要参考《Linux网络编程》。本篇源码获取方式见文底小字。
开源519
2023/03/09
9.9K0
网络编程 - Linux Socket编程
UNIX(进程间通信):17 深入理解unix域
unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法。
用户3479834
2021/03/04
1.8K0
UNIX(进程间通信):17 深入理解unix域
【Linux】:Socket编程 TCP
在上篇文章里面已经讲了关于 Socket UDP 网络编程的内容,这篇文章我们主要是关于 Socket TCP 网络编程的内容
IsLand1314
2025/01/20
2430
【Linux】:Socket编程 TCP
C/C++ 实现正反向端口映射
通常服务器是放在内网中,内部局域网中,并且分配了私有IP地址,而如果想要在外部直接访问内部服务器则需要端口映射,端口映射也叫做端口转发,或者叫做虚拟服务器,在渗透时当我们拿到目标机器权限以后,目标机器实在内网环境中,如果想要外部直接访问内部的特定机器的特定端口,则需要使用映射来实现,常用的映射工具是LCX,或者自己实现。
王瑞MVP
2022/12/28
6510
Socket
Socket模块简单理解就是对socket套接字的封装,当然不是简单的对socket套接字接口的封装,还需要实现一些方法,比如启动非阻塞通信、创建客户端连接、创建服务器连接等。
二肥是只大懒蓝猫
2024/02/07
1700
Socket
加密通讯协议SSL编程周立发
编译程序用下列命令: gcc -Wall ssl-client.c -o client gcc -Wall ssl-server.c -o server 运行程序用如下命令: ./server 7838 1 127.0.0.1 cacert.pem privkey.pem ./client 127.0.0.1 7838 用下面这两个命令产生上述cacert.pem和privkey.pem文件: openssl genrsa -out privkey.pem 2048 openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095 具体请参考 “OpenSSL体系下使用密钥数字证书等” 如果想对SSL有更深入的了解,请学习计算机安全相关的内容,尤其是非对称加密技术。 如果想对SSL库的源代码有深入学习,请去 www.openssl.org 下载源码来阅读。
一见
2018/08/07
1.4K0
Unix域协议学习小结
Unix域协议不是一个真正意义上的协议族,只是一个利用socket api在单个主机上进行进程间通信的方法。它不需要走传统网络协议栈,也就不需要计算校验和、维护序列号以及应答等操作。
chain
2018/06/12
2.1K4
Librdkafka的Transport层
rd_kafka_recv按kafka的协议来收包, 先收4字节,拿到payload长度, 再根据这个长度收够payload内容, 这样一个完整的response就接收到了
扫帚的影子
2018/09/05
1.5K0
UDP&TCP Linux网络应用编程详解
暂时想不出什么好的应用场景, 目前想到目标就是实现让两个设备通过网络传输数据, 比如开发板和Linux主机之间传数据, 以后就可以实现开发板通过网络上报数据或者主机通过网络控制开发板。
韦东山
2020/09/30
5.8K0
UDP&TCP Linux网络应用编程详解
[apue] 作为 daemon 启动, Unix Domain Socket 侦听失败?
前段时间写一个传递文件句柄的小 demo,有 server 端、有 client 端,之间通过 Unix Domain Socket 通讯。
海海
2022/08/19
3250
【在Linux世界中追寻伟大的One Piece】Socket编程TCP(续)
枫叶丹
2024/11/04
980
从零开始的C++网络编程
导语:本文主要介绍如何从零开始搭建简单的C++客户端/服务器,并进行简单的讲解和基础的压力测试演示。该文章相对比较入门,主要面向了解计算机网络但未接触过网络编程的同学。 本文主要分为四个部分: 搭建C/S:用C++搭建一个最简单的,基于socket网络编程的客户端和服务器 socket库函数浅析:基于上一节搭建的客户端和服务器的代码介绍相关的库函数 搭建HTTP服务器:基于上一节的介绍和HTTP工作过程将最开始搭建的服务器改为HTTP服务器 压力测试入门:优化一下服务器,并使用ab工具对优化前后的
腾讯技术工程官方号
2019/10/23
8K1
从零开始的C++网络编程
Linux Tcp通信——服务器与客户端
之前一直想做linux+qt方向的,然而现在变成嵌入式软件方向了。其实也还好吧,这样就需要对底层的一些东西了解,目前是智能交通行业了。
用户5908113
2020/05/28
7K0
TCP服务器和客户端基础功能实现和要点解析
tankaro
2025/01/23
1290
一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力。与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在客户机器上的,Win32 上作为开机自启动的 windows 服务运行;Linux 上作为 daemon 在后台运行。总的说来就是用于接收几个产品进程的连接,因此轻量化是其最重要的要求,在这个基础上要能兼顾跨平台就可以了。其实主要就是 windows,再兼顾一点儿 linux。
海海
2022/08/19
1.2K0
一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent
linux 下经典 IO 复用模型 -- epoll 的使用
epoll 是 linux 内核为处理大批量文件描述符而对 poll 进行的改进版本,是 linux 下多路复用 IO 接口 select/poll 的增强版本,显著提高了程序在大量并发连接中只有少量活跃的情况下的CPU利用率。 在获取事件时,它无需遍历整个被侦听描述符集,只要遍历被内核 IO 事件异步唤醒而加入 ready 队列的描述符集合就行了。 epoll 除了提供 select/poll 所提供的 IO 事件的电平触发,还提供了边沿触发,,这样做可以使得用户空间程序有可能缓存 IO 状态,减少 epoll_wait 或 epoll_pwait 的调用,提高程序效率。
用户3147702
2022/06/27
7220
linux 下经典 IO 复用模型 -- epoll 的使用
epoll 基于非阻塞I/O事件驱动
该程序来源于传智博客教师课件,本人只是自己对照着写了一遍并做了注释,该模型可以承载大量客户端的连接二不会出现卡顿等情况,前提是我们交互的数据很少,如果交互数据较大,该例子还是有些小问题的。大家可以自己拓展,配合多线程可以实现大数据多客户端连接传输的程序。具体代码如下:
我与梦想有个约会
2023/10/20
2070
相关推荐
《Linux高性能服务器编程》学习小结3
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验