关闭套接字closesocket()

    本文来自百度百科

  此函数关闭套接字s,并释放分配给该套接字的资源,以后对s 的引用都将产生错误WSAENOTSOCK。如果s涉及一个打开的TCP连接,该连接被释放。

中文名 closesocket()
注    释函数关闭一个套接口
类    型 函数
返回值 则closesocket()返回0

关闭一个套接口。

  #include <winsock.h>

  int PASCAL FAR closesocket( SOCKET s);

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

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

  选项 间隔 关闭方式 等待关闭与否

  SO_DONTLINGER 不关心 优雅 否

  SO_LINGER 零 强制 否

  SO_LINGER 非零 优雅 是

若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。

closesocket()若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。

若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

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

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。

  WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。

  WSAENOTSOCK:描述字不是一个套接口。

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

  WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。

  WSAEWOULDBLOCK:该套接口设置为非阻塞方式且SO_LINGER设置为非零超时间隔。

accept(), socket(), ioctlsocket(), setsockopt(), WSAAsyncSelect().[1]

参考资料:

扩展阅读:

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP套接字编程是一种网络编程技术,用于在计算机网络中建立TCP连接并进行数据传输。下面是一个简单的示例,展示了如何使用Python的socket库进行TCP套接字编程: ```python import socket # 创建一个TCP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定套接字到特定的IP地址和端口号 server_address = ('localhost', 8000) sock.bind(server_address) # 监听连接请求 sock.listen(1) while True: print('等待连接...') # 接受客户端的连接请求 client_sock, client_address = sock.accept() try: print('接受来自', client_address, '的连接') # 接收客户端发送的数据 data = client_sock.recv(1024) print('接收到的数据:', data.decode()) # 向客户端发送响应数据 response = 'Hello, client!' client_sock.sendall(response.encode()) finally: # 关闭客户端套接字 client_sock.close() ``` 上述示例代码中,首先创建了一个TCP套接字,并通过bind()方法绑定到一个特定的IP地址和端口号。然后使用listen()方法开始监听连接请求。接下来使用accept()方法接受客户端的连接请求,并创建一个新的套接字用于与客户端通信。 在循环中,可以通过recv()方法接收客户端发送的数据,并使用sendall()方法向客户端发送响应数据。最后使用close()方法关闭客户端套接字。 这只是一个简单的示例,TCP套接字编程还可以实现更复杂的功能,如多线程处理多个客户端连接、错误处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值