Ejemplo n.º 1
0
int TCPChild(void* Ptr){
	struct Thread* PT = (struct Thread *)Ptr;

	//Initialize parameters
	int Recv = 0;
	int PktSize = 0;
	int ContrlRate = 0;
	int ContrlPkt = 0;
	int Send = 0;
	int ArrIndex = PT->Arr;
	long Pkts = 0;
	double Time = 0;
	double ThreadRate = 0;
	double StdElapsed = 0;
	double SlpTime = 0;
	SOCKET TCPSock;
	TCPSock = PT->TNewSock;

	mtx_lock(&MutexS);
	PT->TCPNum = PT->TCPNum + 1;	//TCP client number
	mtx_unlock(&MutexS);

	char *ReceiveBuf;
	char *SendBuf;
	ReceiveBuf = (char *)malloc(sizeof(char)* 1024);

	while (1){
		if ((Recv = recv(TCPSock, ReceiveBuf, 1024, 0)) == SOCKET_ERROR){
			printf("recv() failed with error code: %d\n", WSAGetLastError());
			return 0;
		}
		else{
			memcpy(&PktSize, ReceiveBuf, sizeof(int));
			memcpy(&ContrlRate, ReceiveBuf + 4, sizeof(int));
			memcpy(&ContrlPkt, ReceiveBuf + 8, sizeof(int));
			break;
		}
	}

	//Start a timer
	ES_FlashTimer TCPst = ES_FlashTimer();
	TCPst.Start();

	//Send data to client
	SendBuf = (char *)malloc(sizeof(char)* PktSize);
	while (1){
		/* Insert data to Send buffer here*/
		if ((Send = send(TCPSock, SendBuf, PktSize, 0)) == SOCKET_ERROR){
			printf("\nConnection failed with error code: %d\n", WSAGetLastError());
			break;
		}
		else{
			mtx_lock(&MutexS);
			Time = (double)TCPst.Elapsed() / 1000;	//Elapsed time in second
			Pkts = Pkts + 1;
			ThreadRate = (double)Pkts * PktSize / (double)(Time * 1024 * 1024);	//Transmission rate
			PT->AggArray[ArrIndex] = ThreadRate; //Transmitting rate
			mtx_unlock(&MutexS);
			//Control rate
			if (ContrlRate != 0){
				StdElapsed = (long double)Pkts * PktSize / ContrlRate;
				if (StdElapsed > Time){
					SlpTime = 1000 * (StdElapsed - Time);
					Sleep(SlpTime);
				}
			}
			//Control Packet Number
			if (ContrlPkt != 0){
				if (Pkts >= ContrlPkt){
					printf("Transmission completed\n");
					break;
				}
			}
		}
	}
	PT->TCPNum = PT->TCPNum - 1;
	PT->AggArray[ArrIndex] = 0;
	//thrd_join(TCPChild, NULL);
	free(ReceiveBuf);
	free(SendBuf);
}
Ejemplo n.º 2
0
int UDPChild(void* Ptr){
	struct Thread *Pt = (struct Thread*)Ptr;

	//Initialize parameters
	SOCKET UDPSend;
	socklen_t slen;
	int ArrIndex = Pt->Arr;
	int PktSize = Pt->PacketSize;
	int ContrlRate = Pt->ControlRate;
	int ContrlPkt = Pt->ControlNumber;
	int Sqn = 0;	//Sequential Number
	long Pkts = 0;
	double Time = 0;
	double ThreadRate = 0;
	double StdElapsed = 0;
	double SlpTime = 0;

	mtx_lock(&MutexS);
	Pt->UDPNum = Pt->UDPNum + 1;	//TCP client number
	mtx_unlock(&MutexS);
	struct sockaddr_in UDPAddr;
	UDPAddr = Pt->ClientAddr;
	slen = sizeof(UDPAddr);
	char *SendBuf;
	SendBuf = (char *)malloc(sizeof(char)*PktSize);

	//Initialize winsock
#ifdef WIN32
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){
		printf("Failed to Initialize, Error code : %d\n", WSAGetLastError());
		exit(EXIT_FAILURE);
	}
#endif
	if ((UDPSend = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET){
		printf("Could not create socket : d%\n", WSAGetLastError());
	}

	//Start a timer
	ES_FlashTimer UDPst = ES_FlashTimer();
	UDPst.Start();

	//Send data to UDP client with sequential number
	while (1){
		memset(SendBuf, 0, PktSize);
		Sqn = Sqn + 1;
		memcpy(SendBuf, &Sqn, sizeof(int));		//allocate sequential number
		if (sendto(UDPSend, SendBuf, PktSize + 4, 0, (struct sockaddr *)&UDPAddr, slen) == SOCKET_ERROR){
			printf("sendto() failed. Error code : %d\n", WSAGetLastError());
			break;
		}
		else{
			mtx_lock(&MutexS);
			Time = (double)UDPst.Elapsed() / 1000;		//Elapsed time in second
			Pkts = Pkts + 1;
			ThreadRate = (double)Pkts * PktSize / (double)(Time * 1024 * 1024);	//Transmission rate
			Pt->AggArray[ArrIndex] = ThreadRate; //Transmitting rate
			mtx_unlock(&MutexS);
			//Control rate
			if (ContrlRate != 0){
				StdElapsed = (long double)Pkts * PktSize / ContrlRate;
				if (StdElapsed > Time){
					SlpTime = 1000 * (StdElapsed - Time);
					Sleep(SlpTime);
				}
			}
			//Control Packet Number
			if (ContrlPkt != 0){
				if (Pkts >= ContrlPkt){
					printf("Transmission completed\n");
					break;
				}
			}
		}
	}
	Pt->AggArray[ArrIndex] = 0;
	Pt->UDPNum = Pt->UDPNum - 1;
	//thrd_join(UDPChild, NULL);
	free(SendBuf);
}
Ejemplo n.º 3
0
//print output stat
void printStatData2(void* f)
{
	int* freq = (int*) f;
	int sec;
	double r = 0;
	string unit;
	do{
		#ifdef WIN32
		EnterCriticalSection(&csec);
		#else
			//linux
		#endif

			r = sdata.currentRate;
		
		#ifdef WIN32
		LeaveCriticalSection(&csec);
		sec = double(GetTickCount() - time_Begin)/1000.0;
		#else
			//linux
		sec = double(x_timer.Elapsed())/1000.0;
		#endif

		
		unit = "Bps";
		if(r >= 1024)
		{
			r /= 1024; //KBps
			unit = "KBps";
		}
		if (r >= 1024)
		{
			r /= 1024; //MBps;
			unit = "MBps";
		}
			
			//cout << "Time: " << sec << "| Rate: " << r;
		printf("Elapsed [%ds] ",sec);
		#ifdef WIN32
		EnterCriticalSection(&csec);
		#else
			//linux
		#endif

		cout << "Pkts [" << sdata.getrecvPkt() <<"] ";
		printf("Lost [%ld, %.4g%%] ", sdata.getlostPkt(), sdata.getlostRate());
		printf("Rate [%.4g%s] ", r, unit.c_str());
		printf("Jitter [%.4gms]  ", sdata.calJitter(sdata.calltime));
		
		#ifdef WIN32
		LeaveCriticalSection(&csec);
		Sleep(*freq);
		#else
			//linux
		if(*freq >= 1000)
		{
			//cout << "sleep: " << (*freq)/1000 << "usleep: " << (*freq%1000)*1000 << endl;
			sleep((*freq)/1000);
			usleep((*freq%1000)*1000);
		}
		else
		{
			//cout << "usleep: " << (*freq)*1000 << endl;
			usleep((*freq)*1000);
		}
		#endif
		cout << '\r';

	}while(*freq>=0);
	if(*freq<0)
	{
		cout << endl;
		exit(0);
	}

	return;
}