进程通信之六 UDS

本文介绍了Unix Domain Socket (UDS),一种用于本机进程间高效通信的方式。它免去了双机通信中的协议处理,用法类似普通Socket,包括socket、bind、listen、connect、read、write和close等步骤。

简介

Socket原本是被应用于双机通信,之后引入了Unix Domain Socket。该Socket应用于本机的进程之间,由于其去掉了复杂的协议处理过程,效率会高普通Socket。其用法与普通Socket基本相同。也需要经历socket,bind,listen,connect,read,write,close等阶段。

示例:

/*
 * =====================================================================================
 *
 *       Filename:  uds_server_ipc.c
 *
 *    Description: IPC using UDS for server 
 *
 *        Version:  1.0
 *        Created:  2012年02月22日 10时43分40秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  chn89, chn89@126.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include <netinet/in.h>		
#include <sys/types.h>	
#include <sys/un.h>		
#include <sys/socket.h>		
#include <stdio.h>		
#include <unistd.h>		
#include <stdlib.h>	
#include <string.h>		

#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)
{
	struct sockaddr_un server_addr;

	bzero(&server_addr, sizeof(server_addr));

	server_addr.sun_family = AF_UNIX;
    strcpy(server_addr.sun_path,"./connetion");
    int len = sizeof(server_addr.sun_family)+strlen(server_addr.sun_path);

    unlink("./connetion");

	int server_socket = socket(PF_UNIX, SOCK_STREAM, 0);
	if (server_socket < 0) {
		printf("Create Socket Failed!");
		exit(1);
	}
    /*没整明白,为什么一定有下面这段,不然bind会出错,请明白的指教*/  
	{
		int opt = 1;
		setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt,
			   sizeof(opt));
	}

	if (bind(server_socket, (struct sockaddr *)&server_addr,len)) {
		printf("Server Bind  Failed!");
		exit(1);
	}

	if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) {
		printf("Server Listen Failed!");
		exit(1);
	}
	while (1)		//一直运行
	{
		struct sockaddr_in client_addr;
		socklen_t length = sizeof(client_addr);

		int new_server_socket = accept(server_socket, (struct sockaddr *)&client_addr, &length);
		if (new_server_socket < 0) {
			printf("Server Accept Failed!\n");
			break;
		}

		char buffer[BUFFER_SIZE];
		bzero(buffer, BUFFER_SIZE);
		length = recv(new_server_socket, buffer, BUFFER_SIZE, 0);
		if (length < 0) {
			printf("Server Recieve Data Failed!\n");
			break;
		}

		char file_name[FILE_NAME_MAX_SIZE + 1];
		bzero(file_name, FILE_NAME_MAX_SIZE + 1);
		strncpy(file_name, buffer,strlen(buffer) >
			FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE :strlen(buffer));
		printf("%s\n", file_name);
		FILE *fp = fopen(file_name, "r");
		if (NULL == fp) {
			printf("File:\t%s Not Found\n", file_name);
		} else {
			bzero(buffer, BUFFER_SIZE);
			int file_block_length = 0;
			while ((file_block_length = fread(buffer, sizeof(char), BUFFER_SIZE,fp)) > 0) {
				printf("file_block_length = %d\n",file_block_length);
				if (send(new_server_socket, buffer,file_block_length, 0) < 0) {
					printf("Send File:\t%s Failed\n",file_name);
					break;
				}
				bzero(buffer, BUFFER_SIZE);
			}
			fclose(fp);
			printf("File:\t%s Transfer Finished\n", file_name);
		}
		close(new_server_socket);
	}
	close(server_socket);
	return 0;
}
/*
 * =====================================================================================
 *
 *       Filename:  uds_client_ipc.c
 *
 *    Description: IPC using UDS for client 
 *
 *        Version:  1.0
 *        Created:  2012年02月23日 10时43分40秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  chn89, chn89@126.com
 *   Organization:  
 *
 * =====================================================================================
 */
#include <netinet/in.h>		
#include <sys/types.h>	
#include <sys/socket.h>		
#include <sys/un.h>		
#include <stdio.h>		
#include <stdlib.h>		
#include <string.h>		

#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)
{
	struct sockaddr_un client_addr;
	bzero(&client_addr, sizeof(client_addr));	
	client_addr.sun_family = AF_UNIX;	
    strcpy(client_addr.sun_path,"./connetion");
    int len = sizeof(client_addr.sun_family)+strlen(client_addr.sun_path);

	int client_socket = socket(AF_UNIX, SOCK_STREAM, 0);
	if (client_socket < 0) {
		printf("Create Socket Failed!\n");
		exit(1);
	}
    {
		int opt = 1;
		setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &opt,
			   sizeof(opt));
	}
	if (connect(client_socket, (struct sockaddr *)&client_addr,len) < 0) {
		printf("Can Not Connect To %s!\n", argv[1]);
		exit(1);
	}

	char file_name[FILE_NAME_MAX_SIZE + 1];
	bzero(file_name, FILE_NAME_MAX_SIZE + 1);
	printf("Please Input File Name On Server:\t");
	scanf("%s", file_name);

	char buffer[BUFFER_SIZE];
	bzero(buffer, BUFFER_SIZE);
	strncpy(buffer, file_name,strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));
	send(client_socket, buffer, BUFFER_SIZE, 0);

	FILE *fp = fopen("new", "w");
	if (NULL == fp) {
		printf("File:\t%s Can Not Open To Write\n", file_name);
		exit(1);
	}
	bzero(buffer, BUFFER_SIZE);
	int length = 0;
	while (length = recv(client_socket, buffer, BUFFER_SIZE, 0)) {
		if (length < 0) {
			printf("Recieve Data From Server Failed!\n");
			break;
		}
		int write_length = fwrite(buffer, sizeof(char), length, fp);
		if (write_length < length) {
			printf("File:\t%s Write Failed\n", file_name);
			break;
		}
		bzero(buffer, BUFFER_SIZE);
	}
	printf("Recieve File:\t %s  Finished\n", file_name);

	close(fp);
	close(client_socket);
	return 0;
}




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值