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

void serve (int sockfd)
{
int ret;
int clfd;
int status; FILE *fp;
pid_t pid;
char buf[BUFLEN]; for (;;) {
clfd = accept (sockfd, NULL, NULL);
if (clfd < ) {
syslog (LOG_ERR, "accept error: %d, %s", errno, strerror (errno));
//if (errno == EOPNOTSUPP)
//{
// syslog (LOG_INFO, "retry..");
// continue;
//} exit ();
} fp = popen ("/usr/bin/uptime", "r");
if (fp == NULL) {
sprintf (buf, "error: %s\n", strerror (errno));
ret = send (clfd, buf, strlen (buf), );
syslog (LOG_ERR, "write back %d for error", ret);
} else {
while (fgets (buf, BUFLEN, fp) != NULL)
{
ret = send (clfd, buf, strlen (buf), );
// very amazing, add these log will lead to accept failed with EOPNOTSUPP (95)
// maybe syslog used dgram socket confuse us..
syslog (LOG_ERR, "write back %d", ret);
} pclose (fp);
} close (clfd);
}
}

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

正常的输出如下:

[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输出,以便通过  tail -f /var/log/messages 来查看服务运行的情况。

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

ruptimed: write back 70

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

[yunhai@localhost 16.chapter]$ ./uptime_tcp_clt
connect failed, retry...
connect failed, retry...
connect failed, retry...

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

ruptimed: accept error: 95, Operation not supported

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

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

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

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

服务端代码

客户端代码

后记:

后来使用UDP尝试,发现如果不加syslog则一切正常;如果加了syslog,则recvfrom会阻塞卡死,不接收任何数据。

[apue] syslog 导致 accept 出错?的更多相关文章

  1. thinkphp关闭调试模式(APP_DEBUG => false),导致程序出错

    thinkphp关闭调试模式(APP_DEBUG => false),导致程序出错,开启调试模式,不报错,怎么解决? 查看Logs日志记录: [ --29T09::+: ] 113.108.11 ...

  2. 161121、hibernate导致数据出错的两个地方

    一.在查询出来的对象上直接设置属性(该属性配置了可以持久化,如果不是可持久化的就没有关系). 出错的代码:(查询用的不好也会导致数据更新哦) Pagination pagination = group ...

  3. Asp.Net Mvc ScriptBundle 脚本文件捆绑压缩 导致 脚本出错的问题

    由于捆绑压缩会对所有包含的文件进行压缩,无法设置忽略对某个js文件的压缩.导致压缩该js后,脚本出错的问题. 解决方式: 重写 ScriptBundle 的 GenerateBundleRespons ...

  4. ASP.NET_SessionId 不相同导致验证码出错

    问题: 今天碰到一个比较奇怪的问题,每个页面请求的cookie的ASP.NET_SessionId 不相同,导致验证码检验出错.也就是说每个请求都是一个新的会话,我们把验证码保证在Session[ra ...

  5. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法

    苹果这狗日的,手段果然狠,因为用户提前升级了测试版又没有更新正式版,就突然把手机变砖头,既不让升级正式版,也不让备份手机中的信息,确实有必要这样吗? 我的手机是IPone4s,在看了6月Apple W ...

  6. 解决UITableView中Cell重用机制导致内容出错的方法总结

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...

  7. 【ThinkPHP学习】ThinkPHP自己主动转义存储富文本编辑器内容导致读取出错

    RT. ThinkPHP的conf文件里的Convention.php有一个配置选项 'DEFAULT_FILTER' => 'htmlspecialchars', // 默认參数过滤方法 用于 ...

  8. 头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。

    反思: 1 解决 问题的思路 绕远了: 在这个问题出现前,程序是运行正确 的 问题出现前,我误删了DB 的 testcase表的所有 case ,然后 再把邮件 中的excel数据导入到 DB 然后 ...

  9. MySQL配置不当导致Sonarqube出错的一次经历:Packet for query is too large (16990374 > 13421568)

    公司里部署了Jenkins + Sonarqube对项目代码进行构建和代码质量扫描. 某个大型项目报告项目构建失败.进jenkins看,该项目构建日志中的报错信息是这样的: 通过错误堆栈中的信息可以判 ...

随机推荐

  1. 【STM32-V5】STM32F407开发板开源, 丰富软件资源, 强劲硬件配置, 配套500实例, 10套手册带视频教程2019-12-12

    淘宝购买地址:购买地址链接 从2013年5月份发布至今,开发板硬件更新过6个版本,软件资料更新过85次.当前标准库最新版本V8.8,HAL库最新版本V1.1 安富莱微信公共平台,欢迎大家关注(打造高质 ...

  2. ES、kibana安装及交互操作

    一.ES的安装与启动 1.ES安装(Windows环境) 下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch 版本 ...

  3. Centos7部署mysql

    安装mysql yum install mysql mysql-server 会出现以下错误: [root@yl-web yl]# yum install mysql-server Loaded pl ...

  4. Windows CLI命令

    目录 Windows CLI命令 1.背景 2.netstat 罗列端口号占用情况 3.telnet 远端IP的某个端口号 Windows CLI命令 1.背景 在Windows操作系统下开发,需要用 ...

  5. 怎么将DWG转PDF?分享一个在线转换方法

    了解CAD的朋友们都知道,在使用CAD制图软件绘制图纸的时候,默认的CAD图纸保存格式就是为DWG格式.但是DWG格式的文件不能够直接进行打开查看,就需要将DWG转PDF格式.那具体要怎么来进行操作呢 ...

  6. 4.Ansible Task控制

    1.tag标签(调试) --skip-tags install_nfs 跳过此标签 -t 指定标签名 [root@manager tasks]# cat task_nfs.yml - hosts: w ...

  7. angular cli + primeNG

    目录: 1.安装  angular cli 2.创建项目 3.构建路由 4.新建组件 5.组件之间的通信 6.引入primeNG 7.修改primeNG组件样式 8.问题 -------------- ...

  8. 打包vue文件,上传到服务器

    主要步骤: 1. npm run build生成dist文件夹 2. 将dist文件夹上传到服务器上 3. 服务器上配置nginx,访问路径指向dist文件夹下的index.html,这样当访问ngi ...

  9. 修改so库中的依赖名

    修改so库中的依赖名 在ArchLinuxArm上有一些针对aarch64, arm, armeabi-v7a等Android常用架构的so库可以下载,有时候可以省去很多编译时间,且都是编译optim ...

  10. SQL Server Agent作业执行CmdExec(bat)命令报权限问题

    写了一个bat命令,定期去清理一些SQL Server的Dump文件,然后配置成SQL Server作业,作业执行时报权限错误,具体错误信息如下所示: Message Executed as user ...