正确关闭unix套接字的方法

问题描述

我正在使用从this link获得的这段代码

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

#define DATA "Hello world"


int main()
{
  int sock;
  struct sockaddr_un server;

  sock = socket(AF_UNIX,SOCK_STREAM,0);
  if (sock < 0) {
      perror("opening stream socket");
      exit(1);
  }

  server.sun_family = AF_UNIX;
  strcpy(server.sun_path,"/tmp/foo.sock");

  int con = connect(sock,(struct sockaddr *) &server,sizeof(struct sockaddr_un));
  if (con < 0) {
      close(sock);
      perror("connecting stream socket");
      exit(1);
  }

  const char * D = "Hello World!";
  if (write(sock,DATA,sizeof(DATA)) < 0)
      perror("writing on stream socket");

  close(sock);

  // QUESTION
  // close(con);   // should I include this line?

  return 0;
}

只要服务器在侦听数据,此代码就起作用。

无论如何我的问题是,我是否还应该像最后con一样关闭连接close(con);

如果发现您确实必须关闭连接,那么这表明您不应该从Internet复制和粘贴代码。我只想确保此代码不会引起内存泄漏。

解决方法

我还应该像最后var.function_name一样关闭连接con吗?

否,因为那不是“连接”。看看man 2 connect

返回值

如果连接或绑定成功,则返回零。如果出错,则返回-1,并正确设置close(con);

您的errno等于con的返回值,因此它是connect表示成功或0表示错误。它不是文件描述符,因此您不应尝试将其关闭。

我建议您重命名变量(例如,重命名为-1)或只检查res条件的内部:

if

我只想确保此代码没有内存泄漏。

无论如何您都不会。当程序完成运行时,操作系统将自动关闭所有文件描述符。如果您打开文件描述符(如if (connect(sock,(struct sockaddr *) &server,sizeof(struct sockaddr_un)) == -1) { close(sock); perror("connecting stream socket"); exit(1); } )并一直使用到程序结束,则甚至不必sock(尽管这是一个好习惯)。通常,正常程序永远不会关闭标准输入,标准输出和标准错误文件描述符。

,

% IANA WHOIS server % for more information on IANA,visit http://www.iana.org % This query returned 1 object domain: ଭାରତ domain-ace: XN--3HCRJ9C 返回0(成功)或-1(错误),而不是连接。关闭0将关闭程序的connect()。关闭-1是一个错误,不会再有其他后果。无论哪种情况,您都关闭stdin