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

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端:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值