ich versuche gerade Ein TCP-Programm in C zu schreiben und komme nicht wo wirklich weiter. Das sieht in etwa so aus:
Code: Alles auswählen
struct addrinfo h, *r, *r0;;
memset(&h, 0, sizeof(h));
h.ai_family = AF_UNSPEC;
h.ai_socktype = SOCK_STREAM;
h.ai_flags = AI_PASSIVE;
h.ai_protocol = IPPROTO_TCP;
int e, servSock = -1;
e = getaddrinfo(NULL, portnum, &h, &r0);
if (e)
exit(1);
for (struct addrinfo *addr = r0; addr != NULL; addr = addr->ai_next) {
servSock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
if (servSock < 0)
continue;
if((!bind(servSock, addr->ai_addr, addr->ai_addrlen)) && (!listen(servSock, 23)))
[…]
Also habe ich mir mal Hilfe geholt: http://mirror7.meh.or.id/Programming/tc ... amming.pdf
Da (und überall anders) steht, dass ich einfach die erste Adresse nehmen soll und dass dass für einen Dualstack-Rechner dann die IPv6 adresse ist und die dann auch über IPv4 über die kompatibilitätsadressen erreichbar ist.
Problem1 (Harmos): Ich hätte dann nur die Komptibilitätsadresse. Das ist eher unschön. gerade, wenn man sich dann die Client Adresse holt, muss man die jedes mal zurückübersetzen. Außerdem ist meine IPv4 connectivität weg /proc/sys/net/ipv6/bindv6only auf 1 steht. Die anderen Serverprogramme können das richtig und binden auf beides.
Problem2: Entgengen aller Beteuerungen bekomme ich aber zuerst die IPv4 Adresse zurück. Ich könnte das dadurch behebn, dass ich AF_INET6 setze, dann funktioniert das Programm aber nicht mehr wenn man keine IPv6 unterstützung hat. Immer die letzte zu nehmen scheint auch keine gute Idee zu sein, weil eigentlich sollte es ja anders herum sein.