2.3.8 关闭套接字
套接字使用完成之后,要调用下面这两个函数来关闭套接字:shutdown()函数和close()函数。
首先调用shutdown()函数,其函数定义如下:
int shutdown( int socket, int how );
第一个参数是想要关闭的套接字,第二个参数是关闭此套接字正在采用的方法。几乎所有情况下,此值都使用2,表示同时关闭发送和接收。其他两种可能的选择是0和1,分别表示关闭接收和发送。
同样,如果函数执行成功,则返回0;如果函数执行失败,则返回-1。表2.10列出了此函数可能的错误代码。
表2.10 shutdown () 函数的错误代码
|
错 误 |
含 义 |
|
ENETDOWN |
网络已经失败并断开 |
|
EINVAL |
套接字无效 |
|
EINPROGRESS |
对此函数的调用仍在进行中,因此不能完成新的调用 |
|
ENOTCONN |
套接字没有被连接 |
|
ENOTSOCK |
传递过来的套接字描述符不是真正的套接字 |
|
WSAENOTINITIALIZED(注释1) |
Socket库没有初始化 |
注释1:只适用于Winsock。
套接字关闭之后,它仍然存在于系统中。套接字维护发送或接收的任何未处理的数据,并正常停止,但套接字还没有关闭。需要再一次调用才能关闭它。
在UNIX操作系统中,套接字是文件。正是由于这个原因,所以可以使用标准的UNIX close()函数来关闭套接字。
但是,Windows套接字则不是文件,因此调用close()函数对套接字不起作用。由于这一原因,微软将函数名改为closesocket(),参数和返回值是相同的。函数定义如下:
int close( int socket );
此函数相当简单,同样,如果函数执行成功,则返回0;如果函数执行失败,则返回-1。此函数的错误代码与shutdown()函数相同,如表2.10所示。






