3

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?

1 Answers1

4

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.

jfly
  • 7,715
  • 3
  • 35
  • 65