hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
 
#include <Rk_socket_app.h>
 
#define LOG_TAG "RK_SOCKET_APP"
#define LOG_DEBUG_LEVEL (1)
#define LOG_ERROR_FLAG (4)
#define LOG_WARING_FLAG (3)
#define LOG_INFO_FLAG (2)
#define LOG_DEBUG_FLAG (1)
 
#define LOG_PRINTF(level, format, ...) \
        do { \
                if (level > LOG_DEBUG_LEVEL) { \
                        printf("[%s]: " format, LOG_TAG, ##__VA_ARGS__); \
                } \
        } while(0)
 
#define log_info(format, ...) LOG_PRINTF(LOG_INFO_FLAG, format, ##__VA_ARGS__)
#define log_dbg(format, ...) LOG_PRINTF(LOG_DEBUG_FLAG, format, ##__VA_ARGS__)
#define log_warn(format, ...) LOG_PRINTF(LOG_WARING_FLAG, format, ##__VA_ARGS__)
#define log_err(format, ...) LOG_PRINTF(LOG_ERROR_FLAG, format, ##__VA_ARGS__)
 
int RK_socket_server_setup(struct rk_socket_app *app_socket)
{
    int buflen = 1024*1024; //1M, default 8K
    socklen_t optlen = 0;
 
    unlink (app_socket->sock_path);
    if ((app_socket->server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) {
        log_err("fail to create socket\n");
        perror("socket");
        return -1;
    }
 
    app_socket->server_address.sun_family = AF_UNIX;
    strcpy (app_socket->server_address.sun_path, app_socket->sock_path);
    app_socket->server_len = sizeof (app_socket->server_address);
    app_socket->client_len = sizeof (app_socket->client_address);
 
    if ((bind (app_socket->server_sockfd, (struct sockaddr *)&app_socket->server_address, app_socket->server_len)) < 0) {
        log_err("fail to bind socket\n");
        perror("bind");
        return -1;
 
    }
 
    setsockopt(app_socket->server_sockfd, SOL_SOCKET, SO_RCVBUF, (void*)&buflen, sizeof(int));
    getsockopt(app_socket->server_sockfd, SOL_SOCKET, SO_RCVBUF, (void*)&buflen, &optlen);
    log_info("%s: SO_RCVBUF buflen=%d, optlen=%d\n", __func__, buflen, optlen);
 
    if (listen (app_socket->server_sockfd, 10) < 0) {
        log_err("fail to listen socket\n");
        perror("listen");
        return -1;
    }
    log_dbg ("Server is ready for client connect...\n");
 
    return 0;
}
 
int RK_socke_server_accpet(struct rk_socket_app *app_socket) {
    app_socket->client_sockfd = accept (app_socket->server_sockfd, (struct sockaddr *)&app_socket->server_address, (socklen_t *)&app_socket->client_len);
    if (app_socket->client_sockfd == -1) {
        log_err("fail to accept socket\n");
        perror ("accept");
        return -1;
    }
    return 0;
}
 
void RK_socket_server_teardown(struct rk_socket_app *app_socket) {
    unlink (app_socket->sock_path);
 
    if(app_socket->server_sockfd) {
        close(app_socket->server_sockfd);
        app_socket->server_sockfd = 0;
    }
 
    if(app_socket->client_sockfd) {
        close(app_socket->client_sockfd);
        app_socket->client_sockfd = 0;
    }
}
 
int RK_socket_client_setup(char *socket_path) {
    struct sockaddr_un address;
    int sockfd, len;
    int buflen = 1024*1024; //1M, default 8K
    socklen_t optlen = 0;
 
    if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        log_err("%s: can not creat socket\n", __func__);
        return -1;
    }
 
    address.sun_family = AF_UNIX;
    strcpy (address.sun_path, socket_path);
    len = sizeof (address);
 
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void*)&buflen, sizeof(int));
    getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void*)&buflen, &optlen);
    log_info("%s: SO_SNDBUF buflen=%d, optlen=%d\n", __func__, buflen, optlen);
 
    if (connect (sockfd, (struct sockaddr *)&address, len) == -1) {
        log_err("%s: can not connect to socket\n", __func__);;
        return -1;
    }
 
    return sockfd;
}
 
void RK_socket_client_teardown(int sockfd) {
    if(sockfd) {
        close(sockfd);
        sockfd = 0;
    }
}
 
int RK_socket_send(int sockfd, char *msg, int len) {
    int bytes;
    if (sockfd < 0) {
        log_err("%s: invalid sockfd\n",__func__);
        return -1;
    }
    if ((bytes = send(sockfd, msg, len, 0)) < 0) {
        log_err("fail to send\n");
        perror ("send");
    }
    return bytes;
}
 
int RK_socket_recieve(int sockfd, char *msg, int len) {
    int bytes;
 
    if (sockfd < 0) {
        log_err("%s: invalid sockfd\n",__func__);
        return -1;
    }
 
    if ((bytes = recv(sockfd, msg, len, 0)) < 0)
    {
        log_err("fail to recv\n");
        perror ("recv");
    }
    return bytes;
}
 
int RK_socket_udp_send(char *socket_path, char *msg, int len) {
   int bytes = 0;
   int sockfd;
   struct sockaddr_un serverAddr;
 
   sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
   if (sockfd < 0) {
       printf("FUNC:%s create sockfd failed!\n", __func__);
       return 0;
   }
 
   serverAddr.sun_family = AF_UNIX;
   strcpy(serverAddr.sun_path, socket_path);
 
   bytes = sendto(sockfd, msg, len, MSG_DONTWAIT, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
   if(bytes < 0)
       log_err("bytes: %d, errno: %s\n", bytes, strerror(errno));
 
   close(sockfd);
   return bytes;
}