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

效果如下:

相关推荐
wangchunyu1142 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
2501_944521594 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿4 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_944521594 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港5 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_967987375 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化
meiying88385 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
人工智能导论实践课5 小时前
【GUI桌面开发3】PyCharm配置外部工具
ide·python·pycharm
一千柯橘5 小时前
LangChain 的实时输出处理: stream_events 和 Streaming
python·langchain·agent
贾公子5 小时前
图片 AIGC 检测接入实战——URL 与 Base64 的取舍、体积校验与「你送过去的可能不是那张图」
python·aigc