Я отправляю сообщения на удаленный сервер с помощью простой блокировки TCP-сокета, и проблема заключается в том, что для каждого сообщения требуется совсем другое время для его отправки.Скорость отправки сокета TCP C++
И вот что я получаю (некоторые примеры):
Bytes Sent: 217, Time: 34.3336 usec
Bytes Sent: 217, Time: 9.9107 usec
Bytes Sent: 226, Time: 20.1754 usec
Bytes Sent: 226, Time: 38.2271 usec
Bytes Sent: 217, Time: 33.6257 usec
Bytes Sent: 217, Time: 12.7424 usec
Bytes Sent: 217, Time: 21.5912 usec
Bytes Sent: 217, Time: 31.1480 usec
Bytes Sent: 218, Time: 28.3164 usec
Bytes Sent: 218, Time: 13.0963 usec
Bytes Sent: 218, Time: 82.8254 usec
Bytes Sent: 218, Time: 13.0963 usec
Bytes Sent: 227, Time: 30.7941 usec
Bytes Sent: 218, Time: 27.9624 usec
Bytes Sent: 216, Time: 2.1237 usec
Bytes Sent: 218, Time: 12.3884 usec
Bytes Sent: 227, Time: 31.1480 usec
Bytes Sent: 227, Time: 88.4887 usec
Bytes Sent: 218, Time: 93.0901 usec
Bytes Sent: 218, Time: 7.7870 usec
Bytes Sent: 218, Time: 28.3164 usec
Bytes Sent: 227, Time: 89.5505 usec
Bytes Sent: 218, Time: 84.2412 usec
Bytes Sent: 218, Time: 13.8042 usec
Bytes Sent: 227, Time: 99.4612 usec
Bytes Sent: 218, Time: 86.0110 usec
Bytes Sent: 218, Time: 12.3884 usec
Bytes Sent: 218, Time: 87.7807 usec
Bytes Sent: 216, Time: 3.5395 usec
Bytes Sent: 218, Time: 4.6014 usec
Bytes Sent: 218, Time: 36.1034 usec
Bytes Sent: 218, Time: 14.8661 usec
Bytes Sent: 218, Time: 24.0689 usec
Bytes Sent: 218, Time: 18.0517 usec
Bytes Sent: 227, Time: 24.4229 usec
Кто-нибудь знает, почему это может произойти? Почему для одного сообщения требуется 3 usec для отправки и для других 80 usec?
И есть ли способ исправить это?
Примечание: основная цель, которую я хочу архивировать, - отправить каждое сообщение как можно быстрее. Мне не нужны какие-либо параллельные сокеты, по крайней мере, пока они не работают быстрее.
Некоторые дополнительные подробности относительно того, что я делаю:
C++, Visual Studio 2013
Как открыть:
...
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
...
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
...
Как отправить и рассчитать время:
...
LARGE_INTEGER cT;
QueryPerformanceCounter(&cT);
long long dT = cT.QuadPart;
iBytesSent = send(ConnectSocket, msgFinal, msgFinalLen, 0);
QueryPerformanceCounter(&cT);
dT = cT.QuadPart - dT;
...
Также я слушаю этот сокет из другого потока, я не знаю, может ли это повлиять на sendin г или нет:
iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFLEN, 0);
TCP - это протокол потока. В нем нет понятия «сообщения», вы отправляете поток байтов. Это означает, что получатель может получать данные в кусках разных размеров, чем то, что вы их отправляете, например. TCP только гарантирует, что другая сторона получает одни и те же байты в том же порядке, ничего не теряется (или происходит отключение, если resends fail). – hyde
Я не думаю, что вы измеряете время отправки, вы измеряете время вызова 'send'. – Dariusz
также устанавливает TCP_NODELAY, если вы хотите, чтобы ваше сообщение отправлялось так быстро, как вы можете. https://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx –