【QNX】Socket Server&Client 源代码

【生活经历分享】华师国培 华师伴学 合同都是坑 消费者付款后无法退款和华师国培签合同需小心,合同中都是保护华师的条款,没有保护消费者的条款。
收到钱,就算你因对培训质量不满意,也不能退款。因合同消费者维权肯定十分艰难。
华师伴学的授课方式是看录制的视频,不是真人现场教学。是否是您和孩子想要的学习方式?
各位打算报名的,交费要谨慎!
其他人在小红书上发的,转:

深圳市华师国培教育科技有限公司,黑心机构,大家擦亮眼睛,别被骗了,消费欺诈,虚假承诺,签合同各种坑,收到钱了不履行承诺不退款,乱扣费,维权艰难! - 小红书

 

1 Socket Server 源代码

服务端计划只启动一个线程,所以功能实现时使用了一些全局变量。
 1 int32_t skt_s_listen_fd{-1};
 2 pthread_t thr_server;
 3 struct sockaddr_un srv_addr;
 4 struct sockaddr_un cli_addr;
 5 std::vector<int32_t> com_fd_vec;
 6 
 7 void *serverSocketThd(void *arg)
 8 {
 9     SLOG_I("Start receive - server.");
10 
11     // listen sockfd
12     int32_t ret = listen(skt_s_listen_fd, 1);
13     if(ret == -1) 
14     {
15         SLOG_E("cannot listen the client connect request: %d - %s", errno, strerror(errno));
16         close(skt_s_listen_fd);
17         unlink(SOCK_PATH);
18         return NULL;
19     }
20     const char *ready_flag = "LeoTest";
21     while(1)
22     {
23         //have connect request use accept
24         socklen_t len = sizeof(cli_addr);
25         //accept the client
26         int32_t com_fd = accept(skt_s_listen_fd, (struct sockaddr*)(&cli_addr), &len);
27 
28         if(com_fd < 0) 
29         {
30             SLOG_E("cannot accept client connect request: %d - %s", errno, strerror(errno));
31             close(skt_s_listen_fd);
32             unlink(SOCK_PATH);
33             return NULL;
34         }
35     
36         char buf[64] = {0};
37         int32_t recv_size(0);
38 
39         recv_size = read(com_fd, buf, 10);
40         SLOG_I("Socket readed [%d] info: %s", com_fd, buf);
41         if (0 == strncmp(buf, ready_flag, 7))
42         {
43             com_fd_vec.push_back(com_fd);
44         }
45     }
46 
47     return NULL;
48 }
49 
50 void socket_server_init()
51 {
52     int32_t ret;
53     SLOG_I("Init socket start[%s].", SOCK_PATH);
54  
55     skt_s_listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
56     if(skt_s_listen_fd < 0) {
57         SLOG_E("cannot create communication socket: %d - %s", errno, strerror(errno));
58         return ;
59     }
60 
61     // set server addr_param
62     srv_addr.sun_family = AF_UNIX;
63     strcpy(srv_addr.sun_path, SOCK_PATH);
64     unlink(SOCK_PATH);
65 
66     // bind sockfd & addr
67     ret = bind(skt_s_listen_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
68     if(ret == -1) {
69         SLOG_E("cannot bind server socket[%s]: %d - %s", SOCK_PATH, errno, strerror(errno));
70         close(skt_s_listen_fd);
71         unlink(SOCK_PATH);
72         return ;
73     }
74     // scheduler_ = new std::thread(&serverSocketThd, nullptr);
75     if (EOK != pthread_create(&thr_server, NULL, serverSocketThd, nullptr)) {
76         SLOG_E("create connect thread failed: %d - %s", errno, strerror(errno));
77     }
78     else {
79     }
80 
81     SLOG_I("Init socket end.");
82 }

 

2 Socket Client 源代码

客户端计划启动多个(如:30个)线程,所以客户端实现时没有使用全局变量,尽量做到线程无关。
void socket_client_init(int *enter);

int sendMsg_client_ready(int fd)
{
    char buf_send[] = "LeoTest";
    SLOG_I("send LeoTest to server.");
    return write(fd, buf_send, sizeof(buf_send));
}

// recv message
void *recv_client_thread(void *arg)
{
    if (NULL == arg)
    {
        SLOG_E("[recv_client_thread]param is not allow NULL.");
        return NULL;
    }
    SLOG_I("[recv_client_thread]receive thread starting<tid=%lu>...", pthread_self());
    RecvModel *model = (RecvModel *)arg;
    ssize_t flag = 0;
    unsigned char buf_recv[64] = {0};
    ssize_t length = 0;
    usleep(300);
    
    SLOG_D("create communication send data");
    sendMsg_client_ready(model->st);
    SLOG_D("create communication send data end");

    while(true)
    {
        flag = recv(model->st, buf_recv, sizeof(buf_recv), 0);
        if (0 == flag)
        {   // 需要考虑重连机制
            SLOG_E("[recv_client_thread]remote already close connect.");
            break;
        }
        else if (-1 == flag)
        {   // 需要考虑重连机制
            SLOG_E("[recv_client_thread]recv failed. error message : %s", strerror(errno));
            break;
        }
        
        length = flag;
        SLOG_D("receive data(length: %d): %s", length, buf_recv);

        memset(buf_recv, 0, sizeof(buf_recv));
    }

    close(model->st);
    return NULL;
}


void *client_connect_thread(void *arg)
{
    SLOG_I("[client_connect_thread]enter: 0x%x", arg);
    if(NULL != arg) {
        int *enter = (int *)arg;
        SLOG_I("[client_connect_thread]enter[%d]...", *enter);
        
        int connect_fd;
        int ret;
        int count_connect = 0;

        static struct sockaddr_un srv_addr;
        // char sock_path_str[128] = {0};
    
        SLOG_I("create communication socket...");
        // create unix socket
        connect_fd = socket(PF_UNIX, SOCK_STREAM, 0);
        if(connect_fd < 0) {
            SLOG_E("cannot create communication socket");
            return NULL;
        }
        SLOG_D("create communication socket end");
        srv_addr.sun_family = AF_UNIX;
        // sprintf(sock_path_str, SOCK_PATH, count);
        strcpy(srv_addr.sun_path, SOCK_PATH);
        // connect server
        ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
        SLOG_I("create communication connect end: %d", ret);
        while(-1 == ret) {
            count_connect++;
            SLOG_W("connect to the server failed, trying no. %d", count_connect);
            sleep(1);
            
            ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
        }

        RecvModel model;
        model.st = connect_fd;
        model.addr = &srv_addr;
        // 开启线程--接收线程
        pthread_t thr_recv;
        if (pthread_create(&thr_recv, NULL, recv_client_thread, &model) != 0)
        {
            SLOG_E("create recv thread failed");
        }
        else
        {
            SLOG_I("create communication pthread join");
            pthread_join(thr_recv, NULL);
            SLOG_W("create communication pthread join end");
        }
    }
}

void socket_client_init(int *enter)
{
    pthread_t thr_connect;

    SLOG_I("* * * * * * * * * * * * * * * * * * [socket_client_init]starting[%d]...", *enter);
    {
        if (EOK != pthread_create(&thr_connect, NULL, client_connect_thread, (void *)enter))
        {
            SLOG_E("create connect thread failed");
        }
        else
        {
            // pthread_join(thr_connect, NULL);     // PTHREAD_CREATE_JOINABLE 属性(默认值)需要调用此函数 - 此函数会阻塞直到线程退出
        }
    }
}

 

3 调用示例代码

因为测试代码是写在同一个应用中,所以使用命令行参数进行区分【将命令行参数转化为控制变量: isSktFlag】
    if(2 == isSktFlag) {
        // socket client: connect to server
        for(int i = 0; i < 30; i++) {
            SLOG_D("[socket] client start %d...", i);
            socket_client_init(&i);
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 1000));    // 因为后面还有其它测试代码, 所以增加此行延时
    }
    else if(1 == isSktFlag) {
        SLOG_D("[socket] server start...");
        socket_server_init();
        std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 1000));    // 因为后面还有其它测试代码, 所以增加此行延时
    }
    

 

 
只运行 Server 时查看 uds 信息如下:

image

 

再运行 client 后查看 uds 信息如下:

image

 

 
posted @ 2025-10-21 14:49  91program  阅读(6)  评论(0)    收藏  举报