| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Обработка комманд, полученных через сокеты |
| Автор: Chupik 5.4.2009, 21:46 | ||||||
| Собственно, этот вопрос был в одном сабже ветки "Для новичков", но мне посоветовали обратится сюда. Итак, пишу что-то вроде небольшого бота для дистанционного управления компьютером. Вот его клиентская часть:
Вот серверная:
Проблема в том, что сервер никак не распознаёт команду:
т.е. когда я отправляю /still_alive он мне возращает не Hello, world! Test, а как обычно мою посланную команду(/still_alive). В чём загвоздка? Заранее огромное спасибо. P.S. Поиск по сайту уже использовал... Гугл тоже. |
| Автор: Irdis 6.4.2009, 00:57 | ||
99>=2 я бы с этим спорить не стал, |
| Автор: vinick 6.4.2009, 10:56 | ||
| TCP - потоковый протокол, нет никаких гарантий, что за один вызов recv ты получишь ровно одно сообщение. Нужен внутренний накопительный буфер. Добавлено через 10 минут и 17 секунд
Ты читаешь строку, например в 10 байт, а на сервер отсылаешь 100. Сервер получает лишний мусор. И еще, пройдись отладчиком по серверу, посмотри чему у тебя равен receive_string. Возможно туда этот мусор и попадает. |
| Автор: Chupik 6.4.2009, 12:30 |
| Irdis, vinick, большое спасибо, сейчас прогоню в отладчике. |
| Автор: Chupik 6.4.2009, 12:55 | ||
| Итак, результаты прогона на отладчике: Поток: buf Значение: ¬.6 Поток: receive_string Значение: {} Поток: buf Значение: tfgf (как раз то, которое я ввёл в клиенте) Поток: receive_string Значение: {""}. Вот так вот, что-то со receive_string непонятное... Добавлено позже: Решил по другому немного попробовать:
тоже не срабатывает... Добавленно позже: А вот результаты последнего прогона: значение buf "still_alive" значение receive_string {"still_alive"} |
| Автор: Chupik 8.4.2009, 19:56 | ||||||
| Up... Итак я понял, что кажись простым конвертированием из char * в string или int ничего не получится...
receive_string получается тоже массивом(слово test выглядит [1] = t; [2] = e; [3] = s и т.д...) и при сравнении:
или:
ноль эмоций... P.S. Сори за 3 пост подряд... |
| Автор: jonie 8.4.2009, 20:18 |
| конечно, тыже сравниваешь значения указателей, а не сами данные. Используй memcmp или для строк strcmp функции. |
| Автор: Chupik 8.4.2009, 20:32 | ||||
Тоже самое.. Пишу /test - реагирует по прежнему... Уже использовал, на два поста выше:
тоже не работает |
| Автор: Chupik 8.4.2009, 21:32 | ||
Спасибо
т.е. размеры буферов уменьшил, убрал проверку на наличие символов, но... на команду /test не отзывается как надо... З.Ы. Простите, что задаю много глупых вопросов. |
| Автор: vinick 8.4.2009, 22:17 | ||||
у тебя в клиенте fgets читает кроме строки "/test" еще и символ перевода строки и дописывает его в buf, который ты отправляешь на сервер. На сервере у тебя в buf на самом деле лежит "/test\r\n\0" или "/test\n\0", поэтому strcmp(buf,"/test") не работает как ожидалось. Я не говорил, что размеры буферов надо уменьшать, я имел ввиду что надо писать реальные размеры строк, а не 100 байт во всех функциях указывать. Теперь у тебя вобще бардак с памятью. Вместо
надо
и в других местах так же. |
| Автор: Chupik 19.4.2009, 21:00 |
| vinick, спасибо, понял свои ошибки. |
| Автор: J0ker 22.4.2009, 00:32 |
| писание програм методом тыка никогда и ни у кого не получалось |
| Автор: GrayCardinal 23.4.2009, 09:37 | ||
Не скажите... Метод самое то... Заработало хоть ? |
| Автор: Chupik 23.4.2009, 21:50 |
Пока искал решение проблемы, в гугле нашёл компонент icq для делфи и сделал бота на нём... Думаю, потом доделаю этот проект(который на с++). |