Доброго времени суток.
Есть следущая проблема — функции класса Socket, Send/Shutdown/Close работают как мне кажется, не так как должны.
Они всегда возвращаются мгновенно, хотя по идее должны блокировать (для Close при LingerState с таймаутом). Close к тому же не закрывает соединение.
Код следующий (подключение к ФТП серверу. Макс. скорость на сервере ограничена в 1KB/s):
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect("127.0.0.1", 21);
s.Receive(reply);
s.Send(user);
s.Receive(reply);
s.Send(pass);
s.Receive(reply);
int bytesSent = s.Send(data); // data - маcсив размером в пол-мегабайта
s.Shutdown(SocketShutdown.Both);
s.Close();
Этот код выполняется мгновенно, bytesSent == пол-мегабайта, Shutdown и Close никак не влияют. После выполнения кода фтп сервер продолжает получать данные из data.
Пробывал тоже самое с классом TcpClient, всё точно так же.
Вопрос: это нормальное поведение, и если нет, то что это может быть ?
Спасибо.
Меня беспокоит не сколько send, сколько shutdown и close. В МСДН их поведение сильно отличается от того что я вижу у себя.
С сокетами работал в win32, таких странностей не примомню. FtpWebRequest не подходит по ряду причин.
Такой ещё вопрос, как тогда можно приостановить выполнение текущего треда, пока все данные из буфера не будут отосланы ?