The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"как правильно работать с recv / send"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"как правильно работать с recv / send"
Сообщение от Игорь emailИскать по авторуВ закладки on 24-Мрт-03, 07:31  (MSK)
Здравствуйте,

В ожидании одного вопроса, решил сразу и второй вопрос для себя прояснить.

Пишу демона, который принимает соеденения на какой-то порт. И, ясное дело, принимает какие-то данные, и в зависимости от того что пришло какие-то данные отсылает.

Так вот не смог найти примеров как правильно работать с recv / send

допустим задача такая:
конекчусь телнетом, мне тут же какое-то приглашение (тут вроде всё просто, сразу же msg="welcome"; send(s, msg, sizeof(msg), 0);
тут понятно
далее должна прийти строка user username
столкнулся с нестыковкой
допустим если я делал recv(s, msg, 1024,0);
и коннектился юниксовым телнетом и писал "user usernmae <enter>" то printf("%s", msg) гласил: user username
а если коннекчусь виндовым телнетом, то получал много строк по одной букве
(совсем не понимаю что с этим делать)

Может пришлёте пример "рабочий" ?
Или направите на предмет "почитать" (только большая просьа, на русские документы, ну или немецкие, с английским проблемы :( )

Извините "ламера" за "многохотение". :)

Спасибо!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "как правильно работать с recv / send"
Сообщение от XMan emailИскать по авторуВ закладки on 24-Мрт-03, 15:00  (MSK)
> тут вроде всё просто, сразу же msg="welcome"; send(s, msg, sizeof(msg), 0);

Мне так кажется, или правильнее будет:

send(s, msg, strlen(msg), 0);

А еще лучше:

send(s, msg, strlen(msg)+1, 0);

Касательно telnet - у него же собственный протокол, на уровне которого клиент и сервер договариваются о формате данных. Судя по всему, win telnet автоматически переходит в символьный режим и отсылает что-то типа "<SYM>\r\n". Вот у тебя и получается перенос после каждой буквы. Теоретически, можешь просто убирать последние "\r\n".

Рабочий пример можешь посмотреть в исходниках самого telnet :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "как правильно работать с recv / send"
Сообщение от VV emailИскать по авторуВ закладки on 25-Мрт-03, 19:06  (MSK)
>recv и telnet
Имел те же грабли.
Судя по всему, ms-telnet делает send(..) после ввода каждого символа,
а человеческий отсылает всю строку+CRLF только после ENTER.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "как правильно работать с recv / send"
Сообщение от Игорь emailИскать по авторуВ закладки on 25-Мрт-03, 21:42  (MSK)
>>recv и telnet
>Имел те же грабли.
>Судя по всему, ms-telnet делает send(..) после ввода каждого символа,
>а человеческий отсылает всю строку+CRLF только после ENTER.


Я эту проблему победил сл. образом.

// копим то что приходит в readbuf, как только 10 13 - отсылаем строку на обработчик.
void dumaem (char str[], int d) {
int i;
for (i=0; i < strlen(str); i++) {

if (str[i] != 13 && str[i] != 10)
strcat(readbuf, str);
else {
obrabotchik(d);
strcpy(readbuf,"");
}
}
}

// получаем один байт
res = read(descriptor, rbuf, 1);
dumaem(rbuf, d);
...

Сейчас работаетв таком виде, и с виндой, и с юниксом. От куда угодно.
Не знаю на счёт правильности...

Теперь мучаюсь и осваиваю строковые функции :))
Не знаю как парсить полученную строку.
Но это уже другая история.

Спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "как правильно работать с recv / send"
Сообщение от XMan emailИскать по авторуВ закладки on 26-Мрт-03, 00:45  (MSK)
"Человеческий" делает точно так же. Иначе как бы ты мог видеть что набираешь на удаленной машине ? :)
Просто он это делает только после того, как договорится с сервером, а win по-умолчанию.
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру