Unix C套接字:接受正在侦听但连接被拒绝

时间:2015-07-13 22:33:46

标签: c sockets unix ipv6 getaddrinfo

我正在尝试开发一个简单的UNIX服务器,不仅限于IPv4。但是,我的示例代码“挂起”在accept()调用上,当我尝试telnet时,我在127.0.0.1和:: 1上都得到“Connection refused”。

我的代码(我标记了与/ ** /最相关的内容)

#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#include <assert.h>

main(int argc, char **argv) {
  struct addrinfo hi;
  memset(&hi, 0, sizeof(hi));
  hi.ai_family = AF_UNSPEC;
  hi.ai_socktype = SOCK_STREAM;
  hi.ai_flags = AI_PASSIVE;

  struct addrinfo *r, *rorig;

  char * port = "88";
  /**/
  if (0 != getaddrinfo(NULL, port, &hi, &r))/**/ {
    perror("ERROR getaddrinfo");
    exit(EXIT_FAILURE);
  }

  int socket_fd;
  for (rorig = r; r != NULL; r = r->ai_next) {
    /**/socket_fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol);/**/
    if (0 != bind(socket_fd, r->ai_addr, r->ai_addrlen)) break;
  }
  freeaddrinfo(rorig);
  if (r == nullptr) {
    perror("ERROR binding");
    exit(EXIT_FAILURE);
  }

  fprintf(stdout, "LISTEN, fd: %d\n",socket_fd);
  if (listen(socket_fd, 10) == -1) {
    perror("listen ERROR");
    exit(EXIT_FAILURE);
  }
  for (;;) {
    fprintf(stdout, "ACCEPT\n");
    /**/int new_fd = accept(socket_fd, NULL, NULL);/**/
    if (new_fd == -1) {
      perror("accept ERROR");
      exit(EXIT_FAILURE);
    }
    fprintf(stdout, "Opened a file descriptior %d", new_fd);
  }
}

我在这里回顾了相关问题,例如Unix C socket server not accepting connections但没有使用过getaddrinfo aproach,据我所知,它们总是限于IPv4。

任何帮助都将不胜感激。

0 个答案:

没有答案