У меня есть небольшая программа с клиентом и сервером. Сервер запускается, подключается к клиенту и получает от клиента номер хоста и второго порта, а затем отправляет клиенту некоторую информацию о своем каталоге. Функция на сервере, которая отправляет данные обратно, работает примерно так:
void sendStuff(char *host, char *port) {
int sockfd, numbytes;
struct addrinfo hints, *servinfo;
struct sockaddr_storage client_info;
socklen_t addr_size;
size_t i = 0;
int rv;
// clear hints
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
memset(&servinfo, 0, sizeof(servinfo));
if ((rv = getaddrinfo(host, port, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
}
// create socket
sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if (sockfd == -1) {
perror("There was an error creating your socket.");
close(sockfd);
exit(1);
}
// connect using socket
int conn;
conn = connect(sockfd, servinfo->ai_addr, servinfo->ai_addrlen);
if (conn == -1) {
perror("Error connecting to server.");
close(sockfd);
exit(1);
}
send(sockfd, "hey!", strlen("hey!"), 0);
}
В настоящее время тестируется через localhost, который печатается на клиенте как 16.2.197.67. Это не похоже на IP-адрес локального хоста, поэтому я полагаю, что я мог каким-то образом испортить хост. Подключение к ожидающему сокету через telnet работает, но не через эту функцию.
Вы правы, @Rup, но на самом деле инициализируется указатель, так что это правильный размер для использования. Лично я бы только что написал servinfo = NULL
или даже не переживал по этому поводу. getaddrinfo
не обращает внимания на его значение при вводе.
Что ipconfig
(Windows) / ifconfig
(Linux и Macos) говорит о локальных адресах?
@dgnuff Я считаю, что localhost - 127.0.0.1. Он отображается в ifconfig
и был моим локальным IP-адресом в другой программе.
@ Ja5onHoffman Мои извинения, я должен был быть немного яснее. Мне было любопытно, отображается ли другой IP-адрес: 16.2.197.67
где-нибудь в выводе ifconfig
. И если да, то любой намек на то, с чем это связано. В моей системе работает виртуальная машина виртуального бокса, поэтому я вижу 127.0.0.1
localhost, 172.16.x.x
для моей основной сетевой карты и 192.168.10.1
для «виртуального» адаптера виртуального бокса.
@dgnuff Когда запущены и клиент, и сервер, я не вижу этот IP в выходных данных. Я случайно где-то морфирую IP? Здесь - inet_ntop(client_info.ss_family, (struct sockaddr*)&client_info, addr, sizeof addr);
@ Ja5onHoffman На данный момент я не знаю. Кроме отладчика для решения проблемы и точного изучения того, что находится в servinfo
, у меня сейчас нет идей.
Вы правы, 16.2.197.67 - это не локальный адрес ссылки. Тем не менее, это может быть текущий адрес одного из собственных сетевых интерфейсов машины.