Проблема с Сокетами в .NET
От: unit132  
Дата: 18.03.08 11:17
Оценка:
Доброго времени суток.

Есть следущая проблема — функции класса 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, всё точно так же.

Вопрос: это нормальное поведение, и если нет, то что это может быть ?

Спасибо.
Re: Проблема с Сокетами в .NET
От: Аноним  
Дата: 18.03.08 11:55
Оценка:
Здравствуйте, unit132, Вы писали:

U>Вопрос: это нормальное поведение, и если нет, то что это может быть ?


Вы с сокетами раньше работали?
Если нет, то посмотрите в MSDN класс FtpWebRequest.

По сабжу: нормально. Send не гарантирует немедленную отправку. Он гарантирует немедленную запись в буфер для отправки. Receive не гарантирует, что вы получите ответ целиком. Он всего лишь вычитает столько байт, сколько есть в буфере (либо сколько нужно, если сколько нужно <= сколько есть в буфере).
Re[2]: Проблема с Сокетами в .NET
От: unit132  
Дата: 18.03.08 12:11
Оценка:
Меня беспокоит не сколько send, сколько shutdown и close. В МСДН их поведение сильно отличается от того что я вижу у себя.
С сокетами работал в win32, таких странностей не примомню. FtpWebRequest не подходит по ряду причин.

Такой ещё вопрос, как тогда можно приостановить выполнение текущего треда, пока все данные из буфера не будут отосланы ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.