У меня есть клиент, который подключается к серверу, начинает отправлять двоичные данные, а когда отправка завершена, он закрывает соединение. Если соединение закрыто, сервер знает, что клиент отправил файл.
У меня есть простой класс TCP для обработки соединения. Затем у меня есть еще одна функция, которая отправляет данные на сервер:
TcpC tcp = new TcpC();
void send_data_to_server(){
tcp.connect();
while(read_data){
tcp.sendData();
}
Thread.Sleep(500);
tcp.disconnect();
}
Сервер использует асинхронные сокеты и имеет функцию WaitForData(), которая получает исключение, когда клиент отключается. Проблема в том, что если я удалю Thread.Sleep(), WaitForData все еще перехватывает исключение, но onDataReceive все еще не получил все данные, потому что я проверяю размер буфера в исключении, и он намного меньше, чем если бы я использовал Sleep().
Серверу придется обрабатывать множество подобных операций, и я не могу позволить себе использовать «хак» Sleep(), чтобы он работал. Иногда это все равно не работает, и я должен установить интервал сна на пару секунд, чтобы быть уверенным. Ни одна из других асинхронных функций на стороне сервера не вызывает исключение, кроме WaitForData().
Как я могу немедленно закрыть соединение и при этом получить все данные? Хотя tcp.disconnect все равно вызывается после отправки всех данных, поэтому я не понимаю, почему у меня возникла эта проблема. Спасибо!