closesocket()简介_closesocket()个人资料_closesocket()微博_百科网
A-A+

closesocket()简介_closesocket()个人资料_closesocket()微博

2017-12-15 06:04:33 科学百科 阅读 6 次

简述/closesocket() 编辑


  关闭一个套接口。

  #include <winsock.h>

  int PASCAL FAR closesocket( SOCKET s);

  s:一个套接口的描述字。

注释/closesocket() 编辑

  本函数关闭一个套接口。更确切地说,它释放套接口描述字s,以后对s的访问均以WSAENOTSOCK错误返回。若本次为对套接口的最后一次访问,则相应的名字信息及数据队列都将被释放。closesocket()的语义受SO_LINGER与SO_DONTLINGER选项影响,对比如下:

选项        间隔    关闭方式    等待关闭与否
SO_DONTLINGER   不关心  优雅        否
SO_LINGER   零  强制        否
SO_LINGER   非零    优雅        是

  若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
  若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
  若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

返回值/closesocket() 编辑


  如无错误发生,则closesocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

错误代码:
  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
  WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
  WSAENOTSOCK:描述字不是一个套接口。
  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
  WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
  WSAEWOULDBLOCK:该套接口设置为非阻塞方式且SO_LINGER设置为非零超时间隔。

参见:
  accept(), socket(), ioctlsocket(), setsockopt(), WSAAsyncSelect().