winsock - проблема с потерей данных
От: Андрей Шестимеров Россия http://informatics.ru
Дата: 05.09.06 21:00
Оценка:
Доброго времени суток!

Возникла такая проблема — есть сервер получающих данные:

        while (true) 
        {
            recvBuff.BufferClear();

            bytesRecv = recv( AcceptSocket, (char*)recvBuff, sizeof (recvBuff), 0 );            
                ....
            }


и клиент, который отправляет:



        while (!feof(stream))
        {
            readbuf = freadEvent(stream, seekPos);
            sendbuf.bufferClear();            
            strncpy(sendbuf.packetType, "data", 4);
            strncpy(sendbuf.packetValue, readbuf.c_str(), n);    
                    
                  bytesSent = send(acceptSocket, (char*)sendbuf, sizeof(sendbuf), 0);

            if (bytesSent == SOCKET_ERROR)
            {
                fseek (stream,undoSeekPos,SEEK_SET); 
                break;                        
            }
            else
                hasSent = true;
        }


Сокеты блокирующие, синзронные. По сокетам передаются куски файла, и вот некоторые куски или части их не получаются на сервере.
При этом если при других запусках теряются те же куски. Но если поставить задержку после send`а, то всё нормально доходит.

В чём может быть проблема?
Re: winsock - проблема с потерей данных
От: wwwdev  
Дата: 05.09.06 23:16
Оценка:
Здравствуйте, Андрей Шестимеров, Вы писали:

АШ>Доброго времени суток!


АШ>Возникла такая проблема — есть сервер получающих данные:


АШ>
АШ>        while (true) 
АШ>        {
АШ>            recvBuff.BufferClear();

АШ>            bytesRecv = recv( AcceptSocket, (char*)recvBuff, sizeof (recvBuff), 0 );            
АШ>                ....
АШ>            }
АШ>


АШ>и клиент, который отправляет:



АШ>

АШ>        while (!feof(stream))
АШ>        {
АШ>            readbuf = freadEvent(stream, seekPos);
АШ>            sendbuf.bufferClear();            
АШ>            strncpy(sendbuf.packetType, "data", 4);
АШ>            strncpy(sendbuf.packetValue, readbuf.c_str(), n);    
                    
АШ>                  bytesSent = send(acceptSocket, (char*)sendbuf, sizeof(sendbuf), 0);

АШ>            if (bytesSent == SOCKET_ERROR)
АШ>            {
АШ>                fseek (stream,undoSeekPos,SEEK_SET); 
АШ>                break;                        
АШ>            }
АШ>            else
АШ>                hasSent = true;
АШ>        }

АШ>


АШ>Сокеты блокирующие, синзронные. По сокетам передаются куски файла, и вот некоторые куски или части их не получаются на сервере.

АШ>При этом если при других запусках теряются те же куски. Но если поставить задержку после send`а, то всё нормально доходит.

АШ>В чём может быть проблема?


Стоит проверять сокет на готовность, попробуй select() перед операциями ввода вывода. Или вообще перейти на неблокирующие сокеты. Тут вот пример под линукс, но особой разницы нет http://nonblock.tripod.com/ds.html
Re: winsock - проблема с потерей данных
От: butcher Россия http://bu7cher.blogspot.com
Дата: 06.09.06 07:27
Оценка:
Здравствуйте, Андрей Шестимеров, Вы писали:

АШ>В чём может быть проблема?


Покажите больше кода.

Нет ничего невозможного..
Re: winsock - проблема с потерей данных
От: Андрей Шестимеров Россия http://informatics.ru
Дата: 08.09.06 11:40
Оценка:
    while (true) 
    {
        recvBuff.BufferClear();
            bytesRecv = recv( AcceptSocket, (char*)recvBuff, sizeof (recvBuff), 0 );            
            ....
      }


АШ>В чём может быть проблема?


проблема решилась получением даных в цикле, пока весь буфер не получился
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.