소켓 프로그래밍 UDP 관련 질문 입니다.

rlaehdtjd86의 이미지

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

}

bejoy4him의 이미지

recvfrom 앞에세 select로 timeout처리하도록 해보세요.

상대방이 응답하지 않으면 recvfrom에서는 계속 기다릴테니.
recvfrom 앞에서 select문으로 timer를 걸어둔채로 기다리도록 해보시길
그래서 timeout이 발생하면, 에러처리...

rlaehdtjd86의 이미지

감사합니다 덕분에 잘 해결 했습니다 ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.