소켓 프로그래밍 UDP 관련 질문 입니다.
UDP 로 TIME protocol 을 받아오는 프로그램을 하나 만들었습니다..
패킷을 잡아보면 TIME request, TIME response 잘 받아옵니다(TIME server 가 time protocol 을 지원하는 경우)
하지만 time protocol 을 지원하지 않는 서버 주소로 적용하면 request 만 하고 response 는 무응답 입니다..
블럭킹 모드라서 그런것 같은데.. 이를 감지할수 있는 방법이 없을까요??
예를 들어 response 가 일정시간동안 발생이 안되면 return -1; 로 설정한다던지..
소켓 프로그래밍을 처음 해봐서 해매고 있는 초보 개발자 입니다.
아신다면 꼭좀 조언 부탁 드립니다 ^^ㅋ
제가 만든 소스는 rdate 를 참고해서 만들었습니다.
static time_t GetTIMEprotocol(const char *hostname)
{
int ssock;
int clen;
struct sockaddr_in client_addr, server_addr;
struct hostent *ds_HostEntry;
char buf[256];
int result;
int i;
int Time_return;
ds_HostEntry=gethostbyname(hostname);
if(ds_HostEntry)
{
strcpy(buf,"");
memset((void*)(&server_addr),0,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port =htons(37);
memcpy((void *)(&server_addr.sin_addr), (void *)(ds_HostEntry->h_addr), sizeof(server_addr.sin_addr));
if((ssock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0){
perror("SOCKET ERROR : ");
exit(1);
}
result=sendto(ssock,(void*)buf,sizeof(buf),0,(struct sockaddr*)&server_addr, sizeof(server_addr));
result=recvfrom(ssock,&Time_return,sizeof(Time_return),0,(struct sockaddr*)&client_addr, &clen);
if(Time_return==NULL||Time_return==0)
return -1;
Time_return=ntohl(Time_return)-2208988800lu;
printf("Receive message %u\n",Time_return);
}
}
close(ssock);
return((time_t)Time_return);
}
recvfrom 앞에 select로 timeout처리하도록 해보세요.
recvfrom 앞에세 select로 timeout처리하도록 해보세요.
상대방이 응답하지 않으면 recvfrom에서는 계속 기다릴테니.
recvfrom 앞에서 select문으로 timer를 걸어둔채로 기다리도록 해보시길
그래서 timeout이 발생하면, 에러처리...
감사합니다^^
감사합니다 덕분에 잘 해결 했습니다 ^^
댓글 달기