2010-06-18 3 views
2

Linux에서 non-blocking tcp 소켓에 send()를 사용하면 send buffer full 조건 이외의 다른 것에 대해서 EAGAIN을 리턴 할 것인가?EAGAIN은 버퍼가 가득 차 있지만 다른 것을 보내겠습니까?

기본적으로 내 응용 프로그램의 유일한 버퍼로 소켓 보내기 버퍼를 사용할지 또는 소켓 버퍼를 공급할 사용자 공간 버퍼가 필요한지 결정해야합니다.

답변

2

사용자 공간 버퍼에 대한 결정에 어떤 영향을 주는지는 알 수 없습니다. EAGAIN을 얻는 구체적인 이유와 상관없이 앱이 수행하는 작업에 따라 버퍼가 필요하거나 필요하지 않습니다.

실제로 성능이 좋은지 아닌지 계산하기 위해 SO_SNDBUF 옵션을 사용하여 tcp 버퍼 크기를 setsockopt으로 변경하는 방법에 대해서도 생각해 볼 수 있습니다.

0

Linux에서 비 차단 TCP 소켓에서 send()를 사용하면 송신 버퍼가 가득 찬 것 이외의 다른 이유로 EAGAIN이 반환됩니까?

송신 버퍼가 가득 찬 경우에만 send() 블록으로 조건이되어야하는 비 차단 소켓에서.

그렇지 않으면 내 경험에 따라 동작에 의존하지 말 것을 제안합니다. EAGAIN은 커널에서 사소한 오류가있을 때 때때로 반환되지만 아직 소켓은 정상입니다. 커널이 메모리가 부족한 것 같아서 EAGAIN이 돌아 왔을 때 HP-UX에 대한 경험이있었습니다. 오류가 복구 가능하기 때문에 EAGAIN은 오류 코드로 간주됩니다.

1

수신 확인되지 않은 패킷 수가 정체 윈도우에 도달하면 EAGAIN/EWOULDBLOCK을 반환 할 수 있습니다 (TCP 소켓 용).

소켓 w.r.t.의 상태를 확인하려면 다음과 같이하십시오. 혼잡 창, 다음이 시도 : tcpi_unacked == tcpi_snd_cwnd 다음 보내는 경우() 비 블로킹 소켓 EAGAIN/EWOULDBLOCK을 반환합니다

#include <netinet/tcp.h> 
static void print_tcp_cwnd(int socket) 
{ 
    struct tcp_info tcp_info; 
    uint tcp_info_length = sizeof(tcp_info); 
    if (getsockopt(socket, SOL_TCP, TCP_INFO, (void *)&tcp_info, &tcp_info_length) == 0) 
    { 
     printf("tcpi_snd_cwnd: %u, tcpi_unacked: %u\n", 
      tcp_info.tcpi_snd_cwnd, 
      tcp_info.tcpi_unacked 
      ); 
    } 
} 

.

+0

참조 : http://linuxgazette.net/136/pfeiffer.html – Bjarni

관련 문제