【计算机网络 - 基础问题】每日 3 题(五十三)

✍个人博客:https://blog.csdn.net/Newin2020?type=blog

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

157. Socket 在什么情况下是可读/可写?

Socket 在以下情况下是可读的:

  1. 当有数据到达时,即接收缓冲区中有数据可供读取。
  2. 当连接被对方关闭时,也会触发可读事件。

Socket 在以下情况下是可写的:

  1. 当发送缓冲区有足够空间可以写入数据时,即可以继续向对方发送数据。
  2. 当连接建立成功后,初始状态下套接字是可写的,表示可以开始发送数据。

需要注意的是,可读和可写并不意味着一定能够读取或写入数据。它们只是表示当前套接字是否处于相应的状态,具体的读取和写入操作还需要根据实际情况进行处理。例如,在非阻塞模式下,当套接字可读/可写时,可能仍然无法读取/写入数据,因为缓冲区可能为空或已满。

158. TCP 通讯中,select 到读事件,但是读到的数据量是 0,为什么,如何解决?

select 返回 0 代表超时。select 出错返回 -1。

select 到读事件,但是读到的数据量为 0,说明对方已经关闭了 socket,本端关闭读即可。

当 select 出错时,会将接口置为可读又可写。这时就要通过判断 select 的返回值为 -1 来区分。

159. SO_REUSEADDR 选项

服务器程序可以通过设置 socket 选项 SO_REUSEADDR 来强制使用被处于 TIME_WAIT 状态的连接占用的 socket 地址。

cpp 复制代码
int sock = socket(PF_INET, SOCK_STREAM, 0);
assert(sock >= 0);
int reuse = 1;
setsocketopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

struct sockeaddr_in address;
bzero(&address, sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET, ip, &address.sin_addr);
address.sin_port = htons(port);
int ret = bind(sock, (struct sockaddr*)&address, sizeof(address));

经过 setsockopt 的设置之后,即使 sock 处于 TIME_WAIT 状态,与之绑定的 socket 地址也可以立即被重用。

相关推荐
DEARM LINER15 分钟前
mysql 巧妙的索引
数据库·spring boot·后端·mysql
hn小菜鸡1 小时前
LeetCode 2058.找出临界点之间的最小和最大距离
算法·leetcode·职场和发展
OT.Ter1 小时前
【力扣打卡系列】二分查找(搜索旋转排序数组)
算法·leetcode·职场和发展·go·二分查找
喵手1 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式2 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Wx120不知道取啥名2 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
开心工作室_kaic3 小时前
ssm010基于ssm的新能源汽车在线租赁管理系统(论文+源码)_kaic
java·前端·spring boot·后端·汽车
Python私教3 小时前
Flutter颜色和主题
开发语言·javascript·flutter
代码吐槽菌3 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车
测试老哥3 小时前
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例