LINUX.ORG.RU

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


0

0

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

★★

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

tailgunner ★★★★★
()

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 ★★
() автор топика
Ответ на: комментарий от xTERM

> Возвращает 1100 с чем то - т.е. меньше, чем нужно :(

Если это про функцию чтения - попробуй прочитать второй раз, что будет?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

select/poll не использую. Просто write(socket,cmdBuffer,cmdBuffer_size) и read(socket,buffer,buffer_size);

xTERM ★★
() автор топика
Ответ на: комментарий от xTERM

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

vasily_pupkin ★★★★★
()
Ответ на: комментарий от xTERM

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

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

tailgunner ★★★★★
()
Ответ на: комментарий от xTERM

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

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

tailgunner ★★★★★
()
Ответ на: комментарий от xTERM

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

vasily_pupkin ★★★★★
()
Ответ на: комментарий от xTERM

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

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

tailgunner ★★★★★
()
Ответ на: комментарий от vasily_pupkin

>начало или хвост

начало

xTERM ★★
() автор топика
Ответ на: комментарий от xTERM

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

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

Reset ★★★★★
()
Ответ на: комментарий от xTERM

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 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.