接受套接字函数超时

时间:2016-02-04 16:47:40

标签: c sockets unix

我试图在接受套接字函数上设置超时但没有成功。我希望接受功能块直到超时延迟结束。 是否可以不设置接受功能非阻塞? 我已经尝试了许多可能性而没有成功。

感谢您的回答。

以下是我的代码:

struct timeval tv;
fd_set readfds;

tv.tv_sec = 1;
tv.tv_usec = 0;

int s, s_remote;
struct sockaddr_un remote;
struct sockaddr_un local;

if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
  perror("socket");
  exit(1);
}

FD_ZERO(&readfds);
FD_SET(s, &readfds);

if (select(s+1, &readfds, NULL, NULL, &tv) > 0) {

  printf("Waiting for a connection...\n");

  memset(&local, 0, sizeof(local));
  local.sun_family = AF_UNIX;
  strcpy(local.sun_path, SOCK_PATH);
  unlink(local.sun_path);

  if (bind(s, (struct sockaddr *)&local, sizeof(local)) == -1) {
    perror("UnixSocketClient :: error bind.\n");
    close(s);
    return -1;
  }

  if (listen(s, 5) == -1) {
    perror("UnixSocketClient :: error listen.\n");
    close(s);
    return -1;
  }

  socklen_t remote_len = sizeof(remote);
  printf("Accept :\n\r");

  if ((s_remote = accept(s, (struct sockaddr *)&remote, &remote_len)) == -1) {
    perror("UnixSocket :: error accept.\n");
    return -1;
  }
  printf("Client accepted\n\r");
}

2 个答案:

答案 0 :(得分:1)

你的代码毫无意义。你必须打电话:

  • 插座()
  • bind()的
  • 听()
  • select()的
  • 接受()
按顺序

答案 1 :(得分:0)

在侦听套接字呼叫select()上设置超时设置,如果accept()没有超时,则只调用select()

更新

上述方法(实际上与this answer中的相同)确实引入了种族,正如本答案的评论中所讨论的那样。如果选择返回表示传入连接,则在调用accept之前存在(短)延迟。如果在此延迟期间连接消失,则accept()将阻止。

解决此问题的唯一方法是在调用accept()时使用非阻塞套接字。

如果要求(出于任何原因)是使用阻塞套接字,那么可能的解决方案是向accept()中阻止的进程发送信号,使其返回值{{ 1}}并-1设置errno

EINTR