Android 平台 Ndk(linux) Socket Close和shutdown
遇到一个问题,linux socket 在connect 一个错误的ip地址的情况下,会阻塞,当调用close() 函数关闭socket的时候,会比较耗时,大约两三秒。 在close()函数之前调用 下shutdown函数可以解决此问题,关于close和shutdown的一些解释, 写的很明白了。
socket 多进程中的shutdown, close使用 当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:close(sockfd); 你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继续进行。如你可以关闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据。
int shutdown(int sockfd,int how);
Sockfd是需要关闭的socket的描述符。参数 how允许为shutdown操作选择以下几种方式: SHUT_RD:关闭连接的读端。也就是该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被丢弃。进程将不能对该套接字发出任何读操作。对TCP套接字该调用之后接受到的任何数据将被确认然后无声的丢弃掉。 SHUT_WR:关闭连接的写端,进程不能在对此套接字发出写操作 SHUT_RDWR:相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR 使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。 shutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接。
本文迁移于我的简书BLOG: https://www.jianshu.com/u/1701278837db