Ich mache ein paar Tests mit Unix-Domain-Sockets und ich kann über sie ohne ein Problem kommunizieren jedoch, wenn ich auf der Serverseite meines Testprogramms accept()
aufrufen, die zurückgegebene struct sockaddr_un
enthält keine sun_path
.Unix Domain Sockets: accept() nicht set sun_path
Ich bin mir ziemlich sicher, dass die Inet-Buchsen ihre Adresse und ihren Port nach einem accept()
-Aufruf korrekt ausgefüllt haben, also mache ich etwas falsch in meinem Testprogramm oder erwarte ich das falsche Ergebnis?
Ich benutze CentOS 6.2 und gcc 4.4.6.
Beispielcode:
server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NAME "socket"
int main(int argc, char **argv)
{
int sock, msgsock, rval;
struct sockaddr_un server, client;
char buf[1024];
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, NAME);
if (bind(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un))) {
perror("binding stream socket");
exit(1);
}
printf("Socket has name %s\n", server.sun_path);
listen(sock, 5);
for (;;) {
socklen_t len = sizeof(client);
msgsock = accept(sock, (struct sockaddr *)&client, &len);
if (msgsock == -1)
perror("accept");
else do {
printf("strlen(sun_path) = %zu\n", strlen(client.sun_path));
bzero(buf, sizeof(buf));
if ((rval = read(msgsock, buf, 1024)) < 0)
perror("reading stream message");
else if (rval == 0)
printf("Ending connection\n");
else
printf("-->%s\n", buf);
} while (rval > 0);
close(msgsock);
}
close(sock);
unlink(NAME);
return 0;
}
client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DATA "Half a league, half a league . . ."
int main(int argc, char **argv)
{
int sock;
struct sockaddr_un server;
if (argc < 2) {
printf("usage:%s <pathname>", argv[0]);
exit(1);
}
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, argv[1]);
if (connect(sock, (struct sockaddr *) &server,
sizeof(struct sockaddr_un)) < 0) {
close(sock);
perror("connecting stream socket");
exit(1);
}
if (write(sock, DATA, sizeof(DATA)) < 0)
perror("writing on stream socket");
close(sock);
return 0;
}
einfach die Frage zu wiederholen:
Warum sun_path
nicht nach dem ausgefüllten accept()
Anruf auf dem Server?
Wahrlich ein Wunder ... 'len' wird' 2' das ist 'sizeof (sa_family_t)' und laut Mann kann das nur passieren, wenn der Socket ungebunden ist, aber in deinem Fall ist es eindeutig gebunden ... – kirelagin
habe ich auch ausprobiert mit abstrakten Sockets und wiederum ist diese Länge immer '2' was eindeutig falsch ist, entsprechend der Manpage. – kirelagin
Ich denke, das könnte normal sein. Wie Sockets, die von 'socketpair()' zurückgegeben werden, sind diese Socket-Typen nicht an einen Pfad gebunden, aber sie sind trotzdem mit einem anderen Socket am anderen Ende verbunden. – Celada