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:


댓글 달기