如何关闭套接字(socket)

11

如何在Ubuntu上运行C++程序。 我使用以下方式打开套接字:

socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW))

在使用结束后,我需要做些什么?有些套接字将在程序运行时一直被使用,我需要定期检查它们吗?以确保套接字仍然存在吗?


2
@Ulterior,你不知道它的正确名称是如何达到501声望的? - user529758
我对这种低级编程很陌生,请见谅。我是Java开发人员,不需要涉及网络编程。 - Avihai Marchiano
1
似乎这个问题也将被视为文件描述符并被close()关闭。 - user529758
1
@H2CO3:是因为它的声誉返回了“-1”吗? - Kerrek SB
@KerrekSB :D 不,如果返回-1,则表示创建失败,因此没有需要关闭的内容。 - user529758
2个回答

15

当你在文件描述符上调用 close 方法时,套接字才会被销毁。由于你拥有一个原始的IP套接字,没有“存活”的概念,所以在使用完它后立即关闭即可。


3
你能否解释一下或提供参考资料,为什么在原始套接字中没有“存活”的概念?原始套接字是一种高级网络编程技术,允许程序直接访问和操作网络层数据包。与普通套接字不同,原始套接字没有“存活”概念,因为它们不依赖于传输层协议(如TCP或UDP),而是直接处理网络层数据包。因此,在原始套接字中,无法像普通套接字一样使用keep-alive选项来检测连接的状态。 - Avihai Marchiano
8
@user1495181: 不,你向我解释为什么应该有“活着”的概念。Socket只是让你可以在网络上发送和接收数据的工具。(只有像TCP流套接字这样的专用套接字才有“存活性”的概念,因为它实现了连接语义,但这是建立在IP之上的。) - Kerrek SB
3
在调用close之前最好先调用shutdown。 - kroiz
22
值得注意的是,你需要加入 #include <unistd.h> - S.R

11
如其文档/手册所述,socket() 返回一个打开的文件描述符或-1(如果失败)。这意味着您必须像关闭任何其他文件描述符一样关闭它:
close(sockfd);

2
closesocket(sockfd); - Richard Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接