unix域协议并不是一个实际的协议族,而是一种用在单个主机中进程间通信的方式。
unix域提供两类套接字:字节流套接字(类似TCP)和数据报套接字(类似UDP)。
除了用于常用的进程间通信,还可用于在在不同进程中间传递描述符。
unix域套接字也可以将客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。
<span style="font-size:14px;">/*************************************************************
* file: unix_sock_cs.c
* brief:文件描述符传送发送端
* yejing@2015.3.27 1.0 creat
*************************************************************/
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/un.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <pthread.h>
#define TMP_PATH "/ipcteam/yejingyf2/data/sth/yejing"
#if defined(SERVER)
void* send_data_task(void* param_buf){
if(!param_buf){
fprintf(stderr, "%s param error, NULL pointer. \n", __func__);
return NULL;
}
int sockfd = *(int *)param_buf;
while(1){
printf("sending data... \n");
char buf[10] = "asdfghjkl";
send(sockfd, buf, 10, 0);
sleep(1);
}
return NULL;
}
int main(int argc, char* argv[]){
socklen_t clnt_len;
int sockfd, ret, size, connfd;
struct sockaddr_un sock_un, sock_clnt;
sock_un.sun_family = AF_UNIX;
strcpy(sock_un.sun_path, TMP_PATH);
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(!sockfd){
fprintf(stderr, "socket creat error. \n");
return -1;
}
unlink(TMP_PATH);
size = offsetof(struct sockaddr_un, sun_path) + strlen(sock_un.sun_path);
ret = bind(sockfd, (const struct sockaddr*)&sock_un, size);
if(ret < 0){
fprintf(stderr, "socket bind error. \n");
return -1;
}
listen(sockfd, 13);
while(1){
connfd = accept(sockfd, (struct sockaddr*)&sock_clnt, &clnt_len);
if(connfd){
pthread_t tmp_task_id;
pthread_create(&tmp_task_id, NULL, send_data_task, &connfd);
}
}
}
#else
int main(int argc, char* argv[]){
int sockfd, ret;
char buf[1024];
struct sockaddr_un sock_un;
sock_un.sun_family = AF_UNIX;
strcpy(sock_un.sun_path, TMP_PATH);
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(!sockfd){
fprintf(stderr, "socket create error. \n");
return -1;
}
ret = connect(sockfd, (struct sockaddr*)&sock_un, sizeof(sock_un));
if(ret < 0){
fprintf(stderr, "socket connect error. \n");
return -1;
}
while(1){
memset(buf, 0, sizeof(buf));
ret = recv(sockfd, buf, 10, 0);
if(ret){
int i = 0;
for(i = 0; i < ret; ++i)
printf("%c", buf[i]);
printf("\n");
}
}
}
#endif</span>
server端:
client端: