[질문]소켓통신에서 응답을 못받거든요.
글쓴이: river0kr / 작성시간: 화, 2003/07/22 - 6:35오후
소켓통신중인데,
한쪽은 데이타를 send했는데 다른한쪽은 받는 이벤트가 발생이 안된것 같애요.
함수A는 클라이언트에서 데이타를 받아 서버에넘겨주고,
서버에서 다시받아 클라이언트에 응답해주는 건데요.
서버에서 다시 받아올때
아래부분의(===>요기로 가보세요)으로 안들어오는데 왜안들어오는지
궁금해요. 답변 기다릴께요.
int funcA(int clifd)
{
....
for (;;) {
pfd[0].fd = clifd;
pfd[1].fd = Servfd;
pfd[0].events = pfd[1].events =
( POLLIN | /*POLLRDNORM | POLLRDBAND |*/ POLLPRI );
if ( ( n= poll(pfd, NUMSOCKS, TIMEOUT*1000000 )) <= 0)
{
if ( errno = EINTR ) continue;
if ( n== 0 )
{
close(Servfd);
if ( RequestFlag==REQUEST_YES)
SendRejectMSG(clifd,NICE_TIMEOUT);
return -1;
}
printf("select error=%d\n",errno);
}
if (
( pfd[1].revents & POLLERR ) ||
( pfd[1].revents & POLLHUP ) ||
/*( pfd[1].revents & POLLPRI ) || river막음*/
( pfd[1].revents & POLLNVAL )
)
{
log_output("polling ret error=%d\n",n);
close(Servfd);
return -1;
};
/* if receive from menu ... */
if (
( pfd[0].revents & POLLIN ) ||
/*( pfd[0].revents & POLLRDBAND ) ||*/
( pfd[0].revents & POLLPRI ) /*||
( pfd[0].revents & POLLRDNORM )*/
)
{
memset ( snd_buffer , 0x00 , sizeof snd_buffer);
printf("[1]\n");
if (( bytesu = RecvMSG(clifd,snd_buffer)) <= 0 )
{
log_output("Recv Close\n");
close(Servfd);
return -1;
}
else if ( bytesu == 9999 )
{
log_output("InValid Length\n");
close(Servfd);
return -1;
}
else if ( IsValidData(snd_buffer) != 0 )
{
SendRejectMSG(clifd,INVALID_FMT);
log_output("InValid Format(%d)%s\n",bytesu,snd_buffer);
close(Servfd);
return -1;
}
printf("[2]\n");
time(&start);
log_output("Request=%s\n",snd_buffer);
if (( bytesu = SendMSG(Servfd,snd_buffer,bytesu)) < 0 )
{
close(Servfd);
SendRejectMSG(clifd,NICE_SEND_ERR);
/* Send Reject(Remote-Comm Error) Data */
log_output("Send Server Error(%d)=%d\n",Servfd,errno);
return -1;
}
RequestFlag=REQUEST_YES;
} /* of if (FD_ISSET .....*/
printf("[3]\n");
/* if receive from sockfd ... */
if ( ==============> 서버에서는 send했는데 이부분으로 안들어오네요.
( pfd[1].revents & POLLIN ) ||
/*( pfd[1].revents & POLLRDBAND ) ||*/
( pfd[1].revents & POLLPRI ) /*||
( pfd[1].revents & POLLRDNORM )*/
)
{
memset ( snd_buffer , 0x00 , sizeof(snd_buffer));
printf("[4]\n");
if (( bytesu = RecvMSG(Servfd , snd_buffer ) ) <= 0 )
{
printf("error from host\n");
SendRejectMSG(clifd,NICE_RECV_ERR);
close(Servfd);
return -1;
}
time(&finish );
log_output("Response[elapsed=%2.1f]=%s\n",difftime(finish,start),snd_buffer);
printf("[5]\n");
if (( bytesu = SendNormalMSG(clifd ,snd_buffer ,bytesu)) < 0 )
{ printf("[6]\n");
close(Servfd);
return -1;
}
RequestFlag=REQUEST_NO;
continue;
} /* of if (FD_ISSET **.....*/
} /* of for(; ; ) **/
return 0;
}Forums:


질문 올리려면 이런식으로 올리지 맙시다
대충 보아하니 서버에서 받을때 블록킹으로 처리해야 하는데
잘 안된것 같군요..
근데, 이 질문은 전혀 정리도 안되고, 코딩도 이상하고, 풀소스도 아니고...
작업(혹은 공부) 하다가 소스를 대충 복사해서 올려서 질문하면
답해주러 오신 분들이 과연 친절하게 대답을 해주시겠습니까?
댓글 달기