Добрый день!
Есть клиент-серверное приложение, которое обменивается данными через сокеты (socket( AF_UNIX, SOCK_STREAM, 0)).
Посылаются сообщения при помощи функций send(to) recv(from).
Вопрос:
При получение указывается размер получаемого сообщения. Т.е. если в сокете есть 2 сообщения размерами 100b и 50b, а при считывании читается 150b, то получается конкатенация 2-ух сообщений, что совсем мне не нужно.
Вопрос в том, как отделить сообщения друг от друга, что бы они могли быть разного размера???
Существуют ли стандартные пути?
Здравствуйте, klmn, Вы писали:
K>Добрый день! K>Есть клиент-серверное приложение, которое обменивается данными через сокеты (socket( AF_UNIX, SOCK_STREAM, 0)). K>Посылаются сообщения при помощи функций send(to) recv(from).
K>Вопрос: K>При получение указывается размер получаемого сообщения. Т.е. если в сокете есть 2 сообщения размерами 100b и 50b, а при считывании читается 150b, то получается конкатенация 2-ух сообщений, что совсем мне не нужно.
Указывается не размер получаемого сообщения, а размер буфера для приема. Это разные вещи.
K>Вопрос в том, как отделить сообщения друг от друга, что бы они могли быть разного размера??? K>Существуют ли стандартные пути?
Да. Свой протокол поверх tcp. Варианты:
1) заголовок с длиной сообщения
2) маркер конца сообщения
Здравствуйте, klmn, Вы писали:
K>Добрый день! K>Есть клиент-серверное приложение, которое обменивается данными через сокеты (socket( AF_UNIX, SOCK_STREAM, 0)). K>Посылаются сообщения при помощи функций send(to) recv(from).
K>Вопрос: K>При получение указывается размер получаемого сообщения. Т.е. если в сокете есть 2 сообщения размерами 100b и 50b, а при считывании читается 150b, то получается конкатенация 2-ух сообщений, что совсем мне не нужно. K>Вопрос в том, как отделить сообщения друг от друга, что бы они могли быть разного размера??? K>Существуют ли стандартные пути? Обмениваться датаграммами.
Ввести в протокол маркеры начала сообщений.
Здравствуйте, klmn, Вы писали:
EK>> Обмениваться датаграммами.
K>Вроде как, в датаграммах доставка не гарантирована...
Ага в UNIX сокетах-то
EK>> Ввести в протокол маркеры начала сообщений.
K>А можно поподробнее?
Ну, например, говорим, что последовательность 0x12345678 является началом сообщения (соответственно надеемся на то, что в самом сообщении этого не встретится). ИМХО лучше размещать в начале длину сообщения...
Здравствуйте, DOOM, Вы писали:
EK>>> Ввести в протокол маркеры начала сообщений. K>>А можно поподробнее? DOO>Ну, например, говорим, что последовательность 0x12345678 является началом сообщения (соответственно надеемся на то, что в самом сообщении этого не встретится). ИМХО лучше размещать в начале длину сообщения...
За выделенное можно и канделябром... 8)) Если маркер встречается в самом сообщении — заэкранировать его. Например, a la telnet, т.е. повторить два раза.
Здравствуйте, klmn, Вы писали:
EK>> Обмениваться датаграммами.
K>Вроде как, в датаграммах доставка не гарантирована...
EK>> Ввести в протокол маркеры начала сообщений.
K>А можно поподробнее?
klmn wrote: > А в датаграммах можно-ли как-нибудь определить отправителя сообщения?
[code]
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from,
socklen_t *fromlen);
Если параметр from не равен NULL, а сокет не является ориентированным на
соединения, то адрес отправителя в сообщении не заполняется. Аргумент
fromlen передается по ссылке, в начале инициализируется размером буфера,
связанного с from, а при возврате из функции содержит действительный размер
адреса.
[code]