Linux环境下socket本地通信

最近项目有用到了socket本地通信,故复习一下。之前都是基于本地虚拟机的ip地址通信的,现在项目,Linux单板上面有2个进程需要通信,故用到了本地socket通信,主要其实就是用了sockfd,文件描述符,也叫句柄。

服务端代码如下:

复制代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>
 
/* 本地通信------基于socket文件进行数据传递 */
 

#define SOCK_FILE "my.sock"	 // 定义存储的socket文件名
 
int main(int argc,char *argv[])
{
	printf("1. 服务器 创建socket套接字...\n");
	int sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);	// UDP协议
	if( sockfd == -1)
	{
		perror("socket");
		return -1;
	}
 
	printf("2. socket套接字关联到socket文件...\n");
	struct sockaddr_un addr;	// 本地通信地址类型
	addr.sun_family = AF_LOCAL;	// 地址簇
	strcpy(addr.sun_path, SOCK_FILE);
	
	// 绑定到物理内存,创建套接字文件
	int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

	if (ret != 0 ) {
		perror("bind");
		return -1;
	}
 
    printf("3. 服务器循环接收数据...\n");
	while (1) {
		char buf[1024] = {};
		ssize_t rb = read(sockfd, buf, sizeof(buf));
		if (rb == -1) {
			perror("read");
			return -1;
		}
        // 当客户端发送"!quit"关闭时,即结束循环
		if(rb == 0 || strcmp(buf,"!quit")==0)
			break;
		printf("receive: %s\n",buf);
	}
 
	printf("4. 服务器读取数据完毕,关闭服务器...\n");
	close(sockfd);
 
	printf("5. 删除套接字文件!\n");
	unlink(SOCK_FILE);

    return 0;
}

客户端代码如下:

复制代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>


#define SOCK_FILE "my.sock"	// 定义存储的socket文件名

int main(int argc,char *argv[])
{
	printf("1. 客户端创建套接字...\n");
	int sockfd = -1;
    sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);

	if (sockfd == -1) {
		perror("socket");
		return -1;
	}
 
	printf("2. 客户端连接到服务器socket通信地址...\n");
	struct sockaddr_un addr;
	addr.sun_family = AF_LOCAL;
	strcpy(addr.sun_path, SOCK_FILE);
 
    // 请求连接,让socket套接字连接到服务器的通信地址
	int ret = connect(sockfd,(const struct sockaddr*)&addr,sizeof(addr));

	if (ret != 0) {
		perror("connect");
		return -1;
	}
 
	printf("3. 客户端循环发送数据...\n");
	while (1) {
		printf("请输入:");
		char buf[1024] = {};
		fgets(buf, 1024, stdin);
        // 将获取到的换行符替换成'\0'
		int len = strlen(buf);
		if (buf[len-1] == '\n') {
			--len;
			buf[len] = '\0';
		}
        int ret = 0;
        
        // 发送数据
		if ((ret = write(sockfd, buf, len + 1) ) < 0) {
			perror("write");
			return -1;
		}
		if (ret = 0 || strcmp(buf, "!quit") == 0)
			break;
	}
 
	printf("4. 关闭客户端...\n");
	close(sockfd);
    return 0;
}

运行结果如下:

server端

client端

相关推荐
dnbug Blog24 分钟前
C程序 基本语法
c语言·基本语法
qq3621967051 小时前
第三方安卓应用商店安全评测 2026:Appteka、Aptoide、APKPure 等 7 家横评
android·网络·人工智能·安全·chatgpt·智能手机
AI科技星1 小时前
数术工坊・八卷全书【本源创世终极版・万世定稿】
开发语言·网络·量子计算·拓扑学
AI科技星1 小时前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi
DreamLife☼1 小时前
OpenBCI-脑电信号的隐私与安全保护
网络·安全·开源硬件·脑机接口·eeg·openbci·神经科技
宇晨T1 小时前
BurpSuite实战:WackoPicko敏感目录探测
linux·运维·服务器
yyuuuzz1 小时前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
dust_and_stars1 小时前
为什么ubuntu24 snap install code-server 不需要--classic?
网络·数据库
tiancaijiben2 小时前
阿里云日志服务SLS全流程对接与深度使用指南
网络·数据库
软件工程小施同学2 小时前
CCF A区块链论文分享-NDSS 2026(2)-CtPhishCapture:揭露针对加密货币钱包的基于凭证窃取的网络钓鱼诈骗(附pdf)
网络·pdf·区块链