UNIX网络编程 - Chapter 4 基本TCP套接字编程
Chapter 4 基本TCP套接字编程
1 |
|
Q&A
问题 4.1:在 4.4 节中,我们说头文件
<netinet/in.h>中定义的INADDR_*常值是主机字节序的。我们应该如何辨别?
网络字节序为大端序, 而主机字节序分为大端序和小端序, 判断大端序和小端序的方法最简单的为:
定义一个整数1( 0x00000001), 然后用主机读取第一个字节(起始地址), 如果为1那么就说明为小端序
1 | int x = 1; |
问题 4.2:把图 1-5 改为在
connect成功返回后调用getsockname。使用sock_ntop显示赋予 TCP 套接字的本地 IP 地址和本地端口号。你的系统的临时端口号在什么范围内(图 2-10)?
1 | socklen_t len; |
如何查看临时端口确切的范围
1 | cat /proc/sys/net/ipv4/ip_local_port_range |
或者
1 | sysctl net.ipv4.ip_local_port_range |
问题 4.3:在一个并发服务器中,假设
fork调用返回后子进程先运行,而且子进程随后在fork调用返回父进程之前就完成对客户的服务。图 4-13 中的两个close调用将会发生什么?
详见上面的程序
问题 4.4:在图 4-11 中,先把服务器的端口号从 13 改为 9999(这样不需要超级用户特权就能启动程序),再删掉
listen调用,将会发生什么?
会出现下面的情况:
1 | root@eec97ceac465:/workspaces/unp/unpv13e/intro# ./daytimetcpsrv1 |
原因如下:
TCP连接的三个步骤:
- Socket() - 创建套接字, socket()创建套接字时, 默认为一个主动套接字, 即是一个将调用connect连接的客户套接字
- Bind() - 绑定地址和端口
- Listen() - 将套接字转换为被动/监听状态, 此时套接字从CLOSED状态转换到LISTEN状态
所以当Listen()被注释时, 套接字仍处于CLOSED状态, Accept()无法在非监听套接字上工作, 所以报”Invalid argument”错误
即:
Listen()必须在Bind()之后调用Accept()只能在套接字处于 LISTEN 状态时使用- 没有
Listen()→ 套接字不能接受连接 →Accept()报 “Invalid argument”