Exemplo n.º 1
0
__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();
}
Exemplo n.º 2
0
//_____________________________________________________________________________
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;
}
Exemplo n.º 3
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;
}