我正在尝试开发一个简单的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。
任何帮助都将不胜感激。