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第四章:基本套接字编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性