Sto facendo alcuni test con i socket di dominio Unix e posso comunicare su di essi senza un problema, tuttavia, quando chiamo accept()
sul lato server del mio programma di test, restituito struct sockaddr_un
non contiene uno sun_path
.Socket di dominio Unix: accept() non impostazione sun_path
Sono abbastanza sicuro che le prese Inet abbiano il loro indirizzo e la porta correttamente compilati dopo una chiamata accept()
, quindi sto facendo qualcosa di sbagliato nel mio programma di test o mi aspetto un risultato sbagliato?
Sono in esecuzione CentOS 6.2 e gcc 4.4.6.
CodiceEsempio:
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;
}
Giusto per ribadire la domanda:
Perché non sun_path
viene compilato dopo la Chiamata accept()
sul server?
Davvero un miracolo ... 'len' diventa' 2' che è 'sizeof (sa_family_t)' e secondo l'uomo questo può accadere solo quando il socket non è associato, ma nel tuo caso è chiaramente vincolato ... – kirelagin
Ho anche provato con prese astratte e, ancora, questa lunghezza è sempre '2' che è chiaramente sbagliata, che si accosta alla pagina man. – kirelagin
Penso che questo potrebbe essere normale. Come i socket restituiti da 'socketpair()', questi tipi di socket non sono associati a nessun percorso, ma sono comunque connessi a un altro socket all'altro capo. – Celada