//mody by lv start add-------------------------------------------- int UdpTalkbackThread(void *par) { TALKTHRD_PARAM thdpar; fd_set fset; int ret = -1; struct timeval to; char acktest = '0'; char pBuf[NETCMD_TALKBACK_SIZE]; NET_HEAD netHead; MSG_HEAD msgHead; int nCount = 0; // Add the code by lvjh, 2009-09-23 //struct sockaddr_in addr; int nLen = 0; extern AUDIO_STREAM_BUFFER *g_audio_dec_stream; pthread_detach(pthread_self()); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); memcpy(&thdpar, par, sizeof(thdpar)); FD_ZERO(&fset); memset(&to, 0, sizeof(to)); while ((!g_server_info.bServerExit)&&g_talk_break_flag) { nCount++; // Add the code by lvjh, 2009-09-23 to.tv_sec = SOCK_TIME_OUT; to.tv_usec = 0; FD_SET(thdpar.hSock, &fset); ret = select(thdpar.hSock+1, &fset, NULL, NULL, &to); if (g_server_info.bServerExit) { break; } if (ret == -1) { break; } if (ret == 0) { /* ret = send(thdpar.hSock, &acktest, 1, 0); if (ret <= 0) { break; } */ #if 1 netHead.nFlag = HDVS_FLAG; netHead.nCommand = NETCMD_KEEP_ALIVE; netHead.nBufSize = 0; netHead.nReserve = g_server_info.dwUserID; printf("talkBack udp send keep alive '''' = %d\n", g_server_info.dwUserID); ret = udpSendMsg(thdpar.hSock, &netHead, sizeof(NET_HEAD), thdpar.addr); if (ret <= 0 && (errno == EPIPE || errno == ENOTSOCK || errno == EBADF)) { printf("NAT(%d): Keepalive Error!\n", thdpar.hSock); break; } #endif } if (!FD_ISSET(thdpar.hSock, &fset)) { continue; } nLen = sizeof(struct sockaddr_in); ret = recvfrom(thdpar.hSock, pBuf, NETCMD_TALKBACK_SIZE, MSG_WAITALL, (struct sockaddr*)&thdpar.addr, (socklen_t *)&nLen); if (ret > 0) { memcpy(&netHead, pBuf, sizeof(NET_HEAD)); printf("g_server_info.dwUserID = %d netHead.nCommand = %x\n\n", g_server_info.dwUserID, netHead.nCommand); #if 1 if(netHead.nCommand == NETCMD_REC_FILE ||netHead.nCommand == NETCMD_OPEN_TALK ||netHead.nCommand ==NETCMD_LOGON ||netHead.nCommand ==NETCMD_OPEN_CHANNEL ||netHead.nCommand ==NETCMD_P2P_CMD ||netHead.nCommand == NETCMD_CLOSE_TALK)break; else if (netHead.nCommand == NETCMD_KEEP_ALIVE){ printf("CMD: NETCMD_KEEP_ALIVE\n"); printf("P2P SERVER SEND dwUserID = %d\n", netHead.nReserve); netHead.nFlag = HDVS_FLAG; netHead.nCommand = NETCMD_KEEP_ALIVE; netHead.nBufSize = 0; if(netHead.nReserve == g_server_info.dwUserID){ printf("**************************************************\n"); TcpSendMsgToAll_UDPremote(REMOTE_IP, REMOTE_PORT, NETCMD_NAT_CONNECT); printf(" TcpSendMsgToAll_UDPremote success ! \n"); printf("**************************************************\n"); } } else { msgHead.nSock = thdpar.ip; msgHead.addr = thdpar.addr; msgHead.nCmd = netHead.nCommand; msgHead.nRight = 3; msgHead.nErrorCode = 0; msgHead.nBufSize = netHead.nBufSize; msgHead.nflag = UDP_FLAG; g_server_info.nupdate_flag = UDP_FLAG; ParseCommand(&msgHead, pBuf+sizeof(NET_HEAD)); } #endif ret = g_server_info.pCallbackStreamTalk(thdpar.ip, thdpar.port, pBuf+sizeof(NET_HEAD), (ret-sizeof(NET_HEAD))); } } #if 1 printf("Talk End (BY lvjh)(%d)!\n", thdpar.hSock); /******************add code by liujw 12-3-5***************************/ // 关闭AOUT 设备 ret =audioDecStop(TALK_CHANNEL); if (ret) { printf("audioDecStop Failed! 0x%x \n", ret); // return -1; } else printf("audioDecStop ok!\n"); audioDecClose(TALK_CHANNEL); if (ret) { printf("audioDecClose Failed! 0x%x \n", ret); // return -1; } else printf("audioDecClose ok!\n"); audioOutStop(TALK_CHANNEL); if (ret) { printf("audioOutStop Failed! 0x%x \n", ret); //return -1; } else printf("audioOutStop ok!\n"); ret = audioOutClose(TALK_CHANNEL); if (ret) { printf("audioOutClose(%s %d) Failed!\n", __FILE__, __LINE__); // return -1; } else printf("audioOutClose ok!\n"); audioDecModuleSemInit(); //zhangjing 2013-05-30 /*delete by zhangjing 2013-06-09 static open if (g_audio_dec_stream) { audioBufferClose(g_audio_dec_stream); }*/ #endif //HI_MPI_ADEC_DestroyChn(0); //g_aenc_module_pause_flag[0] = 1; //close(thdpar.hSock); //g_server_info.hUdpTalkbackSocket = -1; return 0; }
void broadcast(lx_light_container_t* lightCollection) { struct sockaddr_in sndaddr; memset((char *) &sndaddr, 0, sizeof(struct sockaddr_in)); sndaddr.sin_family = AF_INET; sndaddr.sin_port = htons(PORT); sndaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); lx_protocol_t header; header.protocol = 1024; header.addressable = 1; header.tagged = 1; header.origin = 0; header.source = 1; for (int i = 0; i < 8; i++) header.target[i] = 0; header.ack_required = 0; header.res_required = 0; header.sequence = 0; header.reserved16 = 0; for(int i = 0; i < 6; i++) { header.reserved[i] = 0; } header.type = LX_PROTOCOL_DEVICE_GET_SERVICE; header.size = offsetof(lx_protocol_t,payload); struct sockaddr_in recvaddr; socklen_t addrlen = sizeof(recvaddr); int recvlen; int counter = 0; lx_protocol_t msg; lx_light_t *next; lx_light_t *temp; next = lightCollection->start; while ((counter) == 0) { udpSendMsg(&broadcast_udp_socket, header, sndaddr); while (1) { recvlen = recvfrom(broadcast_udp_socket.socket, &msg, sizeof(lx_protocol_t), 0, (struct sockaddr *)&recvaddr, &addrlen); if (recvlen > 0) { if (msg.type == LX_PROTOCOL_DEVICE_STATE_SERVICE) { counter++; next = (lx_light_t *)malloc(sizeof(lx_light_t)); for (int i = 0; i < 8; i++) next->target[i] = msg.target[i]; next->addr = recvaddr; next->next = NULL; if (lightCollection->start == NULL) { lightCollection->start = next; } else { temp->next = next; } temp = next; } } if (recvlen == -1) { printf("Discovery done found %d bulbs \n", counter); break; } } } }