LINUX.ORG.RU

Сокеты обрезают сообщения


0

0

Кто-нибудь сталкивался с этой проблемой? Сервер и клиент используют сокеты стандартным способом (как в том же Робачевском). Выделил массив char buffer[SIZE] нужной длинны. Если сообщения короткие - все нормально. Доходит до 1920 символов - половина обрезана. В чем дело?

★★

Re: Сокеты обрезают сообщения

А подробнее? Какой протокол, какой код возврата из функций чтения/записи, используется неблокирующий режим или select...

tailgunner ★★★★★ ()

Re: Сокеты обрезают сообщения

void init_socket(char *host, char* port)
{
  int portno;
  struct hostent *server;

  portno = atoi(port);
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0)
    error("ERROR opening socket");
  server = gethostbyname(host);
  if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);
  }
  bzero((char *) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  bcopy((char *)server->h_addr,
	(char *)&serv_addr.sin_addr.s_addr,
	server->h_length);
  serv_addr.sin_port = htons(portno);
}

xTERM ★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

Смотри сниффером траффик, и проверь все таки, что возвращает write.
Т.к. read блочиццо, значит что до него инфа не доходит. Чудес не бывает, а то что ты передаешь имеет уже значительный размер.

vasily_pupkin ★★★★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

> он подвисает на вызове read

Хм... тогда попробуй втупую - вычитывать по 1 байту, пока не наберешь сообщение или оно не зависнет в ожидании. Такое впечатление, что ты встретил проблему пакетизации - read вычитывает первый пакет и возвращает тебе немедленно. Хотя размер 1100 подозрителен...

tailgunner ★★★★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

> Притом если все работает на localhost - то ошибок нет.

На lo размер MTU гораздо больше. Замени его на тот же, что и в eth*.

tailgunner ★★★★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

read() и write() все же по хорошему надо упаковать в while().
Вообще странно конечно. Сниффером посмотрел?

vasily_pupkin ★★★★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

> Файлы gore.c и commands.c

Я правильно понимаю - там делается read из сокета без проверки, сколько байтов вычиталось? o_O ну просто классика.

tailgunner ★★★★★ ()

Re: Сокеты обрезают сообщения

Мы исправили read(socket,buffer,buffer_size) на recv(socket,buffer,1840, MSG_WAITALL); - помогло.

xTERM ★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

Непонятная проблема, лучше бы сниффером посмотрел что происходит, из-за непонимания сути проблемы аналогичное может вылезти в другом месте даже если сейчас все вроде бы работает.

write/read как уже сказали надо завертывать в while.

Reset ★★★★★ ()
Ответ на: Re: Сокеты обрезают сообщения от xTERM

Re: Сокеты обрезают сообщения

SOCK_STREAM - это потоковый сокет, в котором нет 
понятия сообщения. Грубо говоря вам никто не гарантирует что на 1 
вызов write должен приходится 1 вызов read. За подробностями man socket, man Стивенс.


>recv(socket,buffer,1840, MSG_WAITALL)

тогда уж во всех местах меняйте. И это будет работать только пока у 
вас только синхронный обмен сообщениями и вы точно уверены что из сокета
должно прийти ровно заказанное количество байт.


ЗЫЖ а это что у вас в коде за хохма?

static void *update(void *vptr_args)
  {
 // ......................
  277 		if (write(sock2,"U",strlen("UPDATE")) < 0) << !!!!!!!!
  278 			error("ERROR writing to socket");

Vinick ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.