Доброго времени суток!
Возникла такая проблема — есть сервер получающих данные:
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`а, то всё нормально доходит.
В чём может быть проблема?
Здравствуйте, Андрей Шестимеров, Вы писали:
АШ>Доброго времени суток!
АШ>Возникла такая проблема — есть сервер получающих данные:
АШ>АШ> 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
while (true)
{
recvBuff.BufferClear();
bytesRecv = recv( AcceptSocket, (char*)recvBuff, sizeof (recvBuff), 0 );
....
}
АШ>В чём может быть проблема?
проблема решилась получением даных в цикле, пока весь буфер не получился