сокеты. размер сообщения.
От: klmn  
Дата: 29.11.05 09:22
Оценка:
Добрый день!
Есть клиент-серверное приложение, которое обменивается данными через сокеты (socket( AF_UNIX, SOCK_STREAM, 0)).
Посылаются сообщения при помощи функций send(to) recv(from).

Вопрос:
При получение указывается размер получаемого сообщения. Т.е. если в сокете есть 2 сообщения размерами 100b и 50b, а при считывании читается 150b, то получается конкатенация 2-ух сообщений, что совсем мне не нужно.
Вопрос в том, как отделить сообщения друг от друга, что бы они могли быть разного размера???
Существуют ли стандартные пути?
Re: сокеты. размер сообщения.
От: Kemm  
Дата: 29.11.05 09:27
Оценка:
Здравствуйте, 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) маркер конца сообщения
Re: сокеты. размер сообщения.
От: Eugene Kilachkoff Россия  
Дата: 29.11.05 09:27
Оценка:
Здравствуйте, klmn, Вы писали:

K>Добрый день!

K>Есть клиент-серверное приложение, которое обменивается данными через сокеты (socket( AF_UNIX, SOCK_STREAM, 0)).
K>Посылаются сообщения при помощи функций send(to) recv(from).

K>Вопрос:

K>При получение указывается размер получаемого сообщения. Т.е. если в сокете есть 2 сообщения размерами 100b и 50b, а при считывании читается 150b, то получается конкатенация 2-ух сообщений, что совсем мне не нужно.
K>Вопрос в том, как отделить сообщения друг от друга, что бы они могли быть разного размера???
K>Существуют ли стандартные пути?
  1. Обмениваться датаграммами.
  2. Ввести в протокол маркеры начала сообщений.
Re[2]: сокеты. размер сообщения.
От: klmn  
Дата: 29.11.05 09:46
Оценка:
EK> Обмениваться датаграммами.

Вроде как, в датаграммах доставка не гарантирована...

EK> Ввести в протокол маркеры начала сообщений.


А можно поподробнее?
Re[3]: сокеты. размер сообщения.
От: DOOM Россия  
Дата: 29.11.05 10:29
Оценка:
Здравствуйте, klmn, Вы писали:

EK>> Обмениваться датаграммами.


K>Вроде как, в датаграммах доставка не гарантирована...


Ага в UNIX сокетах-то


EK>> Ввести в протокол маркеры начала сообщений.


K>А можно поподробнее?


Ну, например, говорим, что последовательность 0x12345678 является началом сообщения (соответственно надеемся на то, что в самом сообщении этого не встретится). ИМХО лучше размещать в начале длину сообщения...
Re[4]: сокеты. размер сообщения.
От: Kemm  
Дата: 29.11.05 10:35
Оценка:
Здравствуйте, DOOM, Вы писали:

EK>>> Ввести в протокол маркеры начала сообщений.

K>>А можно поподробнее?
DOO>Ну, например, говорим, что последовательность 0x12345678 является началом сообщения (соответственно надеемся на то, что в самом сообщении этого не встретится). ИМХО лучше размещать в начале длину сообщения...

За выделенное можно и канделябром... 8)) Если маркер встречается в самом сообщении — заэкранировать его. Например, a la telnet, т.е. повторить два раза.
Re[3]: сокеты. размер сообщения.
От: hziSot Беларусь  
Дата: 29.11.05 10:38
Оценка:
Здравствуйте, klmn, Вы писали:

EK>> Обмениваться датаграммами.


K>Вроде как, в датаграммах доставка не гарантирована...


EK>> Ввести в протокол маркеры начала сообщений.


K>А можно поподробнее?


typedef struct {
    char mark[3];
    unsigned int len;
} header_st;

header_st header;
char *buffer;

read(sock, &header, sizeof(header_st));

// проверка маркера, выдеение памяти под буфер

// Читаем твой пакет
read(sock, buffer, header.len);
Re[2]: сокеты. размер сообщения.
От: klmn  
Дата: 30.11.05 07:25
Оценка:
EK> Обмениваться датаграммами.

А в датаграммах можно-ли как-нибудь определить отправителя сообщения?
Re[3]: сокеты. размер сообщения.
От: butcher Россия http://bu7cher.blogspot.com
Дата: 30.11.05 07:57
Оценка:
Здравствуйте, klmn, Вы писали:

EK>> Обмениваться датаграммами.


K>Вроде как, в датаграммах доставка не гарантирована...


Re: буффер сокета
Автор: MaximE
Дата: 25.10.05

Нет ничего невозможного..
Re[3]: сокеты. размер сообщения.
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.11.05 10:41
Оценка:
klmn wrote:
>
> EK> Обмениваться датаграммами.
>
> А в датаграммах можно-ли как-нибудь определить отправителя сообщения?

Да, man recvfrom
Posted via RSDN NNTP Server 2.0
Re[3]: сокеты. размер сообщения.
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.11.05 10:41
Оценка:
klmn wrote:
>
> EK> Обмениваться датаграммами.
>
> А в датаграммах можно-ли как-нибудь определить отправителя сообщения?

Да, man recvfrom
Posted via RSDN NNTP Server 2.0
Re[3]: сокеты. размер сообщения.
От: eju  
Дата: 30.11.05 11:48
Оценка:
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]
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.