Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。
struct sockaddr结构类型是用来保存socket信息的:
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
struct in_addr其实就是32位IP地址
struct in_addr {
unsigned long s_addr;
};
sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。 另外还有一种结构类型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */
};
这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。
#include <sys/un.h>
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /*PF_UNIX或AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* 路径名 */
};
UNIX域结构体定义,关于AF_INET和PF_INET:AF = Address Family PF = Protocol Family
在Linux中如果是BSD就是AF,如果是POSIX就是PF相互混淆也没有太大问题
在函数socketpair与socket的domain参数中有AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET. 这几个参数有AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET. 但是对于socketpair与socket的domain参数,使用PF_LOCAL系列, 而在初始化套接口地址结构时,则使用AF_LOCAL. 例如: z = socket(PF_LOCAL, SOCK_STREAM, 0); adr_unix.sin_family = AF_LOCAL;
程序例子:SERVER.C
....................
struct sockaddr_un address;
int sock, conn;
size_t addrLength;
if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
die("socket");
/* Remove any preexisting socket (or other file) */
unlink("./sample-socket");
address.sun_family = AF_UNIX; /* Unix domain socket */
strcpy(address.sun_path, "./sample-socket");
/* The total length of the address includes the sun_family
element */
addrLength = sizeof(address.sun_family) +
strlen(address.sun_path);
if (bind(sock, (struct sockaddr *) &address, addrLength))
die("bind");
if (listen(sock, 5))
die("listen");
while ((conn = accept(sock, (struct sockaddr *) &address,
&addrLength)) >= 0) {
printf("---- getting data\n");
copyData(conn, 1);
printf("---- done\n");
close(conn);
}
CLIENT.C
..........
struct sockaddr_un address;
int sock;
size_t addrLength;
if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
die("socket");
address.sun_family = AF_UNIX; /* Unix domain socket */
strcpy(address.sun_path, "./sample-socket");
/* The total length of the address includes the sun_family
element */
addrLength = sizeof(address.sun_family) +
strlen(address.sun_path);
if (connect(sock, (struct sockaddr *) &address, addrLength))
die("connect");
copy from many blogs here!