Это происходит потому, что по умолчанию сокеты AF_INET6 фактически работают как для IPv4, так и для IPv6. См. раздел 3.7 - Совместимость с узлами IPv4 в RFC 3493 - Расширения базового интерфейса сокетов для IPv6
Вот краткий пример кода, который может привести к подобной ситуации:
#include
#include
#include
#define TEST_PORT 5555
#define xstr(s) str(s)
#define str(x) #x
int main (int argc, char **argv)
{
int v6server;
int v4client;
int rc;
struct sockaddr_in6 s6addr = {
.sin6_family = AF_INET6,
.sin6_flowinfo = 0,
.sin6_port = htons(TEST_PORT),
.sin6_addr = in6addr_any
};
struct sockaddr_in c4addr = {
.sin_family = AF_INET,
.sin_port = htons(TEST_PORT),
.sin_addr = inet_addr("127.0.0.1")
};
// Open an IPv6 listener
v6server = socket(AF_INET6, SOCK_STREAM, 0);
if (v6server < 0) perror("socket()");
rc = bind(v6server, (struct sockaddr *)&s6addr, sizeof(s6addr));
if (rc != 0) perror("bind()");
rc = listen(v6server, 0);
if (rc != 0) perror("listen()");
// Connect to the listener with an IPv4 socket
v4client = socket(AF_INET, SOCK_STREAM, 0);
if (v4client < 0) perror("socket()");
rc = connect(v4client, (struct sockaddr *)&c4addr, sizeof(c4addr));
if (rc != 0) perror("connect()");
// inspect open sockets
system("netstat -tan | grep " xstr(TEST_PORT));
close(v4client);
close(v6server);
}
Вывод на моей машине Ubuntu:
$ make v4v6
cc v4v6.c -o v4v6
$ ./v4v6
tcp 0 0 127.0.0.1:46518 127.0.0.1:5555 ESTABLISHED
tcp6 0 0 :::5555 :::* LISTEN
tcp6 0 0 127.0.0.1:5555 127.0.0.1:46518 ESTABLISHED
$
tcp6 LISTEN
предназначена для сокета, прослушивающего порт 5555. Обратите внимание, что это сокет AF_INET6, поэтому он будет принимать входящие соединения IPv4 и IPv6. tcp ESTABLISHED
является результатом подключения сокета AF_INET4 к прослушивателю (активное соединение). tcp6 ESTABLISHED
предназначена для пассивного соединения, порожденного из сокета слушателя. Он отображается как tcp6
, поскольку порождается слушателем tcp6
; однако он представляет собой соединение с IPv4.Стоит отметить следующее:
Ha deshabilitado el modo de inserción de imagen de tecla, pero no el modo básico ISO 14755. Para deshabilitar ambos, establezca ambos en falso.
URxvt.iso14755: false
URxvt.iso14755_52: false
Después de cambiar ~/.Xresources
, vuelva a cargar el archivo con
xrdb -merge <~/.Xresources