гетаддринфо всегда на связи даже когда нет пассивно-открытого соединения, слушайте этот порт

Я пишу серверную клиентскую программу с использованием сокетного программирования c ++ в Ubuntu.

Это код подключения клиента к серверу.

void setParent(string name,int parentPort){
struct addrinfo hints, *serverInfo , *rp;
int errcode;
char addrstr[100];
void *ptr;
int sfd;
std::string parentPortStr = std::to_string(parentPort);
memset (&hints, 0, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
hints.ai_flags    = AI_PASSIVE;
cerr << name << " " << parentPortStr << endl;
errcode = getaddrinfo (name.c_str() , parentPortStr.c_str(), &hints, &serverInfo);
if (errcode != 0)
{
cerr << "getaddrinfo has error" << endl;
return;
}

for (rp = serverInfo; rp != NULL; rp = rp->ai_next) {
cerr << "Trying next api " << rp->ai_family << " " << rp->ai_socktype << " " << rp ->ai_protocol << endl;
sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (sfd == -1)
continue;
if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1){
int enabled = 1;
setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(int));
break;
}
close(sfd);
}
freeaddrinfo(serverInfo);
if(sfd == -1){
cerr << "cannot connect to father" << endl;
return;
}
cerr << "connected to father successfuly. socket: " << sfd << endl;
fatherSocket = sfd;
return;
}

когда я вызываю этот код так: setParent («localhost», «300»); Он всегда будет принимать соединение. Не имеет значения, прослушивает ли какая-либо программа порт 7300 или нет.

Вот отладочный вывод:

setparent localhost 300
localhost 7300
Trying next api 2 1 6
connected to father successfully. socket: 5

и это не имеет значения, если я изменю порт. Он всегда пробует API с ai_family: 2, ai_socktype: 1, ai_protocol: 6 и будет успешно подключаться к нему.

Вот результат «sudo netstat -tulpn»:

tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      1163/dnsmasq
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      4814/cupsd
tcp6       0      0 ::1:631                 :::*                    LISTEN          4814/cupsd
udp        0      0 0.0.0.0:45464           0.0.0.0:*                           601/avahi-daemon: r
udp        0      0 0.0.0.0:631             0.0.0.0:*                           989/cups-browsed
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           601/avahi-daemon: r
udp        0      0 0.0.0.0:26517           0.0.0.0:*                           5053/dhclient
udp        0      0 127.0.1.1:53            0.0.0.0:*                           1163/dnsmasq
udp        0      0 0.0.0.0:68              0.0.0.0:*                           5053/dhclient
udp6       0      0 :::50297                :::*                                601/avahi-daemon: r
udp6       0      0 :::5353                 :::*                                601/avahi-daemon: r
udp6       0      0 :::46583                :::*                                5053/dhclient

Как видите, никто не слушает порт 7300.

Я не могу понять, что там происходит.

0

Решение

Как вы видите из своего netstat Дисплей, никто не подключен к 7300 либо.

Вы проверяете не ту вещь. Вы должны проверить, enabled стал 1. connect() не будет (не может) волшебным образом установить sfd до -1, если это не удается.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]