unix domain socket 通信之c服务端python客户端通信

server:

c 复制代码
#include <sys/un.h>
#include <sys/socket.h>
#include <linux/types.h>
// #include <stype.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define BUF_SIZE 10 /*MAXmum sizeof messages exchanged between client toserver*/

#define SV_SOCK_PATH "/tmp/ud_ucase"

int main(int argc, char *argv[])
{
    struct sockaddr_un svaddr,claddr;
    int sfd,j;
    ssize_t numBytes;
    socklen_t len;
    char buf[BUF_SIZE];

    sfd = socket(AF_UNIX,SOCK_DGRAM,0);      /*Create server socket*/
    if(sfd == -1)
    {
        perror("socket");
    }
    /*Construct well-known address and bind server socket to it*/
    if(remove(SV_SOCK_PATH)==-1 && errno !=ENOENT)
    {
        printf("remove -%s",SV_SOCK_PATH);
    }
    memset(&svaddr,0,sizeof(struct sockaddr_un));
    svaddr.sun_family = AF_UNIX;
    strncpy(svaddr.sun_path,SV_SOCK_PATH,sizeof(svaddr.sun_path)-1);

    if(bind(sfd,(struct sockaddr *)&svaddr,sizeof(struct sockaddr_un)) ==-1)
    {
        perror("bind");
    }
    for(;;)
    {
        len = sizeof(struct sockaddr_un);
        numBytes = recvfrom(sfd,buf,BUF_SIZE,0,(struct sockaddr *)&claddr,&len);
        if(numBytes == -1)
        {
            perror("recvfrom");
        }
        printf("Server received %ld bytes from %s\n",(long)numBytes,claddr.sun_path);
        for(j=0;j<numBytes;j++)
        {
            buf[j] = toupper((unsigned char)buf[j]);
        }
        if(sendto(sfd,buf,numBytes,0,(struct sockaddr *)&claddr,len) != numBytes)
        {
            perror("sendto");
        }
    }
}

client:

python 复制代码
import os
import socket
import argparse

# 定义常量
BUF_SIZE = 10
SV_SOCK_PATH = "/tmp/ud_ucase"
CL_SOCK_PATH = "/tmp/ud_ucase_cl"


# 定义主函数
def main():
    parser = argparse.ArgumentParser(description='Send messages to a Unix domain socket server.')
    parser.add_argument('msg', metavar='msg', type=str, nargs='+')
    args = parser.parse_args()
    # 创建客户端套接字
    sfd = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

    # 绑定客户端套接字到路径(基于PID)
    client_addr = CL_SOCK_PATH
    sfd.bind(client_addr)

    # 构造服务器地址
    server_addr = SV_SOCK_PATH

    try:
        # 向服务器发送消息并接收响应
        for msg in args.msg:
            # 发送消息到服务器
            sfd.sendto(msg.encode(), server_addr)

            # 接收响应
            resp, addr = sfd.recvfrom(BUF_SIZE)
            print('response {}: {}'.format(len(resp), resp))
    finally:
        # 关闭套接字并删除客户端套接字路径
        sfd.close()
        try:
            os.remove(client_addr)
        except OSError:
            pass
        exit(0)


if __name__ == '__main__':
    main()

效果如下:

相关推荐
兵慌码乱4 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵6 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio9 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636711 小时前
使用 Python 从零创建 Word 文档
python
Csvn15 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽16 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175318 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei1 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python