区块链技术博客
www.b2bchain.cn

Linux C/C++面试之《网络编程系列》(6) 套接字编程杂项讨论求职学习资料

本文介绍了Linux C/C++面试之《网络编程系列》(6) 套接字编程杂项讨论求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

    • 1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

read/recv:
阻塞与非阻塞recv返回值没有区分,都是

  • <0:出错,
  • =0:对端关闭,
  • >0:接收到的数据大小。

特别:
非阻塞模式下返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取。

错误码解释:
EWOULDBLOCK:提示需要设置成阻塞模式
EINTR:指操作被中断打断,需要重新读/写
EAGAIN:
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。
例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,
read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。

对于EAGAIN,我们的处理方式是睡眠一小段时间再重试。

    • 1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

read/recv:
阻塞与非阻塞recv返回值没有区分,都是

  • <0:出错,
  • =0:对端关闭,
  • >0:接收到的数据大小。

特别:
非阻塞模式下返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取。

错误码解释:
EWOULDBLOCK:提示需要设置成阻塞模式
EINTR:指操作被中断打断,需要重新读/写
EAGAIN:
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。
例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,
read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。

对于EAGAIN,我们的处理方式是睡眠一小段时间再重试。

    • 1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

1、关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

read/recv:
阻塞与非阻塞recv返回值没有区分,都是

  • <0:出错,
  • =0:对端关闭,
  • >0:接收到的数据大小。

特别:
非阻塞模式下返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要循环读取。

错误码解释:
EWOULDBLOCK:提示需要设置成阻塞模式
EINTR:指操作被中断打断,需要重新读/写
EAGAIN:
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。
例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,
read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。

对于EAGAIN,我们的处理方式是睡眠一小段时间再重试。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Linux C/C++面试之《网络编程系列》(6) 套接字编程杂项讨论求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们