예제 #1
0
char * MsgQueue::getView(void)
{
  if (message_count == 0) {
    memset(view, CHAR_SPACE, SCREEN_COLS);
    queue_processing = false;
  } else {
    message_size = strlen(messages[0]);

    strncpy(view, &(messages[0][message_pos]), display_width);
    view[display_width] = '\0';

    message_pos += display_width;
    if (message_pos >= message_size) { dropMessage(); }
  }

  displayed_at = millis();

  return view;
}
예제 #2
0
파일: rsocket.c 프로젝트: VrajPandya/BRP
static int drop_recvfrom(int sockfd, void *buf, size_t len, int flags,
		struct sockaddr *src_addr, socklen_t *addrlen) {
	//r_recvfrom can drop packets now

	/*start set temp variables for receiving packet*/
	char* curBuf = (char*) malloc(sizeof(char) * len);
	struct sockaddr curSrc_addr;
	/*end set temp variables for receiving packet*/

	/*Receive packet*/
	int retVal = recvfrom(sockfd, curBuf, len, flags, &curSrc_addr, addrlen);
	int prob = dropMessage(DROP_PROB);
	if (!prob) {
		memcpy(buf, curBuf, retVal);
		memcpy(src_addr, &curSrc_addr, sizeof(struct sockaddr));
		free(curBuf);
		return retVal;
	}

	free(curBuf);
	return (retVal < 0) ? retVal : 0;
}
void* RThread(void *arg)
{
	int iSocketId = (int )arg;
	struct sockaddr_in src_address;
	struct msg_struct tmp_struct;
	int sock_len = sizeof(struct sockaddr_in);
	int iCount = 0, iIndex = 0,iIndex1=0;

	while(!globalstop)
	{
		if(recvfrom(iSocketId, &tmp_struct, sizeof(tmp_struct), 0, (struct sockaddr *)&src_address, &sock_len) == -1)
		{
			continue;
			//printf("Receive failed \n");
		}
#if DEBUG
		printf("RThread : tmp_struct.data.chBuffer = %s\n", tmp_struct.data.chBuffer);
		printf("RThread : tmp_struct.iMsgSeqNo = %d\n", tmp_struct.iMsgSeqNo);
#endif
#if TEST
		if(dropMessage(DROP_VALUE))
			continue;
#endif
		if(tmp_struct.data.Type == 0)
		{
			pthread_mutex_lock(&sync_mutex);
			memcpy(&recv_msg[iRecMsgCount], &tmp_struct, sizeof(tmp_struct));
#if DEBUG
			printf("RThread DATA Section: recv_msg.data.chBuffer = %s\n", recv_msg->data.chBuffer);
#endif
			src_address.sin_addr.s_addr = inet_addr(inet_ntoa(src_address.sin_addr));
			src_address.sin_port = src_address.sin_port;
#if DEBUG
			printf("%s:%d\n",inet_ntoa(src_address.sin_addr),ntohs(src_address.sin_port));
#endif
			tmp_struct.data.Type=1;  /* send ACK */
			sendto(iSocketId, &tmp_struct, sizeof(tmp_struct), 0, (struct sockaddr *)&src_address, sock_len);
			iRecMsgCount ++;
			pthread_mutex_unlock(&sync_mutex);
		}

		else if(tmp_struct.data.Type == 1)
		{
//#if DEBUG
			printf("RThread ACK Section: ACK received\n");
			printf("RThread ACK Section: tmp mes seq no = %d\n",tmp_struct.iMsgSeqNo);
//#endif
			tmp_struct.data.Type = 0; /* made memcpy easy*/
			pthread_mutex_lock(&sync_mutex);
			for(iIndex = 0; iIndex < iUnackMsgCount; iIndex++)
			{
				if(tmp_struct.iMsgSeqNo == unack_msg[iIndex].iMsgSeqNo)
				{
					for(iIndex1 = iIndex; iIndex1 < iUnackMsgCount; iIndex1 ++)
					{
						memcpy(&unack_msg[iIndex1], &unack_msg[iIndex1+1], sizeof(unack_msg[iIndex1]));
					}
					iUnackMsgCount--;
#if DEBUG
					printf("RThread ACK Section: iUnackMsgCount = %d\n",iUnackMsgCount);
#endif
					break;
				}
			}
			pthread_mutex_unlock(&sync_mutex);
		}
	}
	pthread_exit(NULL);
}