Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 15:31   #1
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
Печаль winSock передача файла

Сорс робит.

Клиент:
PHP код:
#include "stdafx.h"
#include "iostream"
#include "winsock2.h"
#include <windows.h>

#pragma comment (lib, "Ws2_32.lib")

using namespace std;

int main()
{
    
    
WSADATA WsaData;
    
sockaddr_in peer;
    
int countsrc;
    
    
int err WSAStartup (0x0202, &WsaData);
    if(
err>=0) { cout << "WSA start ..OK \n" << endl; }
    else { 
cout << "WSA error \n" << endl;}

    
peer.sin_family AF_INET;
    
peer.sin_port htons(8800);
    
peer.sin_addr.s_addr inet_addr("127.0.0.1");
  
    
socket(AF_INET,SOCK_STREAM,0);
    if(
s>=0) { cout << "Socket create ..OK \n" << endl; }
    else {
cout << "Socket error \n\n" << endl;}
    
    
    
rc connect(s,(sockaddr*)&peersizeof(peer));

HANDLE FileOut;
DWORD m;   



HANDLE out GetStdHandle(STD_INPUT_HANDLE);

  
TCHAR path[70];
  
    
DWORD  dr 0U;
 
    
    
cout << "Write the full path to the file.  Example:   D:\\\\folder\\my.exe \n\n\t" << endl;

  if(
ReadConsole(outpathsizeof(path), &drNULL)) 
     
    {
        
FlushConsoleInputBuffer(out);
 
        
path[dr 2]  = '\0'
     } 

FileOut=CreateFile(path,GENERIC_READFILE_SHARE_READNULLOPEN_EXISTING,FILE_ATTRIBUTE_NORMAL 0);
count=GetFileSize(FileOut,NULL);
char bufs= new char[count];

ReadFile(FileOut,bufs,count,&m,NULL);

char buf[12],bufRecv[3];

itoa(count,buf,10);

send(s,buf,sizeof(buf),0);

recv(s,bufRecv,sizeof(bufRecv),0);



if (!
strcmp("OK",bufRecv)) {

    
    
send(s,bufs,count,0);



}


delete [] bufs;

 
closesocket(s);
system("pause");
    
    
    
    return 
0;


сервер:

PHP код:
#include "stdafx.h"
#include "iostream"
#include "winsock2.h"
#include <windows.h>

#pragma comment (lib, "Ws2_32.lib")

using namespace std;


int main() {

    
WSADATA WsaData;
    
struct sockaddr_in local;
    
int s,s1,rc;
    
char bufRecv[16],buf[100];
    
char OkClient[]="OK";

    
int err WSAStartup (0x0101, &WsaData);
    if(
err>=0) { cout << "WSA start ..OK \n" << endl;}
    else { 
cout << "WSA error \n" << endl;}
   
 
    
local.sin_family AF_INET;
    
local.sin_port htons(8800);
    
local.sin_addr.s_addr htonl(INADDR_ANY);
   if ( (
socket(AF_INET,SOCK_STREAM,0))<0
               { 
std:: cout <<"error sock \n"<< endl; } 
   else
               { 
std::cout<<"Create sock: OK\n";     }

    
rc bind(s,(struct sockaddr*)&localsizeof(local));
if (
rc<0){
        
perror("bind error");
        exit(
1);
    }else{
        
std::cout<<"Bind: OK\n";
           }
 
           
rc listen(s,5);
           if(
rc){
               
perror("listen error");
        exit(
1);
           }else{
        
std::cout<<"Listen: OK\n";
}

    
    
s1 accept(s,NULL,NULL); 
    
cout << "Client connect.. \n\n";
    
    
recv(s1,bufRecv,sizeof(bufRecv),0);

    
int numDump=atoi(bufRecv);
    
    
char *dumpFile= new char[numDump];

    
send(s1,OkClient,sizeof(OkClient),0);
        
    
recv(s1,dumpFile,numDump,0);


    
HANDLE toFile;
    
DWORD m;
    
    
toFile=CreateFile(TEXT("D:\\mm.txt"),GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
    
    
WriteFile(toFile,dumpFile,numDump,&m,0);
    
    
    
    
delete [] dumpFile;

system("pause");

Знаю что пока все убожеское. Например то, что нужно указывать тип файла и потом перекомилировать сорс сервера. Потом добавлю возможность определения типа файла, выбора директории для закачки и т.п Ну да ладно, суть проблемы в общем я уже описал.

Последний раз редактировалось Dizelektwo; 27.04.2012 в 19:56.
Dizelektwo вне форума Ответить с цитированием
Старый 27.04.2012, 17:34   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

возможно изза этого
Код:
ReadFile(FileOut,bufs,sizeof(bufs),&m,NULL);
может вот так
Код:
ReadFile(FileOut,bufs,count,&m,NULL);
дальше не смотрел
microbit вне форума Ответить с цитированием
Старый 27.04.2012, 17:52   #3
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Спасибо тебе, но нет. Здесь в принципе разницы нет. count число байт, bufs размером в Count.

Ошибка именно в передаче файла, как я понял. recv считывает файл до первого пробела?
Как в таком случае передать файл в не измененном виде? Заменить пробелы на другие знаки и при получение обратить процесс? Знаю что мои мысли абсурдны, но уже даже и догадок нет в чем проблема.
Отправляю файл и опять передает только до первого ' '.

Сейчас попробовал запустить передачу файла в цикле, по окончанию что бы отправлял "end" и закрывал бы соединение. Бестолку. Не понимаю в чем дело

Отправлено : end ||| start. Получено(файл mm.txt): endHHHHHHHHHH. Со сплошным содержимым проблем нет, например строка "япишунасипипиприветмир" передается нормально.

Последний раз редактировалось Dizelektwo; 27.04.2012 в 18:15. Причина: добавлено
Dizelektwo вне форума Ответить с цитированием
Старый 27.04.2012, 18:31   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

microbit +1

sizeof(bufs) === 4, по-любому
f.hump вне форума Ответить с цитированием
Старый 27.04.2012, 18:37   #5
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

f.hump
Цитата:
sizeof(bufs) === 4
Для чего?
Dizelektwo вне форума Ответить с цитированием
Старый 27.04.2012, 18:45   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

это не для чего, а к тому, что вместо того, чтобы объявлять вашу сплошную строку статически запихните ее в файл и зацените результат.
f.hump вне форума Ответить с цитированием
Старый 27.04.2012, 18:50   #7
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Извините, видимо я совсем дуб. Но строка- то у меня в файле и я этот файл отправляю. Какое объявление? Единственное что я объявляю - это строка "ок".
Я прописываю путь к файлу, далее узнаю его размер в байтах. Конвертирую int и byte ф-ей itoa, передаю размер файла. Сервер выделяет буфер под файл. Далее отправляет "ок"- успех получения, далее клиент начинает отсылать файл.
Count - это число байт, bufs- это массив размером в Count. Что мне следует исправить?

Последний раз редактировалось Dizelektwo; 27.04.2012 в 19:00.
Dizelektwo вне форума Ответить с цитированием
Старый 27.04.2012, 18:59   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

сделайте как microbit предложил.
и когда делаете send тоже sizeof выкиньте

Последний раз редактировалось f.hump; 27.04.2012 в 19:02.
f.hump вне форума Ответить с цитированием
Старый 27.04.2012, 20:26   #9
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Благодарю, все робит. Первый раз по какой-то причине результата это не дало. Позже удалил созданный раннее файл mm.txt и все пошло как по маслу. новый mm.txt полный дубликат передаваемого файла. Спасибо еще раз
Dizelektwo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закачка файла на WinSock t2skler Общие вопросы Delphi 14 19.11.2018 11:54
Передача файла по сети (winsock) lol48 Фриланс 8 08.06.2011 21:44
передача данных на Winsock megostudent Win Api 5 23.03.2011 17:35
Скачивание файла winsock Horus92 Работа с сетью в Delphi 13 25.02.2011 13:29