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; }
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); }