TCP/IP: что делать, если в процессе чтения сервером пакета от клиента пропадает интернет?
Ситуация проста как 3 копейки.
Код на клиенте:
...
var bytes = new byte[30000000];
...
server.Write(bytes, 0, bytes.Length); //шлём пакет серверу
...
Код на сервере:
...
var client = listener.AcceptTcpClient();
...
var bytes = new byte[30000000];
client.Read(bytes, 0, bytes.Length); //читаем пакет от клиента
...
И вот, если на клиенте элементарно пропадет сеть, причем уже тогда, когда клиент начнет писать пакет, а сервер - читать, то ни на клиенте, ни на сервере не будет выброшено никакое исключение, а ведь массив bytes у сервера будет недозаполнен, с какого-то места в массиве будут нули, то есть пакет поврежден, а сервер спокойно продолжит работу, попытается обработать этот массив (распарсить JSON), и упадет.
И, что еще хуже: то же самое (наверно) случится и с клиентом, если наоборот клиент начнет читать ответ от сервера, и в этот момент пропадет связь.
Как решить проблему?
Надо с передающей стороны (клиента) как-то узнать, что сервер получил что-то не то, и отправить повторно в надежде что на этот раз передача пройдет успешно, и так по кругу в бесконечном цикле с задержкой.
Но, наверно, нельзя просто так узнать передались ли данные серверу. Не приходит в голову ничего лучше, чем сделать так, чтобы сервер обрабатывал такие поврежденные пакеты и возвращал клиенту ответ с успехом или ошибкой, но тогда на каждый пакет придется делать ответ... И еще: а вдруг поврежденным окажется пакет с ответом?)) Значит, клиент должен на этот ответ тоже давать ответ... А если и это ответ поврежден будет, а если следующий, а если следующий, замкнутый круг из ответов...
А еще у меня же keep-alive'ы есть, кастомной реализации... Что при этом произойдет с ними, и нельзя ли их как-то использовать для этой проверки...
Короче, запутался. Это бородатое поделие TCP - реальный вынос мозга. Врагу не пожелаешь.
P.S.
Конечно, на самом деле размеры пакетов у меня не такие огромные, я нарочно взял почти что предельно большой размер, для удобства имитации разрыва связи (выдергиваю сетевую кабель из компа).
Но будь пакет хоть 2 байта, все равно - вероятность есть, и ее надо учесть.