30dayMakeCppServer icon indicating copy to clipboard operation
30dayMakeCppServer copied to clipboard

day2有点问题

Open decisive-strike opened this issue 2 years ago • 3 comments

我的运行环境是vmware运行的centos7,使用make编译时显示“printf在此作用域中尚未声明”与“scanf在此作用域中尚未声明”,后在client.cpp与server.cpp中加入#include 后问题解决。

decisive-strike avatar Apr 28 '22 11:04 decisive-strike

另外,在day3中有个判断条件是(errno == EAGAIN) || (errno == EWOULDBLOCK),我查阅资料后发现,EAGAIN与EWOULDBLOCK是完全相同的宏,不明白为什么这里要用或关系

decisive-strike avatar May 11 '22 13:05 decisive-strike

  1. 很入门的C/C++问题,建议先打好语言基础。
  2. 在标准中,EAGAIN被定义为资源短暂不可用,而EWOULDBLOCK被定义为操作阻塞,从定义上这两者不是一个概念。 在某些较老的unix系统中,这两者可能有不一样的实现。但对于GNU的libc库,这两者相同,从源码可以看到:
/* non-blocking and interrupt i/o */
#define EAGAIN          35              /* Resource temporarily unavailable */
#define EWOULDBLOCK     EAGAIN          /* Operation would block */

这两者定义为相同可能是为了g++编译器、os的实现方便,在编程时,需要认识清楚,可以参考《UNIX网络编程》非阻塞式编程相关章节。 这样用或操作,有两个好处:

  1. 程序逻辑更加健壮,让程序处理了资源短暂不可用、操作阻塞两种情况。
  2. 兼容了其他所有没有将EWOULDBLOCK和EAGAIN定义为相同的系统。

yuesong-feng avatar May 12 '22 06:05 yuesong-feng

  1. 很入门的C/C++问题,建议先打好语言基础。

  2. 在标准中,EAGAIN被定义为资源短暂不可用,而EWOULDBLOCK被定义为操作阻塞,从定义上这两者不是一个概念。

在某些较老的unix系统中,这两者可能有不一样的实现。但对于GNU的libc库,这两者相同,从源码可以看到:


/* non-blocking and interrupt i/o */

#define EAGAIN          35              /* Resource temporarily unavailable */

#define EWOULDBLOCK     EAGAIN          /* Operation would block */

这两者定义为相同可能是为了g++编译器、os的实现方便,在编程时,需要认识清楚,可以参考《UNIX网络编程》非阻塞式编程相关章节。

这样用或操作,有两个好处:

  1. 程序逻辑更加健壮,让程序处理了资源短暂不可用、操作阻塞两种情况。

  2. 兼容了其他所有没有将EWOULDBLOCK和EAGAIN定义为相同的系统。

大佬之后还会更新吗,最近在学习网络编程,觉得您写的教程特别易懂!

Ljj18392668155 avatar May 19 '22 03:05 Ljj18392668155