![]() |
|
Модераторы: feodorv |
![]()
|
|
| Chupik |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Собственно, этот вопрос был в одном сабже ветки "Для новичков", но мне посоветовали обратится сюда.
Итак, пишу что-то вроде небольшого бота для дистанционного управления компьютером. Вот его клиентская часть:
Вот серверная:
Проблема в том, что сервер никак не распознаёт команду:
т.е. когда я отправляю /still_alive он мне возращает не Hello, world! Test, а как обычно мою посланную команду(/still_alive). В чём загвоздка? Заранее огромное спасибо. P.S. Поиск по сайту уже использовал... Гугл тоже. Это сообщение отредактировал(а) Chupik - 5.4.2009, 21:49 |
||||||
|
|||||||
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
99>=2 я бы с этим спорить не стал, Это сообщение отредактировал(а) Irdis - 6.4.2009, 00:59 |
|||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
TCP - потоковый протокол, нет никаких гарантий, что за один вызов recv ты получишь ровно одно сообщение. Нужен внутренний накопительный буфер.
Добавлено через 10 минут и 17 секунд
Ты читаешь строку, например в 10 байт, а на сервер отсылаешь 100. Сервер получает лишний мусор. И еще, пройдись отладчиком по серверу, посмотри чему у тебя равен receive_string. Возможно туда этот мусор и попадает. Это сообщение отредактировал(а) vinick - 6.4.2009, 10:58 |
|||
|
||||
| Chupik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Irdis, vinick, большое спасибо, сейчас прогоню в отладчике.
|
|||
|
||||
| Chupik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Итак, результаты прогона на отладчике:
Поток: buf Значение: ¬.6 Поток: receive_string Значение: {} Поток: buf Значение: tfgf (как раз то, которое я ввёл в клиенте) Поток: receive_string Значение: {""}. Вот так вот, что-то со receive_string непонятное... Добавлено позже: Решил по другому немного попробовать:
тоже не срабатывает... Добавленно позже: А вот результаты последнего прогона: значение buf "still_alive" значение receive_string {"still_alive"} Это сообщение отредактировал(а) Chupik - 6.4.2009, 14:07 |
|||
|
||||
| Chupik |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Up...
Итак я понял, что кажись простым конвертированием из char * в string или int ничего не получится...
receive_string получается тоже массивом(слово test выглядит [1] = t; [2] = e; [3] = s и т.д...) и при сравнении:
или:
ноль эмоций... P.S. Сори за 3 пост подряд... Это сообщение отредактировал(а) Chupik - 8.4.2009, 20:02 |
||||||
|
|||||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
конечно, тыже сравниваешь значения указателей, а не сами данные. Используй memcmp или для строк strcmp функции.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Chupik |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Тоже самое.. Пишу /test - реагирует по прежнему... Уже использовал, на два поста выше:
тоже не работает |
||||
|
|||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Пример: buf == "/still_alive" k = strlen(buf)-1 == 11; Выполняется условие k>=2 и под else просто никогда не войдет. И не пихай размер в 100 байт во все функции. |
|||
|
||||
| Chupik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
Спасибо
т.е. размеры буферов уменьшил, убрал проверку на наличие символов, но... на команду /test не отзывается как надо... З.Ы. Простите, что задаю много глупых вопросов. |
|||
|
||||
| vinick |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
у тебя в клиенте fgets читает кроме строки "/test" еще и символ перевода строки и дописывает его в buf, который ты отправляешь на сервер. На сервере у тебя в buf на самом деле лежит "/test\r\n\0" или "/test\n\0", поэтому strcmp(buf,"/test") не работает как ожидалось. Я не говорил, что размеры буферов надо уменьшать, я имел ввиду что надо писать реальные размеры строк, а не 100 байт во всех функциях указывать. Теперь у тебя вобще бардак с памятью. Вместо
надо
и в других местах так же. |
||||
|
|||||
| Chupik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
vinick, спасибо, понял свои ошибки.
|
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
писание програм методом тыка никогда и ни у кого не получалось
|
|||
|
||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Не скажите... Метод самое то... Заработало хоть ? |
|||
|
||||
| Chupik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 5.4.2009 Репутация: нет Всего: нет |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |