您的位置:首页 > 理论基础 > 计算机网络

网络编程练习-unix域套接字

2015-03-27 15:23 866 查看
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端:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: