Здравствуйте, Nikolay_P_I, Вы писали:
N_P>А дает оно в основном то, что для перезапуска сервера не надо ждать 2 минуты, пока нужный порт освободится. N_P>Если мы про один и тот же Reuse говорим
Не о разном Я про Socket.Disconnect(true), после чего этот сокет можно заново использовать.
, кто использовал reuse сокетов в .net, что удалось получить в сравнении без него?
Я делал в нативной реализации, но отдельно степень влияния реюзинга не замерял. ИМХО, это довольно сложно корректно оценить. Но я замерял время создания экземпляра сокета с помощью функций socket и WsaSocket, и там счёт шёл на миллисекунды, если не на десятки, просто не помню конкретные цифры, да они и от железа наверняка зависят.
Здравствуйте, Jolly Roger, Вы писали:
JR>Я делал в нативной реализации, но отдельно степень влияния реюзинга не замерял. ИМХО, это довольно сложно корректно оценить. Но я замерял время создания экземпляра сокета с помощью функций socket и WsaSocket, и там счёт шёл на миллисекунды, если не на десятки, просто не помню конкретные цифры, да они и от железа наверняка зависят.
А DisconnectEx не замерял? Я щас в клиенте считаю время для 8К подключений:
Create/Bind sockets: 827ms (всегда одно и то же)
Disconnect(reuse) sockets: 686ms, 733ms, 796ms, 795 (плавает)
Что при таком раскладе можно выгадать?
int start1 = Environment.TickCount;
for (int x = 0; x < sockets.Length; x++)
{
sockets[x] = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
sockets[x].Bind(new IPEndPoint((server.AddressFamily == AddressFamily.InterNetwork) ? IPAddress.Any : IPAddress.IPv6Any, 0));
}
Console.WriteLine(@"Create/Bind sockets: {0} ms", Environment.TickCount - start1);
for (int x = 0; x < sockets.Length; x++)
sockets[x].Connect(server);
int start2 = Environment.TickCount;
for (int x = 0; x < sockets.Length; x++)
{
sockets[x].Disconnect(true);
}
Console.WriteLine(@"Disconnect(reuse) sockets: {0} ms", Environment.TickCount - start2);
Здравствуйте, vf, Вы писали:
vf>А DisconnectEx не замерял? Я щас в клиенте считаю время для 8К подключений: vf>Create/Bind sockets: 827ms (всегда одно и то же) vf>Disconnect(reuse) sockets: 686ms, 733ms, 796ms, 795 (плавает)
А CloseSocket сколько? DisconnectEx не замерял, ибо бессмычленно. Там Shutdown с обменом квитанциями и FIN'ами. Что мерять, TTL и скорость отклика клиентской машины?
vf>Что при таком раскладе можно выгадать?
827 — 795?
Мало? Ну у каждого свои критерии, не используйте тогда
Здравствуйте, Jolly Roger, Вы писали:
JR>PS Да, кстати, а bind-то зачем?
И то правда.. тогда совсем уныло получается
Create -----> Disconnect Create ---------> Close
219 ms 749 ms 265 ms 405 ms
266 ms 687 ms 218 ms 452 ms
358 ms 889 ms 234 ms 328 ms
453 ms 702 ms 234 ms 468 ms
JR>А CloseSocket сколько? DisconnectEx не замерял, ибо бессмычленно. Там Shutdown с обменом квитанциями и FIN'ами. Что мерять, TTL и скорость отклика клиентской машины?
Shutdown принудительно поставил и там и там.
Если там был незначительный выйгрышь, то здесь проигрышь даже чуть больше.
for (int i = 0; i < 20; i++)
{
MeasureConnectDisconnect(8129, server1, true);
Thread.Sleep(240 * 1000);
MeasureConnectDisconnect(8129, server1, false);
}
private static void MeasureConnectDisconnect(int count, IPEndPoint server, bool disconnectOrClose)
{
Socket[] sockets = new Socket[count];
int start1 = Environment.TickCount;
for (int x = 0; x < sockets.Length; x++)
sockets[x] = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine(@"Create sockets: {0} ms", Environment.TickCount - start1);
for (int x = 0; x < sockets.Length; x++)
sockets[x].Connect(server);
int start2 = Environment.TickCount;
for (int x = 0; x < sockets.Length; x++)
{
sockets[x].Shutdown(SocketShutdown.Both);
if (disconnectOrClose)
sockets[x].Disconnect(true);
else
sockets[x].Close();
}
Console.WriteLine((disconnectOrClose ? "Disconnect(reuse)" : "Close") + @" sockets: {0} ms",
Environment.TickCount - start2);
}