원격 종단점을 범람시키지 않으려면 내 서버 앱이 전송하려는 패킷의 "송부 (to-send)"대기열을 구현해야합니다.TCP로 양호한 "송부"대기열 구현
Windows Winsock, I/O 완료 포트를 사용합니다.
내 코드가 "socket-> send (.....)"를 호출 할 때 내 맞춤 "send()"함수가 데이터가 이미 "유선"에 있는지 확인합니다. 그 소켓).
실제로 데이터가 유선에있는 경우 나중에 전송할 데이터를 대기열에 넣습니다.
데이터가 연결되어 있지 않으면 WSASend()를 호출하여 실제로 데이터를 보냅니다.
지금까지 모든 것이 좋습니다.
이제는 보낼 데이터의 크기가 예측할 수 없으므로 작은 패킷의 메모리를 낭비하지 않기 위해 작은 덩어리 (예 : 64 바이트)로 나누고이 작은 덩어리를 보냅니다. .
내가 보낸 패킷에 대해 "write-done"완료 상태가 IOCP에 의해 주어지면 나는 다음 패킷을 큐에 보냅니다.
그게 문제입니다. 속도가 너무 느립니다. 사실 저는 실제로 로컬 연결 (127.0.0.1) 속도가 200kb/s입니다.
따라서 WSAnd()를 seveal 청크 (WSABUF 객체 배열)와 호출해야한다는 것을 알았습니다. 그러면 성능이 훨씬 향상되지만 한 번에 얼마나 많이 보내겠습니까?
바이트의 권장 크기는 있습니까? 그 대답은 내 요구에 맞을 것이라고 확신하지만 아직 시작해야 할 "일반적인"요점이 있음을 확신합니다.
더 좋은 방법이 있습니까?
Len에게 많은 감사를드립니다. 이제이 물건을 구현 한 후에, 나는 정말로 당신의 말을 이해할 수 있습니다. 문제가 해결되었습니다. 그것은 생각보다 간단했습니다. 지금은 버퍼 관리, 소켓에 게시, 그리고 필요에 따라 제한하는 것이 전부입니다. – Poni