Socket 프로그래밍 질문입니다.

lovejin0309의 이미지

다음은 소스입니다.

int UCAMP_HS_Event_listen_ENGINE()
{
 
    struct  timeval Time_Value;
    struct  sockaddr_in server_addr;
    struct  hostent     *he;
    fd_set  readfds;
    int     error;
    int     MSG_LEN;
    int     i;
    int     count = 0;
    char    Header[16];
    char    message[1024];
 
 
    if(SockFD > 0) close(SockFD);
 
    SockFD = socket(AF_INET, SOCK_STREAM, 0);
    if(SockFD != -1) printf("소켓 ok\n");
 
    he = gethostbyname("192.168.1.110");
 
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(1801);
    server_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(server_addr.sin_zero), 8);
 
    error = connect(SockFD, (struct sockaddr *) &server_addr, sizeof(struct sockaddr));
    if(error != -1) printf("연결 ok\n");
 
 
 
    while(1){
    printf("Wait\n");
 
    Time_Value.tv_sec   = 10;
    Time_Value.tv_usec  = 0;
 
    FD_ZERO(&readfds);
    FD_SET(SockFD, &readfds);
 
    select(SockFD+4, &readfds, NULL, NULL, &Time_Value);
 
        if(FD_ISSET(SockFD, &readfds)){
            memset(message, '\0', sizeof(message));
            error = recv(SockFD, message, 8, 0);
 
            printf("헤더는 %s 입니다. \n", message);
 
            Header[0] = message[1];
            Header[1] = message[2];
            Header[2] = message[3];
            Header[3] = message[4];
            Header[4] = message[5];
            Header[5] = message[6];
            Header[6] = message[7];
            Header[7] = '\0';
 
            MSG_LEN = atoi(Header); 
 
            if(MSG_LEN > 0){
                printf("MSG_LEN = %d\n", MSG_LEN);
                error = recv(SockFD, message, MSG_LEN, 0);
                count++;        
                printf("본문은 %s \n 받은 횟수는 %d 입니다. \n", message,count);
                continue;
            }else{
                printf("연결 확인 메시지 입니다. \n");
                continue;
            }
        }
    }
}

위와 같은 소스를 컴파일해서 실행시키면
192.168.1.110 서버와 연결이 됩니다.

이후 서버에서 메시지를 한 번 보내면 수신한 메시지를 출력한 후 다시 대기 상태로 들어가야 하는데, 메시지를 한 번 수신해서 출력한 후 대기를 하지 않고 "wait" 문자열만 계속 찍습니다.

어떻게 해결해야 할까요?

Anonymou의 이미지

저 코드에 따르면 10초마다 wait 를 찍는게 맞아요.

timeout이 발생하면 select는 0을 리턴합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.