Итак в прошлой статейке (дело было с CRC32) я положил начало данному циклу статей. Там же я описал структуру, которая будет нами использоваться в последующих статьях. Сегодня я хочу рассмотреть часть, пожалуй, самую главную для программы передачи файлов — серверную. Как будет действовать серверная часть?ann2 Передача файлов. Часть вторая. Сервер.Для начала будет вызвана процедура-сервер, которая в дальнейшем, по мере подсоединения клиентов, будет запускать потоки-приемщики.С процедурой сервером проблем вроде бы нет. Код:

void RunServer()
{
        SOCKET server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        SOCKADDR_IN ssin = {0};
        ssin.sin_family = AF_INET;
        ssin.sin_addr.s_addr = INADDR_ANY;
        ssin.sin_port = htons(port);

        bind(server,(SOCKADDR *)&ssin,sizeof(ssin));
        listen(server,SOMAXCONN);

        while(1)
        {
                SOCKADDR_IN cssin = {0};
                int dwcssin = sizeof(cssin);
                SOCKET client = accept(server,(SOCKADDR *)&cssin,&dwcssin);

                printf(" *** New received file from %s ***\n",inet_ntoa(cssin.sin_addr));

                DWORD dwId;
                HANDLE hThread = CreateThread(NULL,NULL,pThread,(LPVOID)client,NULL,&dwId);
                CloseHandle(hThread);
        }

        closesocket(server);
}

Все шаблонно, кому интересно, может нарыть мануальчик на блоге на эту тему. Создаем сокет, биндим, в слушающий режим. Далее ждем конект. Если есть — пишем кто нам шлет файл и создаем поток-приемщик. Идем дальше, код приемщика таков:

DWORD WINAPI pThread(LPVOID p)
{
        SOCKET c = (SOCKET)p;

        TFileStruct fs = {0};
        recv(c,(char *)&fs,sizeof(TFileStruct),0);

        DWORD dwWB;
        HANDLE hFile = CreateFileA(fs.fName,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);

        DWORD dwStep = fs.fSize / 11;
        DWORD dwCurSend = 0;
        printf("Progress: [");

        DWORD rb = 0;
        char szBuffer[1024];
        while(rb= dwStep)
                {
                        dwCurSend = 0;
                        printf(" * ");
                }
        }

        printf("]\n");

        CloseHandle(hFile);

        closesocket(c);

        if(fs.dwCRC32 == CRC32(fs.fName))
                printf(" *** File %s of size %d succes received! ***\n *** CRC32 chksum = %#.8X OK ***\n",fs.fName,fs.fSize,fs.dwCRC32);
        else
                printf(" *** File chksum incorrect! ***\n");

        return 0;
}

Здесь мы получаем сначала заголовок, потом  открываем указанный файл на запись и циклически сначала получаем потом сохраняем. И не забываем вести прогресс бар, все таки удобно, когда графически отображает, сколько получено. А затем используем процедуру получения CRC32 файла для определения, получили ли мы хороший файл или нет. Вот пожалуй и все. Эту шнягу мы испытывали с другом на передаче карт для казачков — принимает отличноicon wink Передача файлов. Часть вторая. Сервер.

tt twitter big4 Передача файлов. Часть вторая. Сервер. tt digg big4 Передача файлов. Часть вторая. Сервер. tt facebook big4 Передача файлов. Часть вторая. Сервер. tt gmail big4 Передача файлов. Часть вторая. Сервер. tt myspace big4 Передача файлов. Часть вторая. Сервер. tt reddit big4 Передача файлов. Часть вторая. Сервер.

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++