На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Общение между сокетами , Возникла проблема
    Здрасьте, господа-специалисты.

    Делаю FTP-сервер. Для тестирования использую клиент с отоброжением полученных и отправленных сообщений. Ну так вот, проблема в передаче сообщений от сервера к клиенту.
    Когда клиент присоединяется к серверу, то сервер ему должен послать сообщение с кодом 220. Но суть не в этом. Посылку сообщений я сначала выполнял через TcpClient. Т.е. брал оттуда Stream, делал на его основе StreamWriter, а потом писал в него, но клиент всёравно ничего не получал, пока я не закрывал StreamReader методом Close(). Но при вызове Close() закрвается не только этот поток (StreamReader), но и тот, на основе которого он зделан (Stream). Это вызывает дисконнект в TcpClient'е. Таким образом можно было отправить сообщение только если после отправки прервать соединение :(

    Далее я решил использовать Socket. Т.е. теперь когда TcpListener обнаруживал подключающегося клиента, то выдавал не TcpClient'а, а Socket. Но отсылка сообщений с помощью метода Socket.Send() ничего не дало. Теперь клиент от моего сервера вобще ничего не получает, даже при разрыве соединения :'( Хотя метод отробатывает без ошибок.

    Для выяыления ошибки я зделал маленькую прогу, которая вместо FTP-клиента бы сидела на 21 порту и ловила сообщения. Ну так вот она всё прекрассно получает :wacko:

    Так что я даже незнаю в чём косяк!! :wall:

    Буду очень рад любой помощи :yes:

    Добавлено
    Да, кстати, если кто-нибудь более простойспособ создания FTP-сервера, чем писать его всего ручками, буду очень благодарен. А то в инете тока про клиентов пишут
      Для того чтобы не закрывался нижележащий поток я использую спецкласс потока:
      ExpandedWrap disabled
        class UnclosableStream<T>:T where T:Stream{
             public override void Close() {}
             public void RealClose(){base.Close();}
        }
        Ну как же так, так же не должно быть!!! Как же зделать тогда например чат??! Что, специально создавать такой класс??!! Это же неправильно! Я в АУТЕ!!!
          Проблема решена. Дело было в том, что по протоколу FTP, каждое сообщение от клиента к серверу и обратно должно заканчиваться символами перевода коретки на начало строки и перехода на новую строку - "\r\n" Вот этот момент-то я и упустил. Поэтому FTP-клиент на получал сообщений от сервера, потомоу что ждал этих символов, а моя самодельная прога, отлавливающая сообщения на 21 порту - поймала.

          Так что вот так, спасибо за внимание :)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0191 ]   [ 16 queries used ]   [ Generated: 24.04.24, 03:06 GMT ]