#include <stdlib.h>
|
#include <unistd.h>
|
#include <errno.h>
|
|
#include "eq_log.h"
|
#include "Rk_socket_app.h"
|
|
#define LOG_TAG "EQ_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) { \
|
eq_debug("[%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 create socket\n", __func__);
|
return -1;
|
}
|
|
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);
|
|
address.sun_family = AF_UNIX;
|
strcpy (address.sun_path, socket_path);
|
len = sizeof (address);
|
|
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, MSG_DONTWAIT | MSG_NOSIGNAL)) < 0) {
|
if(errno != EAGAIN) {
|
log_err("fail to send\n");
|
perror("send");
|
}
|
|
bytes = 0 - errno;
|
}
|
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) {
|
log_err("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;
|
}
|