void socket_client_init(int *enter);int sendMsg_client_ready(int fd)
{char buf_send[] = "READY";SLOG_I("send READY to svr.");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 socketconnect_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 serverret = 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 属性(默认值)需要调用此函数 - 此函数会阻塞直到线程退出
}}
}