如何关闭套接字

Avi*_*ano 5 c++ sockets

在Ubuntu上运行c ++.我用这种方式打开socket:

socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW))
Run Code Online (Sandbox Code Playgroud)

在使用结束时我需要做什么?只要程序运行,就会使用一些套接字,我需要检查一下吗?看看socket是否仍然存在?

Ker*_* SB 11

套接字存在,直到您调用close其文件描述符.由于你有一个原始的IP套接字,所以没有"活着"的概念.完成使用后关闭它.

  • 值得补充一点,你需要`#include <unistd.h>` (10认同)
  • @ user1495181:不 - *你*向我解释为什么*应该*是一个活着的概念.套接字只允许您从网络发送和接收数据.(只有像TCP流套接字这样的专用套接字才具有活跃的概念,因为它实现了连接语义.但这是*在*IP之上.) (8认同)
  • 在调用close之前更好地调用shutdown. (3认同)
  • 你可以解释一下,或者参考为什么在原始套接字中没有关于活着的概念 (2认同)

小智 9

正如其docs/man页面所说,socket()返回一个打开的文件描述符,如果失败则返回-1.这意味着您必须关闭它,因为您将关闭任何其他文件描述符:

close(sockfd);
Run Code Online (Sandbox Code Playgroud)

  • 关闭套接字(sockfd); (2认同)