Xpoint
   [напомнить пароль]

im stuck with recv

Метки: [без меток]
[удл]
2005-10-24 00:35:18 [обр] core707[досье]
Подсжкатие плз что то не поайму почему recv у меня дает удвоеную итерацию в цикле
то есть приходит пакет и обычно для всех байт хватает одной итерации цикла а тут всегда + еще 1
туплю
help
спустя 9 часов [обр] Алексей Севрюков(0/1280)[досье]

core707[досье] Какой язык? Примеры кода минимальные приведите.

P.S. Форум явно не подходящий выбрали. Причем тут толстые клинты и сервера.

спустя 1 час 22 минуты [обр] core707[досье]
сообщение промодерировано

А где надлежащий форум тогда?
Вроде как про сетевеые коммуникации..нет ?

c++
winsock2

 while((bytes_=recv(sock,tobuff,sizeof(tobuff)-1,0)) && bytes_!=SOCKET_ERROR && tobuff != 0)
 {
    doing something...
 }
спустя 3 часа [обр] vvvua[досье]
сообщение промодерировано

Как по мне, оно не должно работать вовсе.
Под винду не программлю, но думаю recv везде похож, поэтому конструкцию sizeof(tobuff) нельзя так юзать.
Там tobuff это char *, и по стандарту sizeof вернет длину указателя, а не строки.
Нужно что-то типа:

 char *tobuff;
 #define BUFSIZE 1000
 tobuff=new char [BUFSIZE];

// обнуление tubuff (memset(tubuff,0,BUFSIZE) или по друному как-то)

 while((bytes_=recv(sock,tobuff,BUFSIZE,0)) && bytes_!=SOCKET_ERROR && tobuff != 0)
 {
    doing something... с данными в количестве bytes_
//    обнуление tubuff (memset(tubuff,0,BUFSIZE) или по друному как-то), если будем дальше юзать

 }
 if(tobuff!=NULL) //если несколько раз вызвать без проверки  - вылетит с ошибкой сегментации
   delete tobuff;

P.S. на sock лучше навесить обработку таймаута - иначе дооооолго ждать можно.

спустя 56 минут [обр] core707[досье]
проблему решил, была в другом не reciv
2vvvua
Все рабоает, не знаю пожет это под unix следует так делать
на http://msdn.microsoft.com/libr......-us/winsock/winsock/recv_2.asp
вроде об этом нисказано
спустя 2 часа 47 минут [обр] Владимир Палант(13/4445)[досье]
vvvua[досье]
Если определить буффер как массив символов, а не как указатель, то sizeof будет возвращать правильное значение.
спустя 5 часов [обр] vvvua[досье]

Владимир Палант[досье]
Да, точно. Давно не использовал такого объявления и подзабыл.
core707[досье]
В примере не используется sizeof:

char recvbuf[32] = "";
bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 );

И я не советую. Изменится объявление и будет ошибка.
Проблема при отсылке была? strlen не то возвращал ? Или что-то другое? (Интересно просто)

Powered by POEM™ Engine Copyright © 2002-2005