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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.