2017-12-29 11 views
-1

read() 함수를 사용하여 소켓에서 데이터를 읽습니다. 그러나 때로는 차단되고 프로그램이 중단됩니다.select 함수를 사용하여 블록 읽기 함수를 해제하는 방법

따라서 select() 함수를 사용하여 시간 제한을 설정했습니다. 하지만 여전히 문제가 있습니다.

그래서 두 기능을 어떻게 사용해야합니까?

내 코드는 다음과 같습니다 :

do{ 
    rv = select(n, &readfds, NULL, NULL, &tv); 

    #ifdef WIFI_DEBUG_PRINT 
    ESP_LOGI(Display, "\nselect returns= %d\n",rv); 
    #endif 

    if (rv > 0) 
    { 
     if (FD_ISSET(s, &readfds)) 
     { 
      bzero(recv_buf, sizeof(recv_buf)); 

      read(s, recv_buf, sizeof(recv_buf)-1); 

      strcat(response_buffer,recv_buf); 

      printf("\nrecv_buf= %s\n",recv_buf); 
     } 
    } 

    _delay_ms_kt(100); //https://esp32.com/viewtopic.php?f=2&t=809&p=10191&hilit=esp_task_wdt_feed#p10191 
         //see above link to understand reason to put delay here. 
         //https://github.com/espressif/arduino-esp32/issues/595 
         //same..... 
}while(rv>0); 
+0

내 프로그램이 제대로 작동하면 디버그 인쇄는 다음과 같습니다 : – kishan

+1

'select()'는 전달한 매개 변수를 수정합니다. 각 루프 반복에서'readfds'와'tv'를 재설정해야합니다. 또한,'recv_buf'를 사용하기 전에 오류에 대한'read()'의 반환 값을 검사하지 않습니다. –

답변

0

당신이) (일부 내부 프로그램 블록을 가지고가는 경우는, 다음, 지금은 내부 읽을 차단할 한 이유()가 없다. 그렇다면 setting your socket(s) to non-blocking mode에 의한 read() 차단 가능성을 피할 수 있습니다.

그뿐 아니라 select()의 사용법 (RemyLebeau의 주석에서 제안한대로)을 사용하면 원하는 동작을 얻을 수 있습니다.

관련 문제