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
int main(int argc, char* argv[])
{
	isDone=false;
	char result = checkInput(argc, argv);
	int freq;
	//host information mode
	if(result == 'h')
	{
		HostInfo h;
		getHostInfo(argc, (argc<3)?"127.0.0.1":argv[2], h);
		printHostInfo(h);
	}
	//send mode
	if(result == 'x') //ori os 's'
	{
		SendArg s(argv);
		freq = s.freq;
		#ifdef WIN32
			InitializeCriticalSectionAndSpinCount(&csec,0x00000400);
			_beginthread(printStatData2, 0, (void*) &freq);
		#else
			//linux
			tthread::thread t1(printStatData2, (void*) &freq);
			x_timer.Start();
		#endif
		time_MainBegin = time(NULL);

		#ifdef WIN32
			time_Begin = timeGetTime();
		#else
			time_Begin = x_timer.ElapsedX();
		#endif
		//cout << "send" << endl;
		sendInfo(s);
				

		#ifndef WIN32 //linux
			pthread_kill(t1.native_handle(), SIGINT);
			cout << "last Print" << endl;
			//t1.join();	
		#endif

		cout << '\r';
		freq = -1;
		cout << "last Print" << endl;
		printStatData2(&freq);
	}
	//receive mode
	if(result == 'r')
	{
		RecvArg r(argv);
		freq = r.freq;
		#ifdef WIN32
			InitializeCriticalSectionAndSpinCount(&csec,0x00000400);
			_beginthread(printStatData2, 0, (void*) &freq);
		#else
			//linux
			tthread::thread t1(printStatData2, (void*) &freq);
			x_timer.Start();
		#endif
		time_MainBegin = time(NULL);
		recvInfo(r);
		#ifndef WIN32 //linux
			pthread_kill(t1.native_handle(), SIGINT);
		#endif
		cout << '\r';
		freq = -1;
		printStatData2(&freq);
	}
	//Asg2 Server-Client
	if(result == 's')
	{
		//server mode
		time_serBegin = x_serTimer.Start();
		ServerArg serArg(argv);
		int freq = serArg.freq;
		tthread::thread th(printServerData, (void*) freq);
		run_server(serArg);
		//printServerData(freq);
		th.join();
	}
	if(result == 'c')
	{
		//client
	}
	//
	//system("Pause");
	#ifdef WIN32
		DeleteCriticalSection(&csec);
	#else
		//linux
	#endif

	return 0;
}