Отправка файла по сети

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Лена89
Сообщения: 52
Зарегистрирован: 20 июн 2007, 10:36

Доброе время суток!

Серверная часть программы:

Код: Выделить всё

…………………………
//Получение данных
ret = recv(sock, szRecvBuff, 1024, 0);
……………………………………………
//Отправка файла
FILE *f;

char szBuff[4096];
int nSendSize;

f = fopen( "C:\\1.txt", "r+t" );
nSendSize = fread( szBuff, sizeof( char ), 4096, f );
		
int iCurrPos = 0;

while(nSendSize > 0)
{
ret = send(sock, &szBuff[iCurrPos], nSendSize, 0);

	if(ret == 0)
		break;
	else
	if(ret == SOCKET_ERROR)
	{
		//Произошла ошибка
		MessageBox(0, "Send failed", "Error", 0);
		break;
	}
	nSendSize -= ret;
	iCurrPos += ret;
}

fclose( f );
Клиентская часть программы:

Код: Выделить всё

………………….
strcpy(szMessage, "get");
strcpy(szServerName, "127.0.0.1");

sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
………………………………………
ret = send(sClient, szMessage, strlen(szMessage), 0);
………………………………………
//Получение файла
FILE *f;
char szBuff[4096];
int nSendSize = 20000; //Размер данных 
int iCurrPos = 0;

f = fopen( "C:\\2.txt", "w+t" );
	
while(nSendSize > 0)
{
	ret = recv(sClient, &szBuff[iCurrPos], nSendSize, 0);
	fwrite( szBuff, sizeof( char ), ret, f );

	if(ret == 0)
		break;
	else
	if(ret == SOCKET_ERROR)
	{
		//Произошла ошибка
		MessageBox(0, "Send failed1", "Error", 0);
		break;
	}
	nSendSize -= ret;
	iCurrPos += ret;
}
	
fclose( f );

closesocket(sClient);
Пытаюсь отправить файл частями, но он отправляется только размером в szBuff[4096] и за один проход while(nSendSize > 0){……}
Если файл полностью убирается в szBuff[4096], то проходит весь файл. Если нет, то обрезается размером szBuff[4096]. Что можно поправить в коде, что бы отправлять его по частям.
Использую MS Visual Studio.NET 2003.

Спасибо.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Лена89 писал(а):Пытаюсь отправить файл частями, но он отправляется только размером в szBuff[4096]
Потому что так написано. У Вас чтение из файла идет только один раз (не более 4096 байт). Потом они отправляются и всё.
Надо еще один внешний цикл "по чтению файла". Пока файл не закончился, читать очередную порцию файла, отправлять её.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:


nSendSize = fread( szBuff, sizeof( char ), 4096, f );
Эту строку нужно поместить внутрь цикла while, тогда ещё один внешний цикл может не понадобиться.
Лена89
Сообщения: 52
Зарегистрирован: 20 июн 2007, 10:36

Тогда, что присвоить nSendSize, перед while(nSendSize > 0){...}. Если int nSendSize = sizeof(szBuff), то результат тот же.
Ответить