Linux Local Socket 进程间通信入门

server:

#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_NAME "/tmp/9Lq7BNBnBycd6nxy2.socket"
#define BUFFER_SIZE 12

/**
 * https://man7.org/linux/man-pages/man7/unix.7.html
 */
int main() {
	int down_flag = 0;
	int connection_socket = 0;
	struct sockaddr_un name;
	int ret;
	int addrlen = sizeof(name);
	char buffer[1024];

	connection_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
	if (connection_socket == -1) {
		perror("socket");
		exit(EXIT_FAILURE);
	}

	memset(&name, '0', addrlen);
	name.sun_family = AF_UNIX;
	strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);

	ret = bind(connection_socket, (const struct sockaddr*) &name, sizeof(name));
	if (ret == -1) {
		perror("bind");
		exit(EXIT_FAILURE);
	}

	if (listen(connection_socket, 20) < 0) {
		perror("listen");
		goto exit;
	}

	while (1) {
		printf("start accept \n");
		int clientFd = accept(connection_socket, NULL, NULL);
		if (clientFd < 0) {
			perror("accept");
			exit(EXIT_FAILURE);
		}
		printf("new connection \n");
		while (1) {
			int length = read(clientFd, buffer, 1023);
			if (length <= 0) {
				printf("read error \n");
				perror("read error");
				break;
			}
			buffer[length] = '\0';
			printf("%s\n", buffer);
			if (strcmp(buffer, "close") == 0) {
				printf("%s\n", "close");
				down_flag = 1;
				break;
			}
			write(clientFd, buffer, length);
		}
		close(clientFd);
		if (down_flag) {
			break;
		}
		sleep(1);
	}
	exit:
	close(connection_socket);
	unlink(SOCKET_NAME);
	return EXIT_SUCCESS;
}

客户端:

#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_NAME "/tmp/9Lq7BNBnBycd6nxy2.socket"
#define BUFFER_SIZE 12

/**
 * https://man7.org/linux/man-pages/man7/unix.7.html
 */
int main() {
	int data_socket = 0;
	struct sockaddr_un addr;
	int ret;
	int addrlen = sizeof(addr);

	char buffer2[124];
	data_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0);
	if (data_socket == -1) {
		perror("socket");
		return EXIT_FAILURE;
	}

	memset(&addr, '0', addrlen);
	addr.sun_family = AF_UNIX;
	strncpy(addr.sun_path, SOCKET_NAME, sizeof(addr.sun_path) - 1);

	ret = connect(data_socket, (const struct sockaddr*) &addr, sizeof(addr));
	if (ret == -1) {
		perror("bind");
		return EXIT_FAILURE;
	}
	char buffer[] = "For portability clear the whole structure";
	ret = write(data_socket, buffer, strlen(buffer) + 1);

	int length = read(data_socket, buffer2, strlen(buffer2));
	buffer2[length] = '\0';
	printf("result: %s", buffer2);

	strcpy(buffer, "close");
	ret = write(data_socket, buffer, strlen(buffer) + 1);
	printf("%s\n", "exit now");
	close(data_socket);
	return EXIT_SUCCESS;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,进程间通信可以使用socket来实现。Socket是一种特殊的文件,它是应用层与TCP/IP协议族通信的中间软件抽象层,提供了一组简单的接口来组织数据,以符合指定的协议。在网络编程中,大部分的通信都是通过socket实现的。 使用TCP/IP协议的应用程序通常采用socket接口来实现网络进程之间的通信。无论是UNIX BSD的套接字还是UNIX System V的TLI(已经被淘汰),几乎所有的应用程序都是采用socket来进行通信。 此外,还有一种叫做Unix domain sockets的通信方式,它使用系统文件的地址作为进程间通信的身份,并且仅在系统内核内部进行通信,不会在网络中传播。两个进程可以同时打开一个Unix domain socket来进行通信。 总结来说,Linux中的进程间通信可以通过socket来实现,使用TCP/IP协议的应用程序通常采用socket接口进行通信,并且还可以使用Unix domain sockets进行通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [LINUX进程间网络通信--SOCKET](https://blog.csdn.net/qq_44370382/article/details/107959541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [About AF_LOCAL in Linux](https://blog.csdn.net/frank_jb/article/details/77199834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值