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()

效果如下:

相关推荐
三体世界35 分钟前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
Python私教38 分钟前
Django全栈班v1.04 Python基础语法 20250912 下午
后端·python·django
xchenhao1 小时前
Scikit-Learn 对糖尿病数据集(回归任务)进行全面分析
python·机器学习·回归·数据集·scikit-learn·特征·svm
xchenhao1 小时前
Scikit-learn 对加州房价数据集(回归任务)进行全面分析
python·决策树·机器学习·回归·数据集·scikit-learn·knn
这里有鱼汤1 小时前
发现一个高性能回测框架,Python + Rust,比 backtrader 快 250 倍?小团队必备!
后端·python
☼←安于亥时→❦1 小时前
数据分析之Pandas入门小结
python·pandas
程序员东岸1 小时前
C语言入门指南:字符函数和字符串函数
c语言·笔记·学习·程序人生·算法
带娃的IT创业者1 小时前
《Python Web部署应知应会》No3:Flask网站的性能优化和实时监测深度实战
前端·python·flask
赴3351 小时前
图像拼接案例,抠图案例
人工智能·python·计算机视觉
TwoAI1 小时前
Scikit-learn 机器学习:构建、训练与评估预测模型
python·机器学习·scikit-learn