Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reusing linux abstract namespace socket

I would like to reuse one abstract socket adress during one server session. I tried to close sockets and bind them again, but it isn't working.

server.c:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

int main()
{
    struct sockaddr_un workmanaddr;
    workmanaddr.sun_family=AF_UNIX;
    strcpy(workmanaddr.sun_path+1,"name");
    workmanaddr.sun_path[0]='0';
    char buf[255];
    int sd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if(sd <0)
    {
        perror("socket() error");
        exit(2);
    }
    if((bind(sd , (struct sockaddr *)&workmanaddr,sizeof(workmanaddr)))<0)
    {
        perror("bind() error");
        exit(3);
    }
    while(true)
    {
        recv(sd, buf, sizeof(buf), 0);
        printf("%s\n",buf);
        close(sd);
        sd = socket(AF_UNIX, SOCK_DGRAM, 0);
        if(sd <0)
        {
            perror("socket() error");
            exit(2);
        }
        if((bind(sd , (struct sockaddr*)&workmanaddr,sizeof(workmanaddr)))<0)
        {
            perror("bind() error");
            exit(3);
        }        
    }
    return 0;
}

client.c:

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
int main(int argc, char *argv[])
{
    char _path[108]="name";
    struct sockaddr_un tempadres = {0};
    int tmpsock;
    tmpsock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if(tmpsock<0)
    {
        perror("socket() error");
        exit(2);
    }
    tempadres.sun_family=AF_UNIX;
    strcpy(tempadres.sun_path+1,_path);
    tempadres.sun_path[0]='0';
     if((connect(tmpsock, (struct sockaddr *)&tempadres,sizeof(tempadres)))<0)
     {
         perror("connect() error");
         exit(3);
     }
    char buf[255];
        scanf("%s",buf);
        if(send(tmpsock, buf, sizeof(buf), 0)<0)
        {
            perror("send() error");
            exit(4);
        }
    return 0;
}

What should I do to make it possible to reuse it many times? Any advices?

like image 415
annamataris Avatar asked Sep 11 '26 06:09

annamataris


1 Answers

In this line: tempadres.sun_path[0]='0','0' is not null byte what abstract socket requires for the first byte of the sun_path field. So it wouldn't be regarded as abstract socket. Change it to tempadres.sun_path[0]=0 or tempadres.sun_path[0]='\0'.


PS: there is another problem in your server.c, you didn't zero out workmanaddr, so the sun_path is very likely to contain garbage value as it's allocated on the stack even though you called strcpy(workmanaddr.sun_path+1,"name"); and a null byte is appended because all the remaining bytes in sun_path define the "name" of the socket. it would lead to different socket names with the client, resulting in connection refused on client side.

like image 84
jfly Avatar answered Sep 12 '26 23:09

jfly