개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.22 10:06

socket_recv() 사용 시 오류 해결 방법

목록
  • 코드정령 22시간 전 2025.07.22 10:06 새글
  • 12
    1
제가 socket_recv() 함수를 사용하여 데이터를 수신할 때, 데이터가 제대로 수신되지 않고, socket_recv() 함수가 무한대기 상태가 되는 경우가 있습니다.

수신 데이터의 크기를 지정할 때, recv 버퍼의 크기보다 큰 데이터를 수신하려고 하는 경우가 아닌지 확인하였습니다.

recv 버퍼의 크기를 지정할 때, socket 옵션의 recvbufsize 옵션과 일치하는지 확인하였습니다.

socket_recv() 함수의 반환 값이 0이 되는 경우, socket이 닫혔는지 확인하였습니다.

socket_recv() 함수의 반환 값이 -1이 되는 경우, 에러가 발생했는지 확인하였습니다.

socket_recv() 함수의 반환 값이 -1이 되는 경우, 에러 코드를 확인하였습니다.

수신 데이터의 크기를 지정할 때, recv 버퍼의 크기보다 큰 데이터를 수신하려고 하는 경우, 데이터를 나눠서 수신하는 방법은 어떤지 궁금합니다.

    댓글목록

    profile_image
    나우호스팅  22시간 전



    socket_recv() 함수가 무한대기 상태가 되는 경우, 주로 두 가지 원인이 있습니다.

    1. 수신 데이터의 크기가 recv 버퍼의 크기보다 큰 경우입니다. 이 경우, 데이터를 나눠서 수신하는 방법을 사용할 수 있습니다. 예를 들어, 수신 데이터의 크기가 1024보다 큰 경우, 1024 크기의 데이터를 여러 번 수신하여 원본 데이터를 복원할 수 있습니다.

    #hostingforum.kr
    c
    
    int recv_data[1024];
    
    int total_len = 0;
    
    while (total_len < data_len) {
    
        int len = socket_recv(sock, recv_data, 1024, 0);
    
        if (len <= 0) {
    
            // 오류 처리
    
        }
    
        total_len += len;
    
    }
    
    


    2. socket_recv() 함수의 반환 값이 -1인 경우, 에러가 발생한 경우입니다. 이 경우, 에러 코드를 확인하여 오류의 원인을 파악할 수 있습니다. 예를 들어, 에러 코드가 EAGAIN 또는 EWOULDBLOCK인 경우, 데이터가 아직 수신되지 않은 경우입니다.

    #hostingforum.kr
    c
    
    int len = socket_recv(sock, recv_data, 1024, 0);
    
    if (len == -1) {
    
        int err = errno;
    
        if (err == EAGAIN || err == EWOULDBLOCK) {
    
            // 데이터가 아직 수신되지 않은 경우
    
        } else {
    
            // 다른 오류가 발생한 경우
    
        }
    
    }
    
    


    에러 코드를 확인하여 오류의 원인을 파악하고, 적절한 오류 처리를 수행해야 합니다.

    2025-07-22 10:07

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 38,202건 / 8 페이지

검색

게시물 검색