__checkReturn std::string UnpackedIP( __in PackedIP const f_ip ) { std::stringstream ss; ss << static_cast<int>(LowByte( LowWord( f_ip ) )) << "." << static_cast<int>(HighByte( LowWord( f_ip ) )) << "." << static_cast<int>(LowByte( HighWord( f_ip ) )) << "." << static_cast<int>(HighByte( HighWord( f_ip ) )); return ss.str(); }
//_____________________________________________________________________________ static MidiEvPtr rcvType (UDPStreamPtr f, Byte c) { f->length--; if (f->rcv[c]) { f->ptrCur = MidiNewEv (c); if (f->ptrCur) { f->parse = rcvShortHigh; f->shortDst = LowWord(&Date(f->ptrCur)); f->next = rcvPort; f->index = 0; } else f->parse = rcvIgnore; } // undefined MidiShare type for the udp stream else f->parse = rcvIgnore; return 0; }
// UDP数据发送线程 int UdpSendThread(void *pPar) { unsigned long lPar = 0; int channelNo = 0; int streamNo = 0; int opt; int ret; BOOL bRet; BOOL bMultiSend = FALSE; BOOL bFirstRead = TRUE; int hTcpDataSock = -1; int send_sample_size = 0; SEND_NODE *pHeadNode = NULL; SEND_NODE *pSendNode = NULL; pthread_mutex_t hNodeMutex; READ_POSITION *pReadPos = NULL; CHANNEL_STREAM *pStream = NULL; NET_DATA_PACKET netDataPack; struct sockaddr_in addr; // Add the code by lvjh, 2008-02-29 struct timeval tv; unsigned long long nStartTimeCount = 0; unsigned long long nCurTimeCount = 0; unsigned long nCount = 0; OPEN_CHANNEL closeHead; lPar = (unsigned long *)pPar; channelNo = LowWord(lPar); streamNo = HeightWord(lPar); pthread_detach(pthread_self()); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); bzero(&addr,sizeof(addr)); bzero(&netDataPack,sizeof(NET_DATA_PACKET)); // 判断是哪一种码流 addr.sin_family = AF_INET; if (0 == streamNo) { pHeadNode = g_server_info.udpStreamSend1.pUdpSendList[channelNo]; hNodeMutex = g_server_info.udpStreamSend1.hUdpSendListMutex[channelNo]; } else { pHeadNode = g_server_info.udpStreamSend2.pUdpSendList[channelNo]; hNodeMutex = g_server_info.udpStreamSend2.hUdpSendListMutex[channelNo]; } hTcpDataSock = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == hTcpDataSock) { net_debug(); return -1; } opt = SOCK_SNDRCV_LEN; setsockopt(hTcpDataSock, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)); if (0 == streamNo) { pStream = g_server_info.pChannelStream1[channelNo]; } else { pStream = g_server_info.pChannelStream2[channelNo]; } pReadPos = (READ_POSITION *)malloc(sizeof(READ_POSITION)); bzero(pReadPos,sizeof(READ_POSITION)); pthread_setspecific(g_server_info.hReadPosKey,pReadPos); pReadPos->nBegin = 0; pReadPos->nEnd = 1; pReadPos->bLost = FALSE; // Add the code by lvjh, 2008-02-29 gettimeofday (&tv, NULL); while (!g_server_info.bServerExit) { // 等待用户连接数据通道 pthread_mutex_lock(&pStream->hReadBlockMutex); while ((pReadPos->nBegin == pReadPos->nEnd) && (pReadPos->nBegin == pStream->nWritePos)) { pthread_cond_wait(&pStream->hReadBlockCond,&pStream->hReadBlockMutex); } pthread_mutex_unlock(&pStream->hReadBlockMutex); if (g_server_info.bServerExit) { break; } if (0 == GetUdpRunNode(channelNo,streamNo)) { usleep(100000); pReadPos->nBegin = pStream->nWritePos; pReadPos->nEnd = pStream->nWritePos; bFirstRead = TRUE; continue; } bMultiSend = FALSE; // 从码流BUFFER取数据包 bRet = GetOnePacket(pStream, &netDataPack,pReadPos, bFirstRead); if (!bRet) { net_debug(); usleep(40000); // Add the code by lvjh, 2008-03-27 printf("GetOnePacket(UDP): %d\n", bRet); continue; } bFirstRead = FALSE; // 开始处理码流传输 pthread_mutex_lock(&hNodeMutex); pSendNode = pHeadNode->pNext; while (pSendNode) { addr.sin_family = AF_INET; addr.sin_addr.s_addr = pSendNode->nUdpDataIP; addr.sin_port = pSendNode->nUdpDataPort; if (pSendNode->nType == PROTOCOL_UDP) // UDP传输 { // printf("g_server_info.hUdpListenSock = %d :%s : %d\n",g_server_info.hUdpListenSock, pSendNode->nUdpDataIP, pSendNode->nUdpDataPort); ret = sendto(g_server_info.hUdpListenSock, &netDataPack, netDataPack.packHead.nSize+sizeof(netDataPack.packHead), 0, (struct sockaddr *)&addr, sizeof(addr)); // ret = sendto(hTcpDataSock, &netDataPack, netDataPack.packHead.nSize+sizeof(netDataPack.packHead), 0, (struct sockaddr *)&addr, sizeof(addr)); } else if (!bMultiSend &&(pSendNode->nType == PROTOCOL_MULTI)) // MULTI传输 { ret = sendto(hTcpDataSock, &netDataPack, netDataPack.packHead.nSize+sizeof(netDataPack.packHead), 0, (struct sockaddr *)&addr, sizeof(addr)); /* // Add the code by lvjh, 2008-05-12 opt = inet_addr(g_wire_ip); ret = setsockopt(hTcpDataSock, IPPROTO_IP, IP_MULTICAST_IF, &opt, sizeof(opt)); ret = sendto(hTcpDataSock, &netDataPack, netDataPack.packHead.nSize+sizeof(netDataPack.packHead), 0, (struct sockaddr *)&addr, sizeof(addr)); opt = inet_addr(g_wireless_ip); ret = setsockopt(hTcpDataSock, IPPROTO_IP, IP_MULTICAST_IF, &opt, sizeof(opt)); ret = sendto(hTcpDataSock, &netDataPack, netDataPack.packHead.nSize+sizeof(netDataPack.packHead), 0, (struct sockaddr *)&addr, sizeof(addr)); */ bMultiSend = TRUE; } if (ret < 1) { net_debug(); } pSendNode = pSendNode->pNext; } pthread_mutex_unlock(&hNodeMutex); //usleep(10000); /* // Add the code by lvjh, 2008-02-29 gettimeofday (&tv, NULL); nCurTimeCount = tv.tv_sec*1000000+tv.tv_usec; nCount = nCurTimeCount-nStartTimeCount; if (nCount < g_send_sleep) { usleep(g_send_sleep-nCount); } */ } return 0; }