[Feature][T8TSK-189] chang urc report address to 127.0.0.1
Change-Id: Ibfd79b8ed38fe6f4835cf596f167e5636fa3c379
diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
index ff45c02..2d5b0e8 100755
--- a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
@@ -16,11 +16,12 @@
#include "lynq_module_socket.h"
#include "liblog/lynq_deflog.h"
#include "lynq_shm.h"
+#include "lynq_urc_socket.h"
#define LYNQ_SERVICE_PORT 8088
#define LYNQ_ADDRESS "127.0.0.1"
-#define LYNQ_URC_SERVICE_PORT 8086
-#define LYNQ_URC_ADDRESS "0.0.0.0"
+//#define LYNQ_URC_SERVICE_PORT 8086
+//#define LYNQ_URC_ADDRESS "0.0.0.0"
#define LYNQ_REQUEST_PARAM_BUF 8192
#define LYNQ_REC_BUF 8192
@@ -50,11 +51,11 @@
lynq_resp_t response;
int module_len_rc_addr_serv;
-int module_len_urc_addr_serv;
+//int module_len_urc_addr_serv;
struct sockaddr_in module_rc_addr_serv;
-struct sockaddr_in module_urc_addr_serv;
+//struct sockaddr_in module_urc_addr_serv;
static int module_rc_sock_fd = -1;
-static int module_urc_sock_fd = -1;
+//static int module_urc_sock_fd = -1;
int module_urc_status = 1;
int module_rc_status = 1;
pthread_t module_urc_tid = -1;
@@ -129,11 +130,11 @@
* other:failure
*/
const int waitResponse(Parcel*& p, int token,int time_out)
-{
+{
int waitToken = token;
int wakeup_token=-1;
int resp_type;
- struct timeval now;
+ struct timeval now;
struct timespec timeout;
int ret;
std::list<Parcel*>::iterator iter;
@@ -141,8 +142,8 @@
gettimeofday(&now,NULL);
timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
- timeout.tv_nsec = now.tv_usec*1000;
-
+ timeout.tv_nsec = now.tv_usec*1000;
+
LYINFLOG("%s wait token is %d, wait time is %d",__func__,waitToken,time_out);
BLOCK_RECV_MSG_LOCK();
@@ -326,7 +327,8 @@
while(module_urc_status)
{
bzero(urc_data,LYNQ_REC_BUF);
- res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ //res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ res = lynq_recv_urc_msg(urc_data,sizeof(urc_data));
if(res<sizeof(int32_t)*2)
{
LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
@@ -460,44 +462,46 @@
int lynq_setup_urc_socket()
{
- int on = 1;
- int ret = 0;
- module_len_urc_addr_serv = sizeof(sockaddr_in);
- module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (module_urc_sock_fd <0){
- LYERRLOG("urc socket error");
- return RESULT_ERROR;
- }
- module_urc_addr_serv.sin_family = AF_INET;
- module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
- module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
- /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
- ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
- if(ret <0)
- {
- LYERRLOG("urc socket set error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
- if(ret <0)
- {
- LYERRLOG("urc socket bind error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- return RESULT_OK;
+// int on = 1;
+// int ret = 0;
+// module_len_urc_addr_serv = sizeof(sockaddr_in);
+// module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+// if (module_urc_sock_fd <0){
+// LYERRLOG("urc socket error");
+// return RESULT_ERROR;
+// }
+// module_urc_addr_serv.sin_family = AF_INET;
+// module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+// module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+// /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+// ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+// if(ret <0)
+// {
+// LYERRLOG("urc socket set error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+// ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+// if(ret <0)
+// {
+// LYERRLOG("urc socket bind error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+
+// return RESULT_OK;
+ return lynq_register_urc_socket() > 0 ? RESULT_OK : RESULT_ERROR;
}
void lynq_close_urc_socket()
{
- if (module_urc_sock_fd >= 0)
- {
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- }
+// if (module_urc_sock_fd >= 0)
+// {
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// }
}
int lynq_start_all_urc_socket_thread()
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.cpp b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
index 9f211eb..d527ed2 100755
--- a/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.cpp
@@ -13,6 +13,7 @@
#include "lynq_data_urc.h"
#include "liblog/lynq_deflog.h"
#include "lynq_shm.h"
+#include "lynq_urc_socket.h"
#define LYNQ_REC_BUF 8192
@@ -76,7 +77,8 @@
while(data_urc_recive_status)
{
bzero(urc_data,LYNQ_REC_BUF);
- res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
+// res = recvfrom(lynq_urc_sockfd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&urc_local_addr,(socklen_t*)&lynq_len_urc_addr_serv);
+ res = lynq_recv_urc_msg(urc_data,sizeof(urc_data));
if(res<sizeof(int32_t)*2)
{
@@ -165,37 +167,38 @@
int lynq_socket_recv_start()
{
- int rt=0;
- int on=1;
- struct sockaddr_in urc_local_addr;
- pthread_attr_t attr;
- lynq_urc_sockfd = socket(AF_INET,SOCK_DGRAM,0);
- if(lynq_urc_sockfd < 0)
- {
- LYERRLOG("create socket for udp fail");
- return -1;
- }
- urc_local_addr.sin_family = AF_INET;
- urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
- urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
- /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
- rt = setsockopt(lynq_urc_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
- if(rt<0)
- {
- LYERRLOG("SO_REUSEADDR fail");
- close(lynq_urc_sockfd);
- lynq_urc_sockfd = -1;
- return -1;
- }
- rt = bind(lynq_urc_sockfd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
- if (rt == -1)
- {
- LYERRLOG("bind failed");
- close(lynq_urc_sockfd);
- lynq_urc_sockfd = -1;
- return -1;
- }
- return 0;
+// int rt=0;
+// int on=1;
+// struct sockaddr_in urc_local_addr;
+// pthread_attr_t attr;
+// lynq_urc_sockfd = socket(AF_INET,SOCK_DGRAM,0);
+// if(lynq_urc_sockfd < 0)
+// {
+// LYERRLOG("create socket for udp fail");
+// return -1;
+// }
+// urc_local_addr.sin_family = AF_INET;
+// urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+// urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
+// /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+// rt = setsockopt(lynq_urc_sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+// if(rt<0)
+// {
+// LYERRLOG("SO_REUSEADDR fail");
+// close(lynq_urc_sockfd);
+// lynq_urc_sockfd = -1;
+// return -1;
+// }
+// rt = bind(lynq_urc_sockfd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
+// if (rt == -1)
+// {
+// LYERRLOG("bind failed");
+// close(lynq_urc_sockfd);
+// lynq_urc_sockfd = -1;
+// return -1;
+// }
+// return 0;
+ return lynq_register_urc_socket() > 0 ? 0 : -1;
}
int lynq_socket_recv_stop()
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.h b/src/lynq/lib/liblynq-data/lynq_data_urc.h
index 7ac4f75..80069e8 100755
--- a/src/lynq/lib/liblynq-data/lynq_data_urc.h
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.h
@@ -27,4 +27,4 @@
bool is_support_urc(int urc_id);
void urc_msg_process(Parcel *p);
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
index c3f7334..48353dc 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
@@ -16,11 +16,12 @@
#include "lynq_module_socket.h"
#include "liblog/lynq_deflog.h"
#include "lynq_shm.h"
+#include "lynq_urc_socket.h"
#define LYNQ_SERVICE_PORT 8088
#define LYNQ_ADDRESS "127.0.0.1"
-#define LYNQ_URC_SERVICE_PORT 8086
-#define LYNQ_URC_ADDRESS "0.0.0.0"
+//#define LYNQ_URC_SERVICE_PORT 8086
+//#define LYNQ_URC_ADDRESS "0.0.0.0"
#define LYNQ_REQUEST_PARAM_BUF 8192
#define LYNQ_REC_BUF 8192
@@ -50,11 +51,11 @@
lynq_resp_t response;
int module_len_rc_addr_serv;
-int module_len_urc_addr_serv;
+//int module_len_urc_addr_serv;
struct sockaddr_in module_rc_addr_serv;
-struct sockaddr_in module_urc_addr_serv;
+//struct sockaddr_in module_urc_addr_serv;
static int module_rc_sock_fd = -1;
-static int module_urc_sock_fd = -1;
+//static int module_urc_sock_fd = -1;
int module_urc_status = 1;
int module_rc_status = 1;
pthread_t module_urc_tid = -1;
@@ -129,11 +130,11 @@
* other:failure
*/
const int waitResponse(Parcel*& p, int token,int time_out)
-{
+{
int waitToken = token;
int wakeup_token=-1;
int resp_type;
- struct timeval now;
+ struct timeval now;
struct timespec timeout;
int ret;
std::list<Parcel*>::iterator iter;
@@ -141,8 +142,8 @@
gettimeofday(&now,NULL);
timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
- timeout.tv_nsec = now.tv_usec*1000;
-
+ timeout.tv_nsec = now.tv_usec*1000;
+
LYINFLOG("%s wait token is %d, wait time is %d",__func__,waitToken,time_out);
BLOCK_RECV_MSG_LOCK();
@@ -326,7 +327,8 @@
while(module_urc_status)
{
bzero(urc_data,LYNQ_REC_BUF);
- res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ //res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ res = lynq_recv_urc_msg(urc_data,sizeof(urc_data));
if(res<sizeof(int32_t)*2)
{
LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
@@ -460,44 +462,45 @@
int lynq_setup_urc_socket()
{
- int on = 1;
- int ret = 0;
- module_len_urc_addr_serv = sizeof(sockaddr_in);
- module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (module_urc_sock_fd <0){
- LYERRLOG("urc socket error");
- return RESULT_ERROR;
- }
- module_urc_addr_serv.sin_family = AF_INET;
- module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
- module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
- /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
- ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
- if(ret <0)
- {
- LYERRLOG("urc socket set error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
- if(ret <0)
- {
- LYERRLOG("urc socket bind error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- return RESULT_OK;
+// int on = 1;
+// int ret = 0;
+// module_len_urc_addr_serv = sizeof(sockaddr_in);
+// module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+// if (module_urc_sock_fd <0){
+// LYERRLOG("urc socket error");
+// return RESULT_ERROR;
+// }
+// module_urc_addr_serv.sin_family = AF_INET;
+// module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+// module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+// /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+// ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+// if(ret <0)
+// {
+// LYERRLOG("urc socket set error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+// ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+// if(ret <0)
+// {
+// LYERRLOG("urc socket bind error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+// return RESULT_OK;
+ return lynq_register_urc_socket() > 0 ? RESULT_OK : RESULT_ERROR;
}
void lynq_close_urc_socket()
{
- if (module_urc_sock_fd >= 0)
- {
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- }
+// if (module_urc_sock_fd >= 0)
+// {
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// }
}
int lynq_start_all_urc_socket_thread()
diff --git a/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h b/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h
new file mode 100755
index 0000000..866d5c2
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/include/lynq_urc_socket.h
@@ -0,0 +1,24 @@
+/**
+ * @file shm.h
+ * @author hq
+ * @brief
+ * @version 1.0
+ * @date 2022-12-16
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef __LYNQ_URC_SOCKET__
+#define __LYNQ_URC_SOCKET__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+int lynq_open_broadcast_urc_socket();
+int lynq_broadcast_urc_msg(void * msg, int size);
+int lynq_register_urc_socket();
+int lynq_recv_urc_msg(void * buffer, int size);
+#ifdef __cplusplus
+}
+#endif
+#endif //#ifndef __LYNQ_URC_SOCKET__
diff --git a/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
new file mode 100755
index 0000000..2ebf85f
--- /dev/null
+++ b/src/lynq/lib/liblynq-shm/lynq_urc_socket.cpp
@@ -0,0 +1,278 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include <binder/Parcel.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "lynq_urc_socket.h"
+#include "log/log.h"
+#include <list>
+
+static int lynq_urc_socket_fd = 0;
+static int registered_urc_socket_port = 0;
+static int registered_urc_socket_fd = 0;
+
+static pthread_mutex_t s_urc_broadcast_mtx = PTHREAD_MUTEX_INITIALIZER;
+static std::list<struct sockaddr*> s_urc_broadcast_clients;
+
+static pthread_mutex_t s_urc_register_mtx = PTHREAD_MUTEX_INITIALIZER;
+
+#define LYNQ_URC_SERVER_LISTEN_PORT 8086
+#define LYNQ_URC_SERVER_LISTEN_ADDRESS "127.0.0.1"
+
+#define LYNQ_URC_CLIENT_PORT_START 7050
+#define LYNQ_URC_CLIENT_PORT_END 7099
+#define LYNQ_URC_CLIENT_LISTEN_ADDRESS "127.0.0.1"
+
+static void * receive_client_heartbeat(void *parm);
+static void find_all_client_to_notify_online();
+int lynq_open_broadcast_urc_socket()
+{
+ int ret = 0;
+ int on = 1;
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+
+ struct sockaddr_in addr_serv;
+ //Creating a Socket object
+ lynq_urc_socket_fd=socket(AF_INET,SOCK_DGRAM,0);
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family =AF_INET;
+ addr_serv.sin_port = htons(LYNQ_URC_SERVER_LISTEN_PORT);
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_SERVER_LISTEN_ADDRESS);
+ ret = setsockopt(lynq_urc_socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+ if (ret < 0){
+ goto open_socket_exit;
+ }
+ ret = bind(lynq_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ goto open_socket_exit;
+ }
+ //receive registion and display on at port
+ pthread_t thid;
+ if(pthread_create(&thid, NULL, receive_client_heartbeat, NULL) != 0) {
+ RLOGE("thread creation failed\n");
+ ret = -1;
+ goto open_socket_exit;
+ }
+
+ find_all_client_to_notify_online();
+
+open_socket_exit:
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ return ret == 0 ? lynq_urc_socket_fd: -1;
+}
+
+int lynq_broadcast_urc_msg(void * msg, int size)
+{
+ int all_ok = 1;
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+ for(auto it=s_urc_broadcast_clients.begin(); it != s_urc_broadcast_clients.end(); )
+ {
+ int len = sendto(lynq_urc_socket_fd, msg, size, 0, *it, sizeof(struct sockaddr_in));
+ if (len < 0)
+ {
+ struct sockaddr_in *addr_cli = (struct sockaddr_in *) *it;
+ printf("remove client %d now\n", ntohs(addr_cli->sin_port));
+ it = s_urc_broadcast_clients.erase(it);
+ free(addr_cli);
+ all_ok = 0;
+ continue;
+ }
+ it++;
+ }
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ return all_ok;
+}
+
+int lynq_register_urc_socket()
+{
+ int on = 0;
+ int ret = 0;
+ int len_s;
+ struct sockaddr_in addr_serv;
+ //Creating a Socket object
+ pthread_mutex_lock(&s_urc_register_mtx);
+ registered_urc_socket_fd=socket(AF_INET,SOCK_DGRAM,0);
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family =AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_CLIENT_LISTEN_ADDRESS);
+ if (registered_urc_socket_port > 0) {
+ on = 1;
+ ret = setsockopt(registered_urc_socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+ addr_serv.sin_port = htons(registered_urc_socket_port);
+ ret = bind(registered_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ goto register_socket_exit;
+ }
+ }
+ else
+ {
+ for(registered_urc_socket_port = LYNQ_URC_CLIENT_PORT_START; registered_urc_socket_port < LYNQ_URC_CLIENT_PORT_END; registered_urc_socket_port ++)
+ {
+ addr_serv.sin_port = htons(registered_urc_socket_port);
+ ret = bind(registered_urc_socket_fd,(struct sockaddr*)&addr_serv,sizeof(addr_serv));
+ if (ret < 0){
+ printf("bind socket %d fail\n", registered_urc_socket_port);
+ continue;
+ }
+ break;
+ }
+ }
+
+ addr_serv.sin_port = htons(LYNQ_URC_SERVER_LISTEN_PORT);
+ len_s = sendto(registered_urc_socket_fd, ®istered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("send result %d %d\n", len_s, errno);
+register_socket_exit:
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ printf("init result %d\n", ret);
+ return ret ==0 ? registered_urc_socket_fd : -1;
+}
+
+int lynq_recv_urc_msg(void * buffer, int size)
+{
+ int ret = 0;
+ struct sockaddr_in addr_serv;
+ socklen_t len_addr_serv = sizeof(addr_serv);
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ printf("client %ul to recv now\n", pthread_self());
+ pthread_mutex_lock(&s_urc_register_mtx);
+ if (registered_urc_socket_fd <= 0) {
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ return -1;
+ }
+ while(1)
+ {
+ memset(buffer, 0, 4);
+ ret = recvfrom(registered_urc_socket_fd, buffer, size,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if (ret > 0 && LYNQ_URC_SERVER_LISTEN_PORT == ntohs(addr_serv.sin_port))
+ {
+ if (ret == 4 && LYNQ_URC_SERVER_LISTEN_PORT == *((int*)buffer))
+ {
+ sendto(registered_urc_socket_fd, ®istered_urc_socket_port, sizeof(registered_urc_socket_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("to send ack of headbeat\n");
+ continue;
+ }
+ }
+ else
+ {
+ printf("not a server packet\n");
+ continue;
+ }
+ break;
+ }
+ pthread_mutex_unlock(&s_urc_register_mtx);
+ printf("client %ul recv %d\n", pthread_self(), ret);
+ return ret;
+}
+
+static void *receive_client_heartbeat(void *parm)
+{
+ RLOGE("receive_at thread start\n");
+ int recv = 0;
+ char buffer[1024] = {0};
+ while(1)
+ {
+ RLOGE("receive third at cmd\n");
+
+ socklen_t len = sizeof(struct sockaddr_in);
+ struct sockaddr* cli = (struct sockaddr*)malloc(len);
+ bzero(cli, len);
+ printf("to recv now\n");
+ recv = recvfrom(lynq_urc_socket_fd, buffer, 1024, 0, cli, &len);
+ if(recv < 0)
+ {
+ RLOGE("recv fail\n");
+ printf("recv fail\n");
+ free(cli);
+ continue;
+ }
+ printf("recv a packet %d \n", recv);
+ struct sockaddr_in * register_socket = (struct sockaddr_in*)cli;
+
+ int port = ntohs(register_socket->sin_port);
+ if (recv == 4 && port == *((int*)buffer))
+ {
+ printf("port is %d\n", port);
+ pthread_mutex_lock(&s_urc_broadcast_mtx);
+ s_urc_broadcast_clients.push_back(cli);
+ pthread_mutex_unlock(&s_urc_broadcast_mtx);
+ RLOGE("recvfrom from client\n");
+ }
+ }
+ return NULL;
+}
+static int exec_cmd(const char *str_cmd, char * str_cmd_ret, size_t max_len)
+{
+ FILE *fp;
+ //printf("to exec cmd:%s\n", str_cmd);
+ if((fp=popen(str_cmd,"r"))==NULL)
+ {
+ perror("popen error!");
+ return -1;
+ }
+ if((fread(str_cmd_ret,max_len,1,fp))<0)
+ {
+ perror("fread fail!");
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+ return 0;
+}
+
+static int lynq_split(char * str, int len, char delimiter, char * results[]) {
+ int ret = 0;
+ char * end = str + len - 1;
+ results[ret++] = str;
+ while(str < end) {
+ if (*str == delimiter) {
+ *str++ = '\0';
+ results[ret++] = str;
+ continue;
+ }
+ str++;
+ }
+ if (*str == delimiter) {
+ *str = '\0';
+ }
+
+ return ret;
+}
+
+static void find_all_client_to_notify_online()
+{
+ char buffer[1024] = {0};
+ char * split_lines[128]= {0};
+ int count = 0;
+ int port, len;
+ int local_port = LYNQ_URC_SERVER_LISTEN_PORT;
+ printf("find_all_client_to_notify_online\n");
+ if (exec_cmd("netstat -an | grep -e \"127\\.0\\.0\\.1:70[5-9][0-9]\" | awk '{print $4}' | awk -F \":\" '{print $2}'", buffer, 1024) == 0)
+ {
+ count = lynq_split(buffer, 1024, '\n', split_lines);
+ for(int i=0; i < count;i++)
+ {
+ port = atoi(split_lines[i]);
+ printf("got %s port:%d\n", split_lines[i], port);
+ if (port < LYNQ_URC_CLIENT_PORT_START || port > LYNQ_URC_CLIENT_PORT_END)
+ continue;
+
+ struct sockaddr_in addr_serv;
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family =AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_CLIENT_LISTEN_ADDRESS);
+ addr_serv.sin_port = htons(port);
+ len = sendto(lynq_urc_socket_fd, &local_port, sizeof(local_port), 0, (struct sockaddr *)&addr_serv,sizeof(addr_serv));
+ printf("send result %d %d\n", len, errno);
+ }
+ }
+ else
+ {
+ printf("net stat fail\n");
+ }
+}
diff --git a/src/lynq/lib/liblynq-shm/makefile b/src/lynq/lib/liblynq-shm/makefile
index 806cc77..d49d358 100755
--- a/src/lynq/lib/liblynq-shm/makefile
+++ b/src/lynq/lib/liblynq-shm/makefile
@@ -20,8 +20,9 @@
-L. \
-ldl \
-llog \
-# -lbinder \
-lpthread \
+
+# -lbinder \
# -lutils \
# -lcutils \
diff --git a/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
index 8d012da..ce07df1 100755
--- a/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
@@ -16,11 +16,12 @@
#include "lynq_module_socket.h"
#include "liblog/lynq_deflog.h"
#include "lynq_shm.h"
+#include "lynq_urc_socket.h"
#define LYNQ_SERVICE_PORT 8088
#define LYNQ_ADDRESS "127.0.0.1"
-#define LYNQ_URC_SERVICE_PORT 8086
-#define LYNQ_URC_ADDRESS "0.0.0.0"
+//#define LYNQ_URC_SERVICE_PORT 8086
+//#define LYNQ_URC_ADDRESS "0.0.0.0"
#define LYNQ_REQUEST_PARAM_BUF 8192
#define LYNQ_REC_BUF 8192
@@ -50,11 +51,11 @@
lynq_resp_t response;
int module_len_rc_addr_serv;
-int module_len_urc_addr_serv;
+//int module_len_urc_addr_serv;
struct sockaddr_in module_rc_addr_serv;
-struct sockaddr_in module_urc_addr_serv;
+//struct sockaddr_in module_urc_addr_serv;
static int module_rc_sock_fd = -1;
-static int module_urc_sock_fd = -1;
+//static int module_urc_sock_fd = -1;
int module_urc_status = 1;
int module_rc_status = 1;
pthread_t module_urc_tid = -1;
@@ -324,7 +325,8 @@
while(module_urc_status)
{
bzero(urc_data,LYNQ_REC_BUF);
- res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ //res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ res = lynq_recv_urc_msg(urc_data,sizeof(urc_data));
if(res<sizeof(int32_t)*2)
{
LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
@@ -465,44 +467,45 @@
int lynq_setup_urc_socket()
{
- int on = 1;
- int ret = 0;
- module_len_urc_addr_serv = sizeof(sockaddr_in);
- module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (module_urc_sock_fd <0){
- LYERRLOG("urc socket error");
- return RESULT_ERROR;
- }
- module_urc_addr_serv.sin_family = AF_INET;
- module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
- module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
- /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
- ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
- if(ret <0)
- {
- LYERRLOG("urc socket set error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
- if(ret <0)
- {
- LYERRLOG("urc socket bind error");
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- return RESULT_ERROR;
- }
- return RESULT_OK;
+// int on = 1;
+// int ret = 0;
+// module_len_urc_addr_serv = sizeof(sockaddr_in);
+// module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+// if (module_urc_sock_fd <0){
+// LYERRLOG("urc socket error");
+// return RESULT_ERROR;
+// }
+// module_urc_addr_serv.sin_family = AF_INET;
+// module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+// module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+// /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+// ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+// if(ret <0)
+// {
+// LYERRLOG("urc socket set error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+// ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+// if(ret <0)
+// {
+// LYERRLOG("urc socket bind error");
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// return RESULT_ERROR;
+// }
+// return RESULT_OK;
+ return lynq_register_urc_socket() > 0 ? RESULT_OK : RESULT_ERROR;
}
void lynq_close_urc_socket()
{
- if (module_urc_sock_fd >= 0)
- {
- close(module_urc_sock_fd);
- module_urc_sock_fd =-1;
- }
+// if (module_urc_sock_fd >= 0)
+// {
+// close(module_urc_sock_fd);
+// module_urc_sock_fd =-1;
+// }
}
int lynq_start_all_urc_socket_thread()