Доброго дня. Стоит необходимость передавать файлы внутри локальной сети (100Мбит/сек). Файлы передаются, вопрос только в скорости передачи.
Весь алгоритм
отправки.
1) Подключился к клиенту.
2) Выбрал файл отправки.
3) Кинул имя файла и его размер.
4) Дождался ответа, что имя и размер приняты и клиент ждёт "начинку". Высылает начинку. Ниже кусок непосредственно высылающий файл.
C++ (Qt)
while(curNumber*_blockSize<=_FileSize)
{
qint64 a=_FileSize-curNumber*_blockSize;
int blockSize = qMin(a,_blockSize);
QByteArray filearr=FileForSend->read(blockSize);
sock->write(filearr);
curNumber++;
}
5) Дождался сообщения что файл принят и просчитал среднюю скорость передачи.
Алгорит приёма.1) Приём подключения от сервера. QTcpServer стоит на стороне клиента
2) Приём имени файла и его размера.
3) Приём содержимого файла.
C++ (Qt)
quint64 currentSize=0,curBytesAv=0;
while(currentSize < FileSize){
curBytesAv=socket->bytesAvailable();
if(curBytesAv>0){
QByteArray arr;
arr = sock->read(curBytesAv);
if(curBytesAv==arr.size()){
FileForRec->write(arr);
currentSize+=curBytesAv;
}
}
if(currentSize < FileSize)
sock->waitForReadyRead();
}
4) Считает среднюю скорость передачи и высылает подтверждение приёма.
5) ждёт следующую шапку файла.
Далее имеется несколько машин:
A - 3ггц, 1 гиг оперативки, 1Гигабит сетевая, WinXp
B - 2.6ггц, 768 мб оперативки, 100Мегабит ,WinXp
C - 3.2ггц, 1 гиг оперативки, 100Мегабит, Vista
Собственно говоря проблема в следующем:
имеется тестовый файл размером в 50МегаБайт который я перекидываю:
с А->A скорость 250+мегабит
c A->B ~50мегабит
с А->C ~8мегабит
c B->B ~50мегабит
c С->C ~50 мегабит
c B->A ~50 мегабит
Я понимаю что выше 100мегабит скорость не получить, но вот почему она в определенных случаях такая маленькая понять не могу. Подскажите в какую сторону смотреть? Возможно нужно какие-то настройки сокетов через Api править? Я не вижу как ещё можно ускорить алгоритм отправки и приёма.