2017-01-21 2 views
3

1つのサーバセッション中に1つの抽象ソケットアドレスを再利用したいと思います。ソケットを閉じて再度バインドしようとしましたが、動作しません。linux抽象名前空間ソケットを再利用する

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

"それは機能していません"とはどういう意味ですか?何が起こると予想され、実際に何が起こるのですか? – augurar

+0

関連:https://unix.stackexchange.com/questions/216784/does-linux-automatically-clean-up-abstract-domain-sockets – augurar

+0

'tempadres.sun_path [0] = '0';' '0'は関連していますnullバイトではありません! – jfly

答えて

2

この行にはtempadres.sun_path[0]='0','0'はnullバイトではありません。sun_pathフィールドの最初のバイトにはどの抽象ソケットが必要ですか。したがって、抽象ソケットとはみなされません。それをtempadres.sun_path[0]=0またはtempadres.sun_path[0]='\0'に変更します。


PS:別の問題は、あなたのserver.cであり、あなたはworkmanaddrをゼロにしませんでしたので、sun_pathはあなたがstrcpy(workmanaddr.sun_path+1,"name");と呼ばれるにもかかわらず、それがスタックに割り当てられていますとしてごみ値が含まれている可能性が非常に高いですsun_pathのすべての残りのバイトがソケットの「名前」を定義するため、nullバイトが追加されます。クライアントとのソケット名が異なるため、クライアント側で接続が拒否されます。

関連する問題