C++ socket unix地址域编程

理论/原理

待补充。。。

代码demo

服务端

server.cpp

#include <iostream>
#include <sys/socket.h> //套接字相关函数和结构
#include <sys/un.h> //Unix域套接字相关结构
#include <unistd.h>

using namespace std;

#define SOCKET_PATH "./socket"

int main()
{
    //创建套接字
    int serv_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (serv_sockfd == -1)
    {
        cerr << "套接字创建失败!" << endl;
        return 1;
    }

    //绑定套接字到文件路径
    struct sockaddr_un serv_addr;
    memset(&serv_addr, 0, sizeof(struct sockaddr_un));
    serv_addr.sun_family = AF_UNIX;
    unlink(SOCKET_PATH);    // 如果不unlink,则无法重新绑定
    strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);

    bind(serv_sockfd, (struct sockaddr*) &serv_addr, sizeof(struct sockaddr_un));
    
    //监听连接
    int res = listen(serv_sockfd, 5);   //一般backlog >= 5
    if (res == -1)
    {
        cerr << "Failed to listen" << endl;
        close(serv_sockfd);
        return 1;
    }
    while (true)
    {
        cout << "Waiting for client connection..." << endl;
        //接受连接请求
        int clientfd = accept(serv_sockfd, nullptr, nullptr);
        if (clientfd == -1)
        {
            cerr << "Failed to accept connection" << endl;
            close(serv_sockfd);
            return 1;
        }
        cout << "Client connected!" << endl;
        //进行数据读写
        char buffer[1024];
        ssize_t bytesRead = recv(clientfd, buffer, sizeof(buffer), 0);  //接收数据
        while (bytesRead > 0)
        {
            cout << "Received message from client: " << buffer << endl;
            /*在此处,填写其他操作*/ 
            string send_message = "I receive your message. ";
            ssize_t bytesWritten = send(clientfd, send_message.c_str(), send_message.length(), 0);    //发送数据  (发送回复给客户端)
            if (bytesWritten == -1)
            {
                cerr << "Failed to send response to client" << endl;
                close(clientfd);
                break;
            } 
        }
        if (bytesRead == -1)
        {
            cerr << "Failed to receive data from client" << endl;
            break;
        }
        cout << "Client disconnected" << endl;
        close(clientfd);
    }
    
    //关闭套接字
    close(serv_sockfd);
    return 0;
}

客户端

client.cpp

#include <iostream>
#include <sys/socket.h> //套接字相关函数和结构
#include <sys/un.h> //Unix域套接字相关结构
#include <unistd.h>
#define SOCKET_PATH "./socket"
using namespace std;

int main()
{
    //创建套接字
    int client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (client_sockfd == -1)
    {
        cerr << "Failed to create socket" << endl;
        return 1;
    }
    
    //连接到服务器
    struct sockaddr_un serv_addr;
    memset(&serv_addr, 0, sizeof(struct sockaddr_un));
    serv_addr.sun_family = AF_UNIX;
    strncpy(serv_addr.sun_path, SOCKET_PATH, sizeof(serv_addr.sun_path)-1);
    
    while (true)
    {
        while (true)
        {
            int res = connect(client_sockfd, (struct sockaddr*) &serv_addr, sizeof(struct sockaddr_un));
            if (res == -1)
            {
                cerr << "Failed to connect to server, sleep 1s and reconnect..." << endl;
                sleep(1);
                continue;
            }
            break;
        }
        cout << "Connected to server!" << endl;
        while (true)
        {
            string message = "client send a message ";
            // 发送消息给服务器
            ssize_t bytesWritten = send(client_sockfd, message.c_str(), message.length(), 0);    //发送数据
            if (bytesWritten == -1)
            {
                cerr << "Failed to send message to server" << endl;
                break;
            }
            sleep(1);
            //接收服务器的回复
            char buffer[32];
            ssize_t bytesRead = recv(client_sockfd, buffer, sizeof(buffer), 0);  //接收数据
            if (bytesRead == -1)
            {
                cerr << "Failed to receive response from server" << endl;
                break;
            }
            // buffer[bytesRead] = '\0';   //?
            cout << "Recevied response from server: " << buffer << endl;
        }
    }
}

运行方式

两个shell窗口,分别执行以下代码:

root@E02xx socket_unix % g++ client.cpp -o client && ./client
root@E02xx socket_unix % g++ server.cpp -o server && ./server
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值