重用linux abstract namespace socket

时间:2017-01-21 23:09:31

标签: c linux sockets server

我想在一个服务器会话期间重用一个抽象套接字地址。我试图关闭套接字并再次绑定它们,但它不起作用。

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;
}

我应该怎样做才能重复使用多次?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在这一行中:tempadres.sun_path[0]='0''0'不是空字节,抽象套接字对sun_path字段的第一个字节需要什么。所以它不会被视为抽象套接字。将其更改为tempadres.sun_path[0]=0tempadres.sun_path[0]='\0'

PS:您的server.c还有另一个问题,您没有将workmanaddr归零,因此sun_path很可能包含strcpy(workmanaddr.sun_path+1,"name");即使你调用sun_path并且附加了一个空字节,因为它在堆栈上分配了垃圾值,因为<li>中的所有剩余字节都定义了&#34; name&#34;套接字。它会导致与客户端的套接字名称不同,导致客户端连接被拒绝。