unp第四章:基本套接字编程
2022/3/7 9:15:09
本文主要是介绍unp第四章:基本套接字编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
TCP
bind函数
bind函数的作用是把本地地址和端口写入套接字结构里。
如果tcp服务器不bind一个地址,在listen的时候会随机分配,但这种操作不合适
如果不指定端口,没法在bind函数取得所选端口(const sockaddr *),如果想知道,getsockname
listen函数
listen函数做两件事:
- socket创建的套接字默认为主动套接字(即将要connect),listen函数将其转换为监听套接字,指示内核允许接受连接请求
- 本函数的第二个参数指示内核为其连接队列赋予的最大排队数
backlog参数大小的含义:
内核会为监听套接字维护两个队列:全连接队列(established)和半连接队列(syn_rcvd),这两个队列大小的和不得超过backlog的大小
收到第一个SYN报文,在半连接队列中创建条目。在收到来自客户端的ACK报文后,服务器在全连接队列中创建条目。
当进程调用accept时,会将全连接队列的队头返回给进程。如果调用时队列为空,进程将会进入睡眠,直到TCP中放入了一项才唤醒它。
accept函数
accept函数的第一个参数为监听套接字,返回值为已连接套接字。
如果对客户的地址不感兴趣,可以把第2个参数和第3个参数都置为NULL
fork和exec
fork是创建新进程的唯一方式,exec并不创建新进程,而是创建新程序.
进程打开的描述符通常在exec之后保持打开。
文件和套接字是引用计数的,因此如果引用数大于1,通过描述符关闭文件或者描述符并不真的关闭,而只是将引用数减1.
多进程服务器
迭代式服务器的问题在于如果处理请求的时间很长,那么用户等待时间会很长。
close函数
close的动作是将套接字标记为关闭,并且立即返回。close后既不能使用read也不能使用write。但是TCP会试图将所有没传完的数据传完。
父进程一定要立即close已连接,不然会导致可用描述符用完,并且因为父进程仍然持有套接字,任何子进程也也没法终止TCP连接。
getsockname和getpeername.
这两个函数用于获取本机ip端口,对端ip端口
getpeername的应用场景:
虽然accept确实会返回对端的地址结构,但是fork后的进程调用exec会丢失这个结构,这个时候就只能通过套接字描述符去获得
对端地址。
这篇关于unp第四章:基本套接字编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-01一个基于注解驱动的可视化的DDD架构-超越COLA的设计
- 2025-01-01PlantUML 时序图 基本例子
- 2025-01-01plantuml 信号时序图
- 2025-01-01聊聊springboot项目如何优雅进行数据校验
- 2024-12-31自由职业者效率提升指南:3个时间管理技巧搞定多个项目
- 2024-12-31适用于咨询行业的项目管理工具:提升跨团队协作和工作效率的最佳选择
- 2024-12-31高效协作的未来:2024年实时文档工具深度解析
- 2024-12-31商务谈判者的利器!哪 6 款办公软件能提升春节合作成功率?
- 2024-12-31小团队如何选择最实用的项目管理工具?高效协作与任务追踪指南
- 2024-12-31数据赋能,智慧养老:看板软件如何重塑养老服务生态