bool RnRetransmitExpiry()
{
    RnRetransmit retransmit;

    retransmit.add(makePacket(1), PACKET_SIZE, 100, 1);
    retransmit.add(makePacket(2), PACKET_SIZE, 200, 1);
    retransmit.add(makePacket(3), PACKET_SIZE, 300, 1);

    retransmit.update(50);
    RnAssert(retransmit.expired().empty());

    retransmit.update(100);

    QList<RnRetransmit::Item> items = retransmit.expired();
    RnAssert(items.size() == 1);

    RnAssert(items[0].packet->seq == 1);
    RnAssert(items[0].timeout == 100);
    RnAssert(items[0].remainingTime == 0);
    RnAssert(items[0].remainingTries == 1);

    retransmit.remove(items[0]);

    retransmit.update(100);

    items = retransmit.expired();
    RnAssert(items.size() == 1);

    RnAssert(items[0].packet->seq == 2);
    RnAssert(items[0].timeout == 200);
    RnAssert(items[0].remainingTime == 0);
    RnAssert(items[0].remainingTries == 1);

    retransmit.remove(items[0]);

    retransmit.update(100);

    items = retransmit.expired();
    RnAssert(items.size() == 1);

    RnAssert(items[0].packet->seq == 3);
    RnAssert(items[0].timeout == 300);
    RnAssert(items[0].remainingTime == 0);
    RnAssert(items[0].remainingTries == 1);

    retransmit.remove(items[0]);

    retransmit.update(1000);
    RnAssert(retransmit.expired().empty());

    return true;
}
const BOOL cProxyClient::SetChannel(const DWORD dwSpace, const DWORD dwChannel)
{
	if (!m_bTuner)
		return FALSE;
//	if ((m_dwSpace == dwSpace) && (m_dwChannel == dwChannel))
//		return TRUE;
	makePacket(eSetChannel2, dwSpace, dwChannel, g_ChannelLock);
	m_dwResEvent[edwResSetChannel2]->Wait();
	DWORD dw;
	{
		LOCK(m_readLock);
		dw = m_dwRes[edwResSetChannel2];
	}
	BOOL b;
	switch (dw)
	{
	case 0x00:	// 成功
	{
		LOCK(m_writeLock);
		TsFlush();
		m_dwSpace = dwSpace;
		m_dwChannel = dwChannel;
	}
	case 0x01:	// fall-through / チャンネルロックされてる
		b = TRUE;
		break;
	default:
		b = FALSE;
		break;
	}
	return b;
}
Example #3
0
void quit(int sig)
{	cout << "QUIT WAS CALLED"<< endl;
	MW244BPacket p;
	makePacket(&p,'f',-1, updateSeqNo);
	sendPacketToPlayers(p);
	StopWindow();
	exit(0);
}
void broadcastMessage(std::string text, IClientSocket *socket)
{
	ChatPacket *packet = makePacket(text);
	
	sendData(packet, socket);
	
	delete packet;
}
Example #5
0
/**********************************************
 * Initilise sonar,
 * check alive, send version request, check for
 * reply
 * returns 1 if set up, -1 if failed.
 * *******************************************/
int initSonar( void )
{

	int initFlag = 0, initAlive = 0;

	ROS_INFO("Sonar Initilization\n");

	// Check port for mtAlive
	while( initFlag != 1 )
	{

		//Read Port
		sortPacket();

		//Check for mtAlive command
		if( returnMsg() == mtAlive )
		{
			ROS_INFO("initSonar \t<< mtAlive!\n");
			initAlive = 1;
			//Send over the mtSendVersion
			makePacket(mtSendVersion);
			ROS_INFO("initSonar \t>> mtSendVersion\n");

		}
		// Did we get back mtVersionData and is the alive flag set?
		else if( returnMsg() == mtVersionData && initAlive == 1)
		{
			ROS_INFO("initSonar \t<< mtVersionData!\n");
			initFlag = 1;
		}
		else if( initAlive == 1 )
		{
			makePacket(mtSendVersion);
			ROS_INFO("initSonar \t>> mtSendVersion\n");			
		}
		else
		{
			initFlag = 0;
		}

	}

	return 0;

}
extern "C" void scsynth_android_doOsc(JNIEnv* env, jobject classobj, jobjectArray oscMessage){
    if (world->mRunning){
        small_scpacket packet;
        makePacket(env,oscMessage,packet);
        World_SendPacket(world, packet.size(),  (char*)packet.buf, androidReplyFunc);
    }else{
    	scprintf("scsynth_android_doOsc: not running!\n");
    }
}
int requestData( void )
{
	
	int recieveFlag = 0, sendFlag = 0, headPack = 0;
	
	while(recieveFlag != 1)
	{

		if(sendFlag == 0)
		{
			//Make the sendData packet and send
			makePacket(mtSendData);
			ROS_INFO("requestData \t>> mtSendData\n");
			sendFlag = 1;
		}	
		//usleep(500);
		
		while( recieveFlag != 1)
		{
			sortPacket();
			//if you get some data back go forth
			if(returnMsg() == mtHeadData)
			{
				ROS_INFO("requestData \t<< mtHeadData!!\n");
				headPack = 1;
			}
			else if(returnMsg() == mtAlive && headPack == 1)
			{
				recieveFlag = 1;
			}
			else
			{
				//Make the sendData packet and send
				makePacket(mtSendData);
				ROS_INFO("requestData \t>> mtSendData\n");
				sendFlag = 1;				
			}
		}
			
	}

	return 0;
	
}
BOOL cProxyClient::CreateBonDriver()
{
	makePacket(eCreateBonDriver);
	m_bResEvent[ebResCreateBonDriver]->Wait();
	{
		LOCK(m_readLock);
		if (m_bRes[ebResCreateBonDriver])
			m_bBonDriver = TRUE;
		return m_bRes[ebResCreateBonDriver];
	}
}
void sendMessage(std::string text)
{
	ChatPacket *packet = makePacket(text);
	
	//	Send to your server connection
	if(packet->dlen > 0 && state.enableClient == true){
		state.client->Send((char*)packet, packet->plen);
	}
		
	delete packet;
}
const BOOL cProxyClient::SetLnbPower(const BOOL bEnable)
{
	if (!m_bTuner)
		return FALSE;
	makePacket(eSetLnbPower, bEnable);
	m_bResEvent[ebResSetLnbPower]->Wait();
	{
		LOCK(m_readLock);
		return m_bRes[ebResSetLnbPower];
	}
}
const DWORD cProxyClient::GetActiveDeviceNum(void)
{
	if (!m_bTuner)
		return 0;
	makePacket(eGetActiveDeviceNum);
	m_dwResEvent[edwResGetActiveDeviceNum]->Wait();
	{
		LOCK(m_readLock);
		return m_dwRes[edwResGetActiveDeviceNum];
	}
}
LPCTSTR cProxyClient::EnumChannelName(const DWORD dwSpace, const DWORD dwChannel)
{
	if (!m_bTuner)
		return NULL;
	makePacket(eEnumChannelName, dwSpace, dwChannel);
	m_pResEvent[epResEnumChannelName]->Wait();
	{
		LOCK(m_readLock);
		return m_pRes[epResEnumChannelName];
	}
}
void cProxyClient::Release(void)
{
	if (m_bTuner)
		CloseTuner();
	makePacket(eRelease);
	m_bRereased = TRUE;
	{
		LOCK(Lock_Global);
		InstanceList.remove(this);
	}
	delete this;
}
BOOL cProxyClient::SelectBonDriver()
{
	{
		LOCK(Lock_Global);
		makePacket(eSelectBonDriver, g_BonDriver);
	}
	m_bResEvent[ebResSelectBonDriver]->Wait();
	{
		LOCK(m_readLock);
		return m_bRes[ebResSelectBonDriver];
	}
}
const BOOL cProxyClient::OpenTuner(void)
{
	if (!m_bBonDriver)
		return FALSE;
	makePacket(eOpenTuner);
	m_bResEvent[ebResOpenTuner]->Wait();
	{
		LOCK(m_readLock);
		if (m_bRes[ebResOpenTuner])
			m_bTuner = TRUE;
		return m_bRes[ebResOpenTuner];
	}
}
Example #16
0
void HttpPoll::connectToHost(const QString &proxyHost, int proxyPort, const QUrl &url)
{
	resetConnection(true);

	bool useSsl = false;
	d->port = 80;
	// using proxy?
	if(!proxyHost.isEmpty()) {
		d->host = proxyHost;
		d->port = proxyPort;
		d->url = url;
		d->use_proxy = true;
	}
	else {
		d->host = url.host();
		if(url.port() != -1)
			d->port = url.port();
		else if (url.scheme() == "https") {
			d->port = 443;
			useSsl = true;
		}
#if QT_VERSION < 0x050000
		d->url = url.path() + "?" + url.encodedQuery();
#else
		d->url.setUrl(url.path() + "?" + url.query(QUrl::FullyEncoded), QUrl::StrictMode);
#endif
		d->use_proxy = false;
	}

	resetKey();
	bool last;
	QString key = getKey(&last);

#ifdef PROX_DEBUG
	fprintf(stderr, "HttpPoll: Connecting to %s:%d [%s]", d->host.latin1(), d->port, d->url.latin1());
	if(d->user.isEmpty())
		fprintf(stderr, "\n");
	else
		fprintf(stderr, ", auth {%s,%s}\n", d->user.latin1(), d->pass.latin1());
#endif
	QPointer<QObject> self = this;
	syncStarted();
	if(!self)
		return;

	d->state = 1;
	d->http.setUseSsl(useSsl);
	d->http.setAuth(d->user, d->pass);
	d->http.post(d->host, d->port, d->url, makePacket("0", key, "", QByteArray()), d->use_proxy);
}
Example #17
0
void respondToClient(struct ClientNode *client, HeaderFlag flag, uint8_t *data, ssize_t dataLen)
{
	struct ChatHeader responseHeader;
	responseHeader.sequenceNumber = ntohl(client->packetData->sequenceNumber);
	responseHeader.checksum = ntohs(client->packetData->checksum);
	responseHeader.flag = flag;
	uint8_t *packet = makePacket(responseHeader, data, dataLen);
	ssize_t packetLength = kChatHeaderSize + dataLen;

	ssize_t bytesSent;
	if ((bytesSent = sendErr(client->clientSocket, packet, packetLength, 0)) < 0) {
		perror("respondToClient:send");
	}
	free(packet);
}
void remoteMessage(std::string text, IClientSocket *socket, bool wait)
{
	ChatPacket *packet = makePacket(text);
	
	if(packet->dlen > 0)
	{	
		//	No remote socket specified, send message to the server
		if(socket == NULL) socket = state.client;
		
		//	Send message
		socket->Send((char *)packet, packet->plen, wait);
	}
	
	delete packet;
}
cProxyClient::~cProxyClient()
{
	if (!m_bRereased)
	{
		if (m_bTuner)
			CloseTuner();
		makePacket(eRelease);
	}

	m_Error.Set();

//	if (m_iEndCount != -1)
//		SleepLock(3);

	if (m_hThread != 0)
		::pthread_join(m_hThread, NULL);

	int i;
	{
		LOCK(m_writeLock);
		for (i = 0; i < 8; i++)
		{
			if (m_pBuf[i] != NULL)
				delete[] m_pBuf[i];
		}
		::memset(m_pBuf, 0, sizeof(m_pBuf));
		TsFlush();
		if (m_LastBuff != NULL)
		{
			delete m_LastBuff;
			m_LastBuff = NULL;
		}
	}

	for (i = 0; i < ebResNum; i++)
		delete m_bResEvent[i];
	for (i = 0; i < edwResNum; i++)
		delete m_dwResEvent[i];
	for (i = 0; i < epResNum; i++)
		delete m_pResEvent[i];

	::pthread_cond_destroy(&m_c);
	::pthread_mutex_destroy(&m_m);

	if (m_s != INVALID_SOCKET)
		::close(m_s);
}
void cProxyClient::PurgeTsStream(void)
{
	if (!m_bTuner)
		return;
	makePacket(ePurgeTsStream);
	m_bResEvent[ebResPurgeTsStream]->Wait();
	BOOL b;
	{
		LOCK(m_readLock);
		b = m_bRes[ebResPurgeTsStream];
	}
	if (b)
	{
		LOCK(m_writeLock);
		TsFlush();
	}
}
void cProxyClient::CloseTuner(void)
{
	if (!m_bTuner)
		return;

	makePacket(eCloseTuner);
	m_bTuner = FALSE;
	m_fSignalLevel = 0;
	m_dwSpace = m_dwChannel = 0xff;
	{
		LOCK(m_writeLock);
		m_dwBufPos = 0;
		for (int i = 0; i < 8; i++)
		{
			if (m_pBuf[i] != NULL)
				delete[] m_pBuf[i];
		}
		::memset(m_pBuf, 0, sizeof(m_pBuf));
	}
}
Example #22
0
void Communicator::getPacket() {
	if (index == 0) {
		int rd = this->readBytes(buffer, 1);
		if (rd > 0) {
			size = buffer[0];
			index = 1;
		}
	} else {
		int rd = this->readBytes(buffer + index, 1 + size - index);
		if (rd > 0) {
			index += rd;
			if (index == size + 1) {
				makePacket();
				for (unsigned int i = 0; i < index; i++) {
					buffer[i] = 0;
				}
				index = 0;
			}
		}
	}
}
Example #23
0
int sendBB( void )
{
	int bbFlag = 0;

	while( bbFlag != 1 )
	{

		if( returnMsg() == mtBBUserData )
		{
			ROS_INFO("sendBB \t<< mtBBUserData!\n");
			bbFlag = 1;
		}
		else
		{
			makePacket(mtSendBBUser);
			ROS_INFO("sendBB \t>> mtSendBBUser\n");			
		}

	}

	return 0;

}
Example #24
0
void HttpPoll::do_sync()
{
	if(d->http.isActive())
		return;

	d->t->stop();
	d->out = takeWrite(0, false);

	bool last;
	QString key = getKey(&last);
	QString newkey;
	if(last) {
		resetKey();
		newkey = getKey(&last);
	}

	QPointer<QObject> self = this;
	syncStarted();
	if(!self)
		return;

	d->http.post(d->host, d->port, d->url, makePacket(d->ident, key, newkey, d->out), d->use_proxy);
}
/**
 * Currently we assume that a message is either
 * 1. A primitive (strings, ints, etc) message
 * 2. A bundle of other messages
 * There is no provision for the situation where a message contains both
 * primitive and bundle data, but you can bundle bundles
 */
void makePacket(JNIEnv* env, jobjectArray oscMessage, small_scpacket& packet,int start=0) {
    int numElements = env->GetArrayLength(oscMessage);

#ifndef NDEBUG
    scprintf("received a message with %i elements\n",numElements);
#endif
    if (numElements<=0) return; // No message
    int i;
    jobject obj;
    const char* stringPtr;
    jclass integerClass = env->FindClass("java/lang/Integer");
    jmethodID getIntMethod = env->GetMethodID(integerClass,"intValue","()I");
    jclass floatClass = env->FindClass("java/lang/Float");
    jmethodID getFloatMethod = env->GetMethodID(floatClass,"floatValue","()F");
    jclass stringClass = env->FindClass("java/lang/String");
    jclass oscClass = env->FindClass(OSC_MESSAGE_CLASS);
    jmethodID toArrayMethod = env->GetMethodID(oscClass,"toArray","()[Ljava/lang/Object;");
	obj = env->GetObjectArrayElement(oscMessage,0);
	if (env->IsInstanceOf(obj,oscClass)) {
#ifndef NDEBUG
		scprintf("it's a bundle!\n");
#endif
		packet.OpenBundle(0);
		while (start<numElements) {
			obj = env->GetObjectArrayElement(oscMessage,start);
			jobjectArray bundle = (jobjectArray) env->CallObjectMethod(obj,toArrayMethod);
#ifndef NDEBUG
			scprintf("making a new packet %i\n",start);
#endif
			packet.BeginMsg();
			makePacket(env, bundle, packet);
			packet.EndMsg();
			++start;
		}
		packet.CloseBundle();
	} else if (env->IsInstanceOf(obj,stringClass)) {
		stringPtr = env->GetStringUTFChars((jstring)obj,NULL);
		packet.adds(stringPtr);
#ifndef NDEBUG
		scprintf("cmd %s\n",stringPtr);
#endif
		env->ReleaseStringUTFChars((jstring)obj,stringPtr);
		packet.maketags(numElements);
		packet.addtag(',');
		for (i=1;i<numElements;++i) {
			obj = env->GetObjectArrayElement(oscMessage,i);
			if (env->IsInstanceOf(obj,integerClass)) {
				packet.addtag('i');
				packet.addi(env->CallIntMethod(obj,getIntMethod));
			} else if (env->IsInstanceOf(obj,floatClass)) {
				packet.addtag('f');
				packet.addf(env->CallFloatMethod(obj,getFloatMethod));
			} else if (env->IsInstanceOf(obj,stringClass)) {
				packet.addtag('s');
				stringPtr = env->GetStringUTFChars((jstring)obj,NULL);
#ifndef NDEBUG
				scprintf("arg %s\n",stringPtr);
#endif
				packet.adds(stringPtr);
				env->ReleaseStringUTFChars((jstring)obj,stringPtr);
			}
		}
    }
}
Example #26
0
int requestData( void )
{

	int recieveFlag = 0, sendFlag = 0, headPack = 0;
	int count;

	while(recieveFlag != 1)
	{

		if(sendFlag == 0)
		{
			//Make the sendData packet and send
		//	tcflush(fd, TCIFLUSH);//remove
		//	usleep(50);//remove
		//	tcflush(fd, TCIFLUSH);//remove
		//	usleep(50);//remove
			makePacket(mtSendData);
//			ROS_INFO("requestData \t>> mtSendData\n");
			//tcflush(fd, TCIFLUSH);//remove
			//usleep(50);//remove
			sendFlag = 1;
		}	
		//usleep(500);
		count = 0;
		while( recieveFlag != 1)
		{
			sortPacket();
			//if you get some data back go forth
			if(returnMsg() == mtHeadData)
			{
//				ROS_INFO("requestData \t<< mtHeadData!!\n");
				headPack = 1;
				return 0;

			}
			else if(returnMsg() == mtAlive && headPack == 1)
			{
				recieveFlag = 1;
				//tcflush(fd, TCIFLUSH);//remove
			}
			else
			{
				if(count > 10)
				{
				//Make the sendData packet and send
				//	tcflush(fd, TCIFLUSH);//remove
				//	usleep(500);//remove
					makePacket(mtSendData);
					ROS_INFO("requestData \t>> mtSendData\n");
					sendFlag = 1;	
					count = 0;
				}	

				count ++;	
				//printf("%d\n", count);	
			}
		}

	}

	return 0;

}
Example #27
0
ServiceClient()
{
	register IOBUFFER *iop = &InputBuffer[0];
	int	n,m;
	char	*ptr, *net;

	if((iop->inputbuf = (char *) xalloc(BUFSIZE)) == NULL)
	{
		SendNull();
		return;
	}
	iop->buflen	= BUFSIZE;

	if(!Read(0, iop->inputbuf, HEADERSIZE))
	{
		fprintf(stderr, "Cannot read the HEADERSIZE\n");
		SendNull();
		return(-1);
	}

	iop->bufptr = HEADERSIZE;
	iop->msglen = *(int *) iop->inputbuf;

	if(iop->buflen < iop->msglen)
	{
	   iop->inputbuf = (char *) xrealloc(iop->inputbuf, iop->msglen);
	   if( iop->inputbuf == NULL)
           {
                SendNull();
                return;
           }
	   iop->buflen	= iop->msglen;
	}

	if(!Read(0, &iop->inputbuf[iop->bufptr], iop->msglen - iop->bufptr))
	{
		fprintf(stderr, "Cannot read the rest of the message\n");
		SendNull();
		return(-1);
        }

	ptr = &iop->inputbuf[sizeof(int)];
	m = *(int *) ptr;
	ptr += sizeof(int);

	flags = *(int *) ptr;
	ptr += sizeof(int);

	dispno = *(int *) ptr;

	ptr += sizeof(int);
	n = *(int *) ptr;

	ptr += sizeof(int);
	net  = ptr;

	ptr = &iop->inputbuf[m];
	inlen = *(int *) ptr;

	ptr += sizeof(int);
	nhosts = *(int *) ptr;

	inbuf = ptr + sizeof(int);
	TheEnd = &inbuf[inlen];
#ifdef DEBUG
	write(2, inbuf, inlen);
#endif
        nextentry = ((xHostEntry *) inbuf)->length;
        if((ptr = (char *) makePacket()) != NULL)
	{
#ifdef DEBUG1
                	write(2, ptr, (*(int *) ptr) + 2*sizeof(int));
#endif
                	write(1, ptr, (*(int *) ptr) + 2*sizeof(int));
        }
	return(1);
}
//파일을 보내는 함수. 이 함수를 스레드를 이용해 병렬적으로 실행시킨다. 클라이언트는 이때 파일을 받는 함수를 실행해야 함.
void* SendData(void* p)
{
	int nread;			//데이터의 크기
	char file_buffer[MAX_BUFFER];	//데이터를 담을 버퍼
	char ACK_buffer[8] = {0, };	//ACK 응답을 담을 버퍼. "ACK" + int 의 7바이트를 담을 수 있도록
	char* ACKWindow = NULL;		//ACK 처리여부 윈도우. 최대 (블록 크기(B) * 윈도우) 크기 정도의 용량 전송
					//이 윈도우는 처음에 0으로 초기화, ACKWindow[n]이 1이 된다는 것은
					//ACK(n)을 받았다는 것으로 인식한다.

	FILE* f;			//보낼 파일의 디스크립터
	int ACKresult;			//ACK 읽어본 후 결과값
	int filesize;			//파일의 크기. 이것도 상대에게 보냄
	int currentSend = 0;		//지금까지 보낸 파일의 크기

	int retcode;
	int nextSeq = 0;		//이제 보내야 할 부분 seq 인덱스
	
	time_t lastTime;		
	time_t currentTime;		//1초마다 상황 출력을 위해 사용할 시간 변수


	/*======매개변수 p(threadArgs 구조채)의 정보에서 소켓과 클라이언트 정보를 가져온다=====*/
	threadArgs* args = (threadArgs*)p;
	int socketDes;
	char fname[MSGLEN];
	struct sockaddr_in clientAddr;
	socklen_t client_addr_size;
	int* threadIdx = NULL;

	socketDes = args->dataSocketDes;
	strcpy(fname, args->fname);
	clientAddr = args->dataAddr;
	client_addr_size = args->data_addr_size;
	threadIdx = args->threadIdx;
	/*===================================================================================*/


	//ACK 윈도우는 각 seq num에 대응된다. ACKWindow[5]는 seq 5를 의미.
	//이를 0으로 초기화하였다.
	ACKWindow = (char*)calloc(MAX_WINDOW, sizeof(char));

	if((f = fopen(fname, "rb")) == NULL)
		exit(1);

	//파일의 크기를 보낸다.
	fseek(f, 0L, SEEK_END);	//일단 파일 끝 부분으로 포인터 이동
	filesize = ftell(f);	//그 포인터 값이 바로 파일 크기이다.
	fseek(f, 0L, SEEK_SET);	//다시 파일 처음 부분으로 포인터 이동
	memcpy((int*)(file_buffer), &filesize, 4);	//파일 크기를 보냄
	

	nread = makePacket(nextSeq, 4, file_buffer);	//앞에 0 seq을 넣어보냄.	
	
	//동기화를 위한 수신 함수. 그 외에는  아무 의미 없다.
	nread = recvfrom(socketDes, ACK_buffer, 8, 0, (struct sockaddr*)&clientAddr, &client_addr_size);	




	//파일 크기를 보낸다.
	nread = sendto(socketDes, file_buffer, nread, 0, (struct sockaddr*)&clientAddr, sizeof(clientAddr));
	//이때는 ACK 0의 대답을 받아내야 한다.

	//ACK(n) 메시지는 7바이트로 가정. ("ACK" 3바이트 + n은 정수 4바이트)
	while(ACKWindow[nextSeq] == 0)
	{
		//!!!rcvfrom은 데이터를 받을 때까지 대기한다.
		nread = recvfrom(socketDes, ACK_buffer, 8, 0, (struct sockaddr*)&clientAddr, &client_addr_size);	

		ACKresult = extractACK(ACK_buffer);
		//상대방이 보낸 ACK를 읽어들인다. 0을 얻어야 한다.

		if(ACKresult == nextSeq)
		{
			//원하는 ACK(n)이었다면 window[0] 확인. 다음 seq 준비
			ACKWindow[nextSeq] = 1;
			nextSeq++;
			break;
		}

		else retransfer();

	}

	time(&lastTime);

	while(!feof(f))
	{
		file_buffer[0] = '\0';
		nread = fread(file_buffer, 1, DATA_BLOCK, f);
		//파일에서 DATA_BLOCK(200)바이트 정도를 파일 버퍼로 가져온다.
		nread = makePacket(nextSeq, nread, file_buffer);	//앞에 1, 2, ..n  seq을 넣어보냄.	

		//현 시간 - 아까 기록한 시간의 차가 1 이상이면 1초가 흐른 것으로 간주.
		if((time(&currentTime) - lastTime) >= 1)
		{
			printf("Transfer status : send[%s][%d%c , %f MB / %f MB]\n", fname, (int)((double)currentSend * 100 /filesize),'%', (double)currentSend/1000000, (double)filesize/1000000);
			time(&lastTime);
		}
	

		while(ACKWindow[nextSeq] == 0)
		{
			//데이터를 보낸다.
			nread = sendto(socketDes, file_buffer, nread, 0, (struct sockaddr*)&clientAddr, sizeof(clientAddr));
	
			currentSend += (nread - 4);

			//파일을 보냈으니 이젠 대답을 기다린다.
			nread = recvfrom(socketDes, ACK_buffer, 8, 0, (struct sockaddr*)&clientAddr, &client_addr_size);
			ACKresult = extractACK(ACK_buffer);	

			if(ACKresult == nextSeq)
			{
				ACKWindow[nextSeq] = 1;
				nextSeq++;
				break;
			}

			else retransfer();
		}
	}

	fclose(f);

	//파일이 모두 전송되었다면 파일이 끝났다는 메세지를 보낸다.

	printf("Successfully transferred.\n");

	strcpy(file_buffer, "endoffile");
	sendto(socketDes, file_buffer, strlen("endoffile"), 0, (struct sockaddr*)&clientAddr, sizeof(clientAddr));	

	//윈도우 반환
	free(ACKWindow);

	//이제 데이터 전송 스레드가 끝났다면, 스레드 수를 감소시킨다.
	//threadIdx는 위 commandProcessing 함수 안의 지역변수이다.
	(*threadIdx) = (*threadIdx) - 1;

	//서버는 데이터 전송 소켓을 여기서 닫는다.
	close(socketDes);

	return;
}
Example #29
0
File: main.c Project: kevana/klvgen
//============================================================================
int main(int argc, char *argv[]) {
#ifndef WIN32
	signal(SIGINT, exitProgram);
	signal(SIGTERM, exitProgram);
	signal(SIGHUP, exitProgram);
	signal(SIGKILL, exitProgram);
#endif

	timestamp = updateTimestamp();
	
	// Set Default values
	sendRate = 1.0;
	strcpy(missionId, "Mission 01");
	strcpy(platform, "Demo");
	latitude = (uint32_t)htonl(mapLatitude("44.64423"));
	longitude = (uint32_t)htonl(mapLongitude("-93.24013"));
	altitude = (uint16_t)htons(mapAltitude("333"));
	strcpy(address, "127.0.0.1");
	servPort = 9000;
	DEBUG = 0;
	
	printf("\nUDP Generator, Version 1.0.1\nKevan Ahlquist\nAll Rights Reserved\n\n");
	
	// read user options
	int option_index = 0;
	char optc;
	static struct option long_options[] =
		{
		 {"address", 		required_argument, 0, 'a'},
		 {"port", 	 		required_argument, 0, 'p'},
		 {"rate",  	 		required_argument, 0, 'r'},
		 {"mission-id", required_argument, 0, 'm'},
		 {"platform",   required_argument, 0, 'n'},
		 {"latitude",   required_argument, 0, 't'},
		 {"longitude",  required_argument, 0, 'g'},
		 {"altitude",   required_argument, 0, 'e'},
		 {"help", no_argument,       0, 'h'},
		 {"version", no_argument,       0, 'v'},
		 {0, 0, 0, 0}
		};
	while (( optc = getopt_long(argc, argv, "a:p:r:m:n:t:g:e:hv", long_options, &option_index)) != -1) {
		switch(optc) {
			case 'a':
				strncpy(address, optarg, 16);
				address[15] = '\0'; // Prevent buffer overrun
				printf("Address received: %s\n", address);
				break;
			case 'p':
				servPort = atol(optarg);
				printf("Port received: %d\n", servPort);
				break;
			case 'r':
				sendRate = atof(optarg);
				printf("Rate received: %f\n", sendRate);
				if (sendRate > 1000000) {
					printf("Values greater than 1,000,000 packets per second are not supported\n");
					exit(0);
				}
				break;
			case 'm':
				strncpy(missionId, optarg, 12);
				missionId[12] = '\0'; // Prevent buffer overrun
				if (strlen(optarg) > 12) printf("WARNING: Mission ID truncated to 12 characters\n");
				printf("Mission ID received: %s\n", missionId);
				break;
			case 'n':
				strncpy(platform, optarg, 12);
				platform[12] = '\0'; // Prevent buffer overrun
				if (strlen(optarg) > 12) printf("WARNING: Platform truncated to 12 characters\n");
				printf("Platform received: %s\n", platform);
				break;
			case 't':
				latitude = (uint32_t)htonl(mapLatitude(optarg));
				printf("Latitude received: %s\n", optarg);
				if (atof(optarg) < -90.0 || atof(optarg) > 90.0) {
					printf("ERROR: Latitude out of range (-90,90)\n");
					exit(0);
				}
				break;
			case 'g':
				longitude = (uint32_t)htonl(mapLongitude(optarg));
				printf("Longitude received: %s\n", optarg);
				if (atof(optarg) < -180.0 || atof(optarg) > 180.0) {
					printf("ERROR: Longitude out of range (-180,180)\n");
					exit(0);
				}
				break;
			case 'e':
				altitude = (uint16_t)htons(mapAltitude(optarg));
				printf("Altitude received: %s\n", optarg);
				if (atof(optarg) < -900 || atof(optarg) > 19000) {
					printf("ERROR: Altitude out of range(-900,19000)\n");
					exit(0);
				}
				break;
			case 'h':
				help();
				exit(0);
				break;
			case 'v':
				exit(0);
				break;
			default:
				printf("Usage: klvgen -a <address>:<port> -r <rate> -m<mission-id> -p <platform> -t <lat> -g <long> -e <elev>\n");
				printf("For help use option -h or --help\n");
				exit(0);
		}
	}
	
	if (udpInit() == -1) exit(-1);
	
	// TESTING ================================================================
	int i;
	if (DEBUG) {
		printf("Testing mapping functions===============\n");
		printf("map 0 from 0-10 to 0-100: %d\n", mapValue(0,0,10,0,100));
		printf("map 10 from 0-10 to 0-100: %d\n", mapValue(10,0,10,0,100));
		printf("map 5 from 0-10 to 0-100: %d\n", mapValue(5,0,10,0,100));
	}
	if (DEBUG) {
		printf("uasLdsKey:\n");
		for (i = 0; i < 16; ++i) {
			printf("%X", uasLdsKey[i]);
		}
		printf("\n");
#ifdef WIN32
		printf("Timestamp (truncated): %u\n", (unsigned int)timestamp);
#else
		printf("Timestamp: %llu\n", timestamp);
#endif
	}
	if (DEBUG) {
		printf("Testing makePacket, packetBuffer:\n");
		printf(" K  L  Value...\n");
		makePacket(packetBuffer);
		for (i = 0; i < 80; ++i) {
			printf("%2X ", packetBuffer[i]);
			if ((i == 15) || (i == 25) || (i == 39) || (i == 53) || (i == 59) || (i == 65) || (i == 69) || (i == 72)) {
				printf("\n");
			}
		}
		printf("\n");
		udpSendPacket((const char *)packetBuffer);
	}
	if (DEBUG) {
		printf("Testing htonll function:\n num: 0x 01 02 03 04 05 06 07 08\n");
		uint64_t number = 0x0102030405060708ULL;
		uint64_t num2 = htonll(number);
		printf("number: ");
		printf("%2X ", (char)(number & 0xFF));
		printf("%2X ", (char)((number & 0xFF00) >> 8));
		printf("%2X ", (char)((number & 0xFF0000) >> 16));
		printf("%2X ", (char)((number & 0xFF000000) >> 24));
		printf("%2X ", (char)((number & 0xFF00000000ULL) >> 32));
		printf("%2X ", (char)((number & 0xFF0000000000ULL) >> 40));
		printf("%2X ", (char)((number & 0xFF000000000000ULL) >> 48));
		printf("%2X ", (char)((number & 0xFF00000000000000ULL) >> 56));
		printf("\n");
		printf("num2: ");
		printf("%2X ", (char)(num2 & 0xFF));
		printf("%2X ", (char)((num2 & 0xFF00) >> 8));
		printf("%2X ", (char)((num2 & 0xFF0000) >> 16));
		printf("%2X ", (char)((num2 & 0xFF000000) >> 24));
		printf("%2X ", (char)((num2 & 0xFF00000000ULL) >> 32));
		printf("%2X ", (char)((num2 & 0xFF0000000000ULL) >> 40));
		printf("%2X ", (char)((num2 & 0xFF000000000000ULL) >> 48));
		printf("%2X ", (char)((num2 & 0xFF00000000000000ULL) >> 56));
		printf("\n");
	}
	// END TESTING==========================================================
	
	while (1) {
		timestamp = htonll(updateTimestamp());
		makePacket(packetBuffer);
		udpSendPacket((const char *)packetBuffer);
		if (DEBUG) {
			printf("\n K  L  Value...\n");
			for (i = 0; i < 80; ++i) {
				printf("%2X ", packetBuffer[i]);
				if ((i == 16) || (i == 26) || (i == 40) || (i == 54) || 
						(i == 60) || (i == 66) || (i == 70) || (i == 73)) {
					printf("\n");
				}
			}
		}
#ifdef WIN32
		Sleep((1 / sendRate) * 1000);
#else
		usleep((1 / sendRate) * 1000); // usleep is untested, may not compile
#endif
	}
}
Example #30
0
	Packet parseSentence(const std::string &sentence) {
		auto elems = tokenizeSentence(sentence);
		auto p = makePacket(elems);
		return p;
	}