#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<sys/stat.h>
#include<sys/un.h>
static void bail(char* on_what){
perror(on_what);
exit(1);
}
int main(int argc,char**argv){
int z;
int sck_unix;
struct sockaddr_un adr_unix;
int len_unix;
const char path_unix[]="/tmp/my_sock";
sck_unix=socket(AF_UNIX,SOCK_STREAM,0);
if(sck_unix==-1) bail("create");
unlink(path_unix);
memset(&adr_unix,0,sizeof(adr_unix));
adr_unix.sun_family=AF_UNIX;
strncpy(adr_unix.sun_path,path_unix,sizeof(adr_unix.sun_path)-1)[sizeof(adr_unix.sun_path)-1]=0;
len_unix=SUN_LEN(&adr_unix);
z=bind(sck_unix,(struct sockaddr*)&adr_unix,len_unix);
if(z==-1) bail("bind()");
system("netstat -pa --unix");
//"sed -n '/^Active UNIX/,/^Proto/p'");
close(sck_unix);
unlink(path_unix);
return 0;
}
运行结果:
unix 2 [ ] STREAM 29132 3773/a.out /tmp/my_sock
可以看到是用一个本地地址生成的套接口
缺陷是总有一个本地文件系统对象的生成。下面为抽象本地地址的生成
代码:
int main(int argc,char**argv){
int z;
int sck_unix;
struct sockaddr_un adr_unix;
int len_unix;
const char path_unix[]="Z*my_socket";
sck_unix=socket(AF_UNIX,SOCK_STREAM,0);
if(sck_unix==-1) bail("create");
unlink(path_unix);
memset(&adr_unix,0,sizeof(adr_unix));
adr_unix.sun_family=AF_UNIX;
strncpy(adr_unix.sun_path,path_unix,sizeof(adr_unix.sun_path)-1)[sizeof(adr_unix.sun_path)-1]=0;
len_unix=SUN_LEN(&adr_unix);
adr_unix.sun_path[0]=0;
z=bind(sck_unix,(struct sockaddr*)&adr_unix,len_unix);
if(z==-1) bail("bind()");
system("netstat -pa --unix");
//"sed -n '/^Active UNIX/,/^Proto/p'");
close(sck_unix);
unlink(path_unix);
return 0;
}
结果:
unix 2 [ ] STREAM 29664 3803/a.out @*my_socket