1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Сетевое программирование

Тема в разделе "Софт", создана пользователем RubiN, 24.06.03.

  1. RubiN

    RubiN Активный участник

    6.629
    425
    Кто заморачивался с написанием собственных сетевых приложений типа TELNET? Хочу написать прогу для управления роутером чтобы автоматизировать некоторые процедуры.
    Основная проблема состоит в следующем:

    Memo1->Lines->Add(Socket->ReceiveText()); - работает

    ClientSocket->Socket->SendText("текст"); - почему-то не работает

    По идее и клиент и сервер должны использовать один и тот же способ передачи из одного и того же класса, в данном случае SendText. Возможно при приёме роутер не понимает класс AnsiString. Но при передаче всё понимает. Проблем нет если сервер программный, можно к любому протоколу прицептьбся.

    SendBuf тоже не работает.
     
  2. pegas

    pegas Участник

    311
    0
    в составе buildera есть примеры, смотри их Demos->Internet->Chat. По тому что написано, сказать что либо конкретное трудно. клиент и сервер используют разные классы для передачи, у сервера то сокет слушающий. роутер строки понимать обязан. Не напорись на принципиальные грабли-протокол TCP может сделать разбивать сообщения по пакетам по своему усмотрению, если отправляешь например 2 строки, то она может прийти как 2, 1 или 10. Сборка задача протокола верхнего уровня.

    Добавление от [date]1056452995[/date]:
    Еще есть такие Indy Components. Там есть клиент телнет.
     
  3. RubiN

    RubiN Активный участник

    6.629
    425
    в экземплесах всё слишком простое со стандартными действиями,все эти вещи были пройдены еще 2 года назад, включая написание аналога FTP сервера под бздю. (там каталог FastNet еще есть, примеры про все протоколы кроме telneta).

    Это UDP так делает, а TCP всё правильно собирает в какой бы последовательности ты их не послал (т.е. ты вообще этим не занимаешься, а просто делаешь SendText и всё). Там просто размер пакета ограничен (что-то около 2кб) и надо задержку делать между посылкой пакетов, хотябы 40-50 мс, чтобы данные просто напросто не потерялись.

    Я просто не пойму чё мне киска отвечает: соединение с ней происходит и она прсылает строки в виде

    User Access Verification
    Password:

    это всё читается функцией
    void __fastcall TForm1::ClientSocketRead(TObject *Sender, TCustomWinSocket *Socket)

    после этого я посылаю пароль по нажатию кнопки

    ClientSocket->Socket->SendText("текст пароля");

    после этого он(роутер) молчит и ждёт, молчит и ждёт и потом разрывает соединение (так положено),
    присылая мне строчки: % Password: timeout expired! опять же через ClientSocketRead. Не может же быть чтобы для обмена использовались разные способы передачи? Да и пароль никак не шифруется.

    за Indy Components спасибо, поищу.
     
  4. pegas

    pegas Участник

    311
    0
    Неверно. Если ты сделаешь 2 раза Sendtext, не факт что ты за 2 recievetext их примешь. про задержку вообще ерунда.
    Откуда уверенность, что пароль не шифруется? Попробуй добавить в конец текста пароля возврат каретки\перевод строки. Напиши сам сервер и тестируй все на нем.
     
  5. RubiN

    RubiN Активный участник

    6.629
    425
    не ерунда, если и клиент и сервер на одной машине работают - не нужна, если по сетке или даже через модем - ОБЯЗАТЕЛЬНА. На выяснение этого обстоятельства я целый день потратил, после того как принёс полностью работающую курсовую на защиту.
    Если между двумя SendText сделать эту самую задержку то всё примется.

    копмонент уже скачал, только вот еще апдейт тяжеленький надо выкачать.
     
  6. pegas

    pegas Участник

    311
    0
    Значит твое приложение однозначно построено неправильно. Впрочем ладно, переубеждать не буду, но книжку "Эффективное программирование TCP/IP" посмотри.
    как уже говорил, 0x10 и 0x13 символы отправлял после пароля?
     
  7. RubiN

    RubiN Активный участник

    6.629
    425
    pegas
    ну точно!!! старею блин, всё сделал а такую мелочь забыл...
    теперь все работает. Кстати, достаточно сделать так: ClientSocket->Socket->SendText("текст пароля\n");

    а компонент уже установил (Indy) там много всего.