2017-04-25 1 views
2

C 소켓의 recvmsg()에 대기열이있는 경우 대기열에 얼마나 많은 항목이 백 로그되어 있는지 확인할 수 있습니까?C에서 소켓의 경우 recvmsg()에 대기열이 있습니까?

내 문제는 recvmsg()에서 무언가를받은 후 코드의 속도가 recvmsg()로 전송되는 데이터의 속도보다 느린 경우가 있는데, 이는 논리적으로 큐를 생성할까요? 대기열이 너무 커지면 어떻게됩니까? 예를 들어

이 내 RECV 경우() 코드 :
while (recvmsg(SocketA,...) > 0) 
{ 
    ... 
    ...something that takes 1.5 seconds to execute/complete... 
    ... 
} 

다음과 같은 기능이 다른 곳에서 호출되는 경우 1 초 : 나는 recvmsg에 대한 참조 페이지를 확인
// gets called every 1 second 
int send_to_sock() 
{ 
    ... 
    send(SocketA, ...); 
    ... 
} 

()하지만 그들 중 누구도 대기열에 대해 언급하지는 않지만 대기열이있는 것처럼 보입니다. 점진적으로 증가하는 지연을 관찰하고 있기 때문입니다. 그러나 큐가 너무 길면 코드가 작동을 멈추기 때문에 큐의 길이를 확인하는 방법이 있는지 알고 싶습니다.

+0

왜 'recv'에 대한 함수 정의가 있습니까? 일반적으로'recv'는 OS에 의해 정의됩니다 ... –

+0

소켓에 버퍼가 있습니다. 그게 당신이 말하는거야, 아마도 관심이 있습니다 : http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux –

+0

우리는 데이터입니다 당신과 피어 사이의 공간과 시간에 퍼져 나갑니다. 서버, 클라이언트 및 중간 라우터에 대기 중입니다. 해저 섬유를 따라 그리고 지상국과 위성 사이의 자유 공간에 있습니다. 거기에 데이터가 있지만, 당신은 그것이 어디 있는지 얼마나 많이 알지 못합니다. – ThingyWotsit

답변

2

큐가 아니며, 소켓뿐만 아니라 대부분의 I/O 장치와 관련된 버퍼입니다. 예를 들어, stdin에서 scanf와 같은 것을 읽으면 enter 키를 누를 때 데이터가 프로그램으로 이동합니다. 그 동안 모든 키 입력이 어디에 저장되어 있다고 생각합니까?

이러한 버퍼의 세부 사항은 구현에 따라 결정되지만 일반적으로 소켓에서 발생하는 문제는 버퍼가 가득 차면 새 패킷이 삭제된다는 것입니다. 버퍼의 상태를 쿼리하는 방법에 대한 자세한 내용은 How to find the socket buffer size of linuxHow can I tell if a socket buffer is full?입니다.

2

예. 소켓 수신 버퍼가 있습니다. 최대 크기는 SO_RCVBUF 옵션을 사용하여 getsockopt()setsockopt()을 통해 가져오고 설정할 수 있습니다. 가득 차면 TCP의 경우 보낸 사람에게 보내는 것을 중지하라는 메시지가 표시됩니다. UDP의 경우 들어오는 데이터는 더 이상 버려집니다.

관련 문제