Сокет. Передача файлов. С++.
Здравствуйте. Меня интересует каким образом можно передать через сокет с клиента на сервер(или наоборот, неважно) бинарный или же исполняемый файл. Видел много примеров передачи содержимого символьного буфера, но без фрагмента кода с открытием фалйа и записью его в буфер, не думаю что бинарный или исполняемый файл можно передавать таким же образом. Пишу на Win7, C++Builder, winsock2 . Если можнос примерами кода.
Код:
//Открываем и читаем _весь_ файл во временный буфер
int fh=FileOpen("имяфайла", fmOpenRead);
int size=FileSeek(fh,0,2);
unsigned char * buff=new unsigned char[size];
FileSeek(fh,0,0);
FileRead(fh,buff,size);
FileClose(fh);
//bind и connect сокета сам сделаешь, раз примеры есть. Хендл сокета нашего ws2.
if(send(ws,(void*)&size,sizeof(int),0)==sizeof(int))//Отсылаем размер файла
{
if(send(ws,buff,size,0)==size)//Отсылаем файл
{
//Успешно
}
else
{
//Не удалось послать файл
}
}
else
{
//Не удалось послать размер
}
int fh=FileOpen("имяфайла", fmOpenRead);
int size=FileSeek(fh,0,2);
unsigned char * buff=new unsigned char[size];
FileSeek(fh,0,0);
FileRead(fh,buff,size);
FileClose(fh);
//bind и connect сокета сам сделаешь, раз примеры есть. Хендл сокета нашего ws2.
if(send(ws,(void*)&size,sizeof(int),0)==sizeof(int))//Отсылаем размер файла
{
if(send(ws,buff,size,0)==size)//Отсылаем файл
{
//Успешно
}
else
{
//Не удалось послать файл
}
}
else
{
//Не удалось послать размер
}
//Както так
Инфа по сокету с примером:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149%28v=vs.85%29.aspx
Хотя имхо при использовании VCL проще былобы сделать через TIdTCPClient/TIdTCPServer
Цитата: rocketdeath
Видел много примеров передачи содержимого символьного буфера, но без фрагмента кода с открытием фалйа и записью его в буфер, не думаю что бинарный или исполняемый файл можно передавать таким же образом.
Абсолютно без разницы. Нету вобще по сути бинарных там или чисто символьных буферов. Все это набор байт определенной длины. Просто один набор байт ты интерпретируешь как текст, а другой как исполняемый файл. Для компилятора же - это все без разницы. =)
по большому счету - да, без разницы. ты открываешь файл на чтение (на стороне того откуда собираешься его передавать), читаешь содержимое - и высылаешь. А на стороне получается собираешь обратно в файл. Единственный нюанс - файл открывать и читать надо как бинарный файл (флаг ios::binary, например для fstream).