С++ Sockets
Суть простая. Сервер получает по 4 байта. То бишь при отправки "how are you?" получает 3 сообщения сразу, а не одно
Код:
#include <iostream> |
Ответ: С++ Sockets
Проверь чему равно sizeof(buffer).
|
Ответ: С++ Sockets
Цитата:
Ошибка была в Код:
char * buffer = new char[512]; Код:
сhar buffer[512]; |
Ответ: С++ Sockets
Можно сделать переменную
PHP код:
Ещё - в функции Work есть строка PHP код:
|
Ответ: С++ Sockets
Цитата:
Еще вопрос есть по обработке сообщений. То бишь нужно научить сервер разбирать сообщения по типам, почти как игровой. Сообщения типа "Я передвинулся", "Я нажал какую то кнопку" и тд Думал парсить каждое сообщение, но по скорости не знаю как выйдет. Быть может есть способ легче? |
Ответ: С++ Sockets
Зависит от того, какой тип протокола хочешь - текстовый или бинарный.
Текстовый легко парсить, бинарный не пробовал, наверное тоже легко. Про скорость - хз, зависит от количества команд в единицу времени. Если команд не сильно много, то среди прочих временных затрат будет не заметно. |
Ответ: С++ Sockets
Код не читал @ сразу отвечал.
Кол-во принятых и прочитанных байт при асинхронном сокете tcp (и, надо полагать, udp - не работал с ним) никто не гарантирует. Надо постоянно проверять. Ещё раз повторю: и для отправленного тоже. То есть вы должны убедиться, что отправлен весь указанный буфер, а не его часть. Соответственно, часть буфера возможно придётся "отправлять" (передавать в функцию отправки) ещё раз. Последнее - довольно частый баг, т.к. может не проявлять себя сколь угодно долго (пока сеть не будет забита => часть инфы не будет фактически отправлена с первого раза => потеряется часть информации и принимающая система упадёт): http://habrahabr.ru/post/213063/ |
Ответ: С++ Sockets
Почему TCP не гарантирует доставку? Должен.
Я полагаю, при загруженной сети может дойти кусок, и когда сеть просрётся, то дойдёт оставшаяся часть. Поэтому парсить сразу каждый принятый кусок не нужно, нужно накапливать данные в буфере до тех пор, пока не встретим признак_окончания_команды. Для текстового формата этим признаком может служить \r\n . |
Ответ: С++ Sockets
Цитата:
Цитата:
Суть такова: ты хочешь отправить команду "12345". Но в момент отправки сеть едва скрипит, поэтому за малое время, выделенное на отправку, уходит только "123", и функция возвращает тебе число 3, как индикатор количества отправленных байт. Очень часто, это число никто не проверяет (ограничиваясь только проверкой на отсутствие сбоя), считая что асинхронный сокет будет сам как-то выкручиваться и отправлять оставшееся "45". НЕТ. При следующем вызове надо будет отправить* "45" ещё раз. И опять убедиться - что отправилось. Про контроль прочитанного мы знаем ещё по блитцу. В общем-то никто не гарантирует какими порциями информация будет уходить по сети. Как правило, происходит некая аккумуляция данных, чтобы не забивать сетку маленькими пакетами. Но при необходимости, это можно изменить. Но это отдельная большая тема. Я бы не советовал в общем случае привязываться к разделителю строк. Сепаратор надо выбирать исходя из передаваемого контента. Возможно, его получится сделать более коротким, или наоборот - проще сделать подлиннее (например, исходя из больших размеров "строки"). |
Часовой пояс GMT +4, время: 11:37. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot