前面两篇博文学习总结了使用select函数改进回射客户端和服务器端。下面接着学习close与shutdown区别,以及进一步改进回射客户程序。
1.close与shutdown区别
1 2 3 4 5 6 7 8 9 |
#include <unistd.h> int close(int fd); #include <sys/socket.h> int shutdown(int sockfd, int how); DESCRIPTION The shutdown() call causes all or part of a full-duplex connection on the socket associated with sockfd to be shut down. If how is SHUT_RD, further receptions will be disallowed. If how is SHUT_WR, further transmissions will be disallowed. If how is SHUT_RDWR, further receptions and transmissions will be disallowed. |
(1)close终止了数据传送的两个方向。
(2)shutdown可以有选择的终止某个方向的数据传送或者终止传送的两个方向。
(3)shutdown how=1(SHUT_WR)就可以保证对等方接收一个EOF字符,而不管其他进程是否已经打开了套接字。而close不能保证,直到套接字引用计数减为0时才发送。也就是说直到所有的进程都关闭了套接字。
2.shutdown改进回射客户/服务器
利用shutdown保证已经发送出去的数据可以发送完毕,而不应该使用close:
shutdown(sock, SHUT_WR);