rts에서 패킷을 못받거나 인식못하는경우
글쓴이: yurina / 작성시간: 월, 2004/07/05 - 2:14오후
rts를 써서 채팅 서버를 돌리고 있는데요..
얘가 잘돌아가다가 가끔..정말 가끔 패킷을 못받아요..
아무리 보내두 인식을 못하는건지 못받는건지
프로세스는 죽지 않았는데 패킷을 받지 못합니다.
프로세스를 죽였다 살려야만이 잘 돌아가구요..
왜 그런건지 감을 잡게 해주세요~~~
아래 소스는 소스중 RTS부분입니다~~~함 뭐가 잘못됐는지
봐주세요
int main(int argc, char *argv[]) { int sockfd=0, resockfd=0, tempfd=0; int port=0, rtn=0, clilen=0, len=0; int n=0, serv=0, rnum=0, disflag=0; char buff[1000], flag[2]; struct siginfo si; sigset_t set; pthread_t p_thread; struct pollfd pfd; struct sockaddr_in clientaddr; struct MESSAGE message; struct ROOM_NUM room_num; if(argc != 2) { printf("usage : main_process [port]\n"); exit(1); } _opendebug("damo_chat"); port = atoi(argv[1]); /*--------------------------------------*/ /* 방번호 초기값 */ /*--------------------------------------*/ memset(&room_num, 0x00, SZ_ROOM_NUM); room_num.flag = '0'; room_num.room_num = 1; room_number.push_back(room_num); /*---------------------------------------------------------------*/ /* Signal Handler */ /*---------------------------------------------------------------*/ init_signal_handler(); signal(SIGCHLD, SIG_IGN); //child process가 죽으면 다시 살린다. /*---------------------------------------------------------------*/ /* Real Time Signal Setting */ /*---------------------------------------------------------------*/ sigemptyset(&set); sigaddset(&set, SIGRTMIN); sigprocmask(SIG_BLOCK, &set, NULL); /*---------------------------------------------------------------*/ /* Socket Create */ /*---------------------------------------------------------------*/ sockfd = get_listener_fd(port); setup_sigio(sockfd); while(1) { clilen = sizeof(clientaddr); _debug(_fl, " SIGNAL WAIT\n"); rtn = sigwaitinfo(&set, &si); /*------------------------------------------------------*/ /* receive rts */ /*------------------------------------------------------*/ if(rtn == SIGRTMIN) { resockfd = si.si_fd; if(resockfd == sockfd) { tempfd = get_connect_fd(sockfd); pfd.events = POLLIN | POLLPRI; pfd.revents = 0; pfd.fd = tempfd; if(poll(&pfd, 1, 1000) > 0) { _debug(_fl, "poll function \n"); if( pfd.revents & POLLIN ) { _debug(_fl, "깜딱~!\n"); while(1) { memset(&message, 0x00, SZ_MESSAGE); if(read(tempfd, &message, SZ_MESSAGE) <= 0) break; message.user_fd = tempfd; /*----------------------------------------------*/ /* Create Thread */ /*----------------------------------------------*/ pthread_mutex_lock(&mutex_lock); rtn = pthread_create(&p_thread, NULL, send_message, (void *)&message); if(rtn < 0) { _debug(_fl, "thread create error resockfd[%d]\n", resockfd); break; } pthread_detach(p_thread); pthread_cond_wait(&thread_cond, &mutex_lock); pthread_mutex_unlock(&mutex_lock); } } } else continue; } else { memset(&buff, 0x00, sizeof(buff)); memset(&message, 0x00, SZ_MESSAGE); if(read(resockfd, &buff, sizeof(buff)) <= 0) { memcpy(&message, buff, SZ_MESSAGE); /*----------------------------------------------*/ /* FD_INFO Struct find */ /*----------------------------------------------*/ list<struct FD_INFO>::iterator e_info; e_info = fd_info.begin(); while(e_info != fd_info.end()) { if(e_info->user_fd == resockfd) { memcpy(message.option, LOGOUT, 2); memcpy(message.user_id, e_info->user_id, sizeof(e_info->user_id)); message.categorize1 = e_info->cate1; message.categorize2 = e_info->cate2; message.room_num = e_info->room_num; disflag = 1; break; } e_info++; } } if(disflag == 1) disflag = 0; else memcpy(&message, buff, SZ_MESSAGE); message.user_fd = resockfd; rtn = pthread_create(&p_thread, NULL, send_message, (void *)&message); if(rtn < 0) { _debug(_fl, "thread create error resockfd[%d]\n", resockfd); continue; } pthread_detach(p_thread); pthread_cond_wait(&thread_cond, &mutex_lock); pthread_mutex_unlock(&mutex_lock); } } //end if() } //end while() _closedebug(); return 1; }
Forums:
댓글 달기