2014-12-28 2 views
0

내 네트워크를 단 하나의 수신기로 제한하려고합니다. , 난 그냥 언급하고 당연히C++에서 소켓의 송신 버퍼가 비어있을 때까지 얼마나 기다려야합니까?

if (sndBufferSize - NbBytesInBuffer >= HEADER){ 
    memcpy (sendBuffer + NbBytesInBuffer, &buf_header, HEADER); 
    NbBytesInBuffer +=HEADER; 
} 

: 그것은 전적으로 가득 찰 때까지 나는이 버퍼를 채우고 유지, 그리고

getsockopt(sendsockfd, SOL_SOCKET, SO_SNDBUF, &sndBufferSize, &sbsLen); 

:

첫째, 나는에 의해 SO_SNDBUF의 크기를 감지 내 코드의 관련 부분.

마지막으로 버퍼가 꽉 차면 소켓에 씁니다.

if (sndBufferSize - NbBytesInBuffer < HEADER) 
sentSize = write(sendsockfd,sendBuffer,NbBytesInBuffer); 
... 

내 문제는 아직 언급되지 않았습니다. 위의 모든 내용은 데이터를 다시 보내고 싶을 때까지 완벽하게 작동합니다.

이제 가능한 최대 속도로 보내려고하기 때문에 나는 가능한 한 적게 기다려야합니다. (즉, 송신 버퍼가 비어있는 즉시 다시 보내야 함).

가장 좋은 방법으로 송신 버퍼를 다시 비우기 위해 write()에 필요한 시간을 감지하는 방법은 무엇입니까?

P. 임의의 시간을 기다리라고 말하지 마십시오 (예 : usleep(10000);)

+1

'선택'을 고려 했습니까? – Jarod42

+0

수신기가 하나뿐입니다. 나는 내 질문을 편집했다. – Moi

+2

'select'는 하나의'fd'와 함께 작동하고, 특정'fd'를 읽거나 쓸 수 있는지, 그리고 * timeout *이 있는지를 알 수 있습니다. – Jarod42

답변

3

최대 속도로 보내려면 필요에 따라 write이 기본적으로 차단되어야합니다. write이 반환 되 자마자 귀하의 sendBuffer으로 완료되었으며 다음 블록의 데이터를 넣고 write으로 다시 전화하십시오.

소켓을 nonblocking으로 설정하는 경우에만 select을 사용해야합니다.이 경우 대기중인 조건은 소켓이 쓰기 가능하다는 것입니다.

+0

당신 말이 맞아요. 이것이 내가 생각하고있는 것입니다. 그냥 내가 그것을 확인하자. – Moi

+0

나는 무슨 일이 일어나고 있는지 모른다. 그러나, 나는 전에 이것을 시도했고 나는 약간의 기억 문제에 직면했다. :) 어쨌든 고마워. – Moi

+1

거대한 버퍼 또는 유사한 이상한 점이있는 매우 낙관적 인 OS를 사용하는 경우, 거대한 송신 버퍼를 만드는 메모리 부족 현상이 발생할 수 있습니다. 한 가지 시도는 블록 크기가 다른 고정 된 양의 데이터를 전송하는 데 걸리는 시간을 측정하는 것입니다 (예 : 4KB, 8KB, 16KB, 1024KB 블록에서 10MB 전송). 더 큰 버퍼가 도움이되지 않는 지점이 있습니다. –