apue中syslog引起的accept错误如何解决?

摘要:前几天在看apue第16章关于socket的例子,就是一个非常典型的socket服务器,关键代码如下: 1 void serve (int sockfd) 2 { 3 int ret; 4 int clfd; 5 int status; 6
前几天在看apue第16章关于socket的例子,就是一个非常典型的socket服务器,关键代码如下: 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上返回给客户端。 正常的输出如下: [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 来查看服务运行的情况。
阅读全文