基本套接字函数,要求完全理解,并熟练回答。像回答考题那样回答以下问题,会有快速的进步。
1. socket 函数的三个参数,分别是什么?有多少组合是合理的?
2. socket 函数的第三个参数怎么使用?是否全都使用0?
3. connect 函数第二个参数一定要包含服务器的IP地址和端口。
3. connect 函数调用前一定要使用bind 绑定本地ip和端口吗?如果不绑定本地ip和端口会产生什么情况?
4. connect 函数调用前后对应TCP连接的状态是如何变化的?画出对应发送的分节和状态图。
5. connect 函数调用失败的三种情况分别是什么?分别返回什么错误?
6. 发送RST分节的三种情况分别是什么?
7. connect 失败后的套接字还可以再使用吗?应该如何处理?
8. bind 函数有什么作用?
9. 如果服务器程序不使用bind绑定ip和端口,分别会有什么问题?
10. 如果客户端程序不使用bind绑定ip和端口,分别会有什么问题?
11. bind如果失败,一般是由什么原因造成的?
12. 如果connect 前没使用bind 绑定ip和端口,成功以后怎么获取得到实际使用的ip和端口?
13. lisent 函数会使TCP服务端状态发什么什么改变?
14. 第二个参数backlog是什么意思,怎么使用?
15. 什么情况下未完成队列增加新项?什么时候已完成队列增加新项?
16. 如果未完成队列超出预设值,到来的连接请求怎么处理?
17. 已完成队列非空时,accept 函数从完成队列队头取出一个项返回。完成队列为空时,accept 有什么行为?
18. accept 第二个参数在返回时,带出来的是对端的客户地址和端口信息。
19. accept 如果成功,返回的值代表什么意思?
20. 监听套接字与已连接套接字的生命周期有什么区别?
21. 一般来说,close 对套接字操作以后,能否对此套接字再作read/write操作?套接字是否还有可能在close后发出数据?
进程相关编程:
1. UNIX中派生新进程的唯一方法是——fork(包括有的系统可能提供的它的各种变种)。
2. fork是如何派生新进程的?
3. 父进程中调用fork之前打开的所有描述符在fork返回后是否由子进程共享?
4. 网络服务器利用这个特性:父进程调用accept 后调用 fork。所接受的已连接套接字随后就在父进程与子进程之间共享。通常情况下,子进程接着读写这个已经连接的套接字,父进程则关闭这个已连接的套接字。如果父进程不关闭该套接字,长期下来会造成什么样的后果?
5. fork 函数的典型用法是什么?
6. 在放在硬盘上的可执行程序能够被UNIX执行的唯一方法是调用哪个系列函数?
7. 使用fork 创建子进程处理 accept 所返回的已连接套接字后,为什么父进程需要关闭该已连接套接字?
8. exec 函数在什么时候才会返回给调用者?不返回的情况会有什么行为?
获取套接字ip和地址:
1. getsockname是获取本地的ip和端口的,有四种情况分别获取到不同的数据,分别是哪四种?
2. getpeername是服务端使用fork+exec创建子进程方式获取客户端地址的方式,描述一下这个过程,getpeername应该在什么时候调用?