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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2014, 16:55   #1
I_am_
 
Регистрация: 03.12.2014
Сообщений: 6
Вопрос Передача файла сервер клиент

у меня есть код, который передает файлы из клиента на сервер, помогите переделать так чтобы сервер передавал файл, а клиент принимал!

вот код для клиента, который передает файл:
Код:
DWORD WINAPI NetworkThread_f(LPVOID)
{WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0)
{MessageBox(NULL, _T("Ошибка инициализации WinSock."), szTitle, MB_ICONERROR | MB_OK);
return 1;}
// Откроем клиентский сокет.
struct addrinfo *res = NULL, *ptr = NULL, hints;
// Заполним структуру hints, содержащую параметры клиентского сокета.
ZeroMemory(&hints, sizeof(hints));
// Адресная семья (для клиентского сокета можно не указывать).
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
int nLen = GetWindowTextLength(hwndE1);
LPTSTR lpText =(LPTSTR)HeapAlloc( GetProcessHeap(),HEAP_ZERO_MEMORY, nLen+1 ) ;
if ( lpText ){
GetWindowText(hwndE1, lpText, nLen+1 );
nLen= WideCharToMultiByte(CP_ACP,0,lpText,_tcslen(lpText),server_ip,nLen+1,0,0);
}
server_ip[nLen]='\0';
result = getaddrinfo(server_ip, "9999", &hints, &res);
if (result != 0)
{
MessageBox(NULL, _T("Ошибка преобразования порта."),szTitle, MB_ICONERROR | MB_OK);
WSACleanup();

return 1;
}
// Создаём сокет.
SOCKET client_socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (client_socket == INVALID_SOCKET)
{
MessageBox(NULL, _T("Ошибка создания сокета."), szTitle, MB_ICONERROR | MB_OK);
freeaddrinfo(res);
WSACleanup();
//SendError();
return 1;
}
// После создания клиентский сокет необходимо подключить (connect) к серверу.
result = connect(client_socket, res->ai_addr, (int)res->ai_addrlen);
if (result == SOCKET_ERROR || client_socket == INVALID_SOCKET)
{
MessageBox(NULL, _T("Невозможно подключиться к серверу."), szTitle, MB_ICONERROR | MB_OK);
freeaddrinfo(res);
return 1;
}
// После вызова connect() переменная res нам больше не нужна.
freeaddrinfo(res);
res = NULL;
// Уведомляем окно о том, что подключение к серверу завершено.
SendMessage(hWnd, WM_CONNECTED, 0, 0);
// Теперь мы можем передавать и принимать данные, используя клиентский сокет.
unsigned int size, size2;
char data[1000];
char *data2;
data2 = new char[600000];
// strcpy(data,"Restart.txt");
//strcpy(data2,"cat.jpg");
nLen = GetWindowTextLength(hwndE2);
lpText =(LPTSTR)HeapAlloc( GetProcessHeap(),HEAP_ZERO_MEMORY, nLen+1 ) ;
if ( lpText )
{
GetWindowText(hwndE2, lpText, nLen+1 );
nLen= WideCharToMultiByte(CP_ACP,0,lpText,_tcslen(lpText),data,nLen+1,0,0);
}
data[nLen]='\0';
size=strlen(data);
if(Find_file(data,data2,size2))
{
if (send(client_socket, (char*)&size, sizeof(int), 0) == SOCKET_ERROR ||
send(client_socket, data, size, 0) == SOCKET_ERROR ||
send(client_socket, (char*)&size2, sizeof(int), 0) == SOCKET_ERROR ||
send(client_socket, data2, size2, 0) == SOCKET_ERROR)
{
return 1;
}
}
// Отключаемся.
result = shutdown(client_socket, SD_RECEIVE);
if (result == SOCKET_ERROR)
{
MessageBox(NULL, _T("Ошибка выключения клиентского сокета."), szTitle, MB_ICONERROR | MB_OK);
closesocket(client_socket);
WSACleanup();
return 1;
}
SendMessage(window, WM_FINISHED, 0, 0);
return 0;
}

Последний раз редактировалось Stilet; 10.12.2014 в 20:08.
I_am_ вне форума Ответить с цитированием
Старый 10.12.2014, 16:56   #2
I_am_
 
Регистрация: 03.12.2014
Сообщений: 6
По умолчанию

вот для сервера, который принимает файл:
Код:
DWORD WINAPI NetworkThread_f(LPVOID)
{
// Для каждого входящего подключения:
while (true)
{
// Уведомляем окно о том, что сокет готов.
// Принимаем входящее подключение.
// При новом входящем подключении на сервере создаётся клиентский сокет, через
// который осуществляется передача данных.
// Функция accept будет ждать, пока не подсоединится клиент.
//SOCKET
client_socket = accept(listen_socket, NULL, NULL);
if (client_socket == INVALID_SOCKET)
{
MessageBox(NULL, _T("Ошибка приёма подключения."), title, MB_ICONERROR | MB_OK);
//closesocket(listen_socket);
//WSACleanup();
//SendError();
return 1;
}

// Посылаем окну сообщение о подключении клиента.
SendMessage(hWnd, WM_CONNECTED, 0, 0);

// Теперь мы можем передавать и принимать данные, используя клментский сокет.

int size1,size2;
char*data1;
char*data2;
if (recv_all(client_socket, (char*)&size1, sizeof(int)) != 0)
{
return ReceivingFailure(client_socket);
}

data1 = new char[size1];
if (recv_all(client_socket, data1, size1) != 0)
{
return ReceivingFailure(client_socket);
}
data1[size1]='\0';

if (recv_all(client_socket, (char*)&size2, sizeof(int)) != 0)
{
return ReceivingFailure(client_socket);
}

data2 = new char[size2];
if (recv_all(client_socket, data2, size2) != 0)
{
return ReceivingFailure(client_socket);
}
data2[size2]='\0';

FILE *f;

f=fopen(data1,"wb");
for(int i=0;i<size2;i++)
{
fprintf(f,"%c",data2[i]);
}
fclose(f);
//ShellExecute(NULL,_T("open"),_T("catn.jpg"),NULL,NULL,SW_SHOW);
WCHAR szd[100];
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,data1, -1, szd, 64 );

SendMessage (hwndCb2, LB_ADDSTRING, 0, (LPARAM) szd);

// Отключаемся от клиента. Для этого следует выключить (shutdown) и закрыть
// (close_socket) клиентский сокет.
// Выключаем клиентский сокет. Это необходимо сделать перед закрытием сокета,
// чтобы дождаться от клиента сообщения об успешном приёме данных и быть
// уверенным в том, что клиент полностью принял наши данные.
int result = shutdown(client_socket, SD_SEND);
if (result == SOCKET_ERROR)
{
MessageBox(NULL, _T("Ошибка выключения клиентского сокета."), title, MB_ICONERROR | MB_OK);
closesocket(listen_socket);
WSACleanup();
// SendError();
return 1;
}
// Отключаемся от клиента.

//LeaveCriticalSection(&cs);

}
return 0;
}

Последний раз редактировалось Stilet; 10.12.2014 в 20:08.
I_am_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент - сервер передача файлов vovik93 Общие вопросы по Java, Java SE, Kotlin 0 17.07.2012 01:06
Передача файла клиент-сервер Loveb C/C++ Сетевое программирование 2 27.05.2011 10:10
Need Help! Передача файлов (Сервер-Клиент) Elandar Работа с сетью в Delphi 1 25.07.2008 00:22
Передача файлов по интернету. Клиент-сервер. Kukkk Работа с сетью в Delphi 4 03.12.2007 06:08