Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 50

Сервер TCP

21.12.2013, 16:22. Показов 2801. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: Обеспечить перемещение файла по фиксированным частям в несколько открытых соединений по сети. От клиента к серверу. Протокол взаимодействия TCP;
Код клиента:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <iostream>
#include <locale.h>
#include <conio.h>
 
#ifndef UNICODE
#define UNICODE
#endif
 
#define WIN32_LEAN_AND_MEAN
#define DEFAULT_BUFLEN 512
 
using namespace std;
 
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
 
int wmain()
{
    setlocale(LC_ALL, "RU");
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);
 
    //----------------------
    // Connect to server.
    char path[MAX_PATH] = {0},
    path1[MAX_PATH] = {0};
 
    cout << "Введите путь к файлу: ";
    cin.getline (path, MAX_PATH);
 
    OemToCharA(path, path1);
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    wprintf(L"Connected to server.\n");
    
    iResult = send( ConnectSocket, path1, sizeof(path1), 0 );
    FILE *f;
    fopen_s(&f, path1,"rb");
    while(!feof(f))
    {
        char blockfile[524288] = {0};
        int i = fread(blockfile, sizeof(char), 524288, f);
        iResult=send(ConnectSocket, blockfile, i,0);
    }
    fclose(f);
    remove(path1);
    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
 
    WSACleanup();
    return 0;
}

Код сервера:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <locale.h>
#include <conio.h>
#ifndef UNICODE
#define UNICODE
#endif
// Need to link with Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 512
 
using namespace std;
 
typedef struct{
    char path[MAX_PATH];
    SOCKET client;
}Data;
 
 
DWORD WINAPI ThreadProc(LPVOID lpParam){
    DWORD dwResult = 0;
    Data *dat=(Data *)lpParam;
 
    int iResult;
    FILE *f;
    fopen_s(&f,dat->path,"wb");
    do
    {
        char blockfile[524288] = {0};
        iResult=recv(dat->client,blockfile,524288,0);
        fwrite(&blockfile,sizeof(char),iResult,f);
    }while(iResult>0);
    fclose(f);
 
    free(dat);
 
    return dwResult;
}
 
int wmain(void)
{
    setlocale(LC_ALL, "RU");
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;
    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = INADDR_ANY;
    service.sin_port = htons(27015);
 
    if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");
 
    //----------------------
    // Accept the connection.
    char path[MAX_PATH] = {0},
    path1[MAX_PATH] = {0};
 
    cout << "Введите папку: ";
    cin.getline (path, MAX_PATH);
    HANDLE hThread;
    DWORD dwThreadId;
    
    OemToCharA(path, path1);
    
    while(1)
    {
        AcceptSocket = accept(ListenSocket, NULL, NULL);
        wprintf(L"Client connected.\n");
        if (AcceptSocket == INVALID_SOCKET) {
            wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        } else
        wprintf(L"Client connected.\n");
    
        iResult = recv(AcceptSocket, recvbuf, recvbuflen, 0);
        char tmp[MAX_PATH] = {0},tmp1[MAX_PATH] = {0}, tmp2[MAX_PATH]={0};
        _splitpath_s(recvbuf,NULL, NULL,NULL,NULL,tmp,MAX_PATH,tmp1,MAX_PATH);
        strcat_s(tmp,MAX_PATH,tmp1);
        sprintf_s(tmp2, "%s\\%s", path1, tmp);
        Data *dat=new Data();
        dat->client=AcceptSocket;
        strcpy_s(dat->path,tmp2);
        hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID*)dat, 0, &dwThreadId);
        CloseHandle(hThread);
    }
    // No longer need server socket
    closesocket(ListenSocket);
 
    WSACleanup();
    return 0;
}

Проблема в том, что файл исчезает, но не появляется в другой месте. Может кто-нибудь подскажет, что не так?
PS: сервер зависает на: AcceptSocket = accept(ListenSocket, NULL, NULL);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2013, 16:22
Ответы с готовыми решениями:

как создать TCP клиент, TCP сервер ? На С++
Очень нужна помощь!Как написать TCP клиент, TCP сервер. Например,клиент вводит строку с клавиатуры и отсылает ее серверу.только перед...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt; # pragma comment (lib,...

TCP сервер
Написал сервер на Python: from twisted.internet.protocol import Factory, Protocol from twisted.internet import reactor class...

20
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
24.12.2013, 19:48
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
С какой такой стати мы должны любое целое значение трактовать как логическое?
мы можем это сделать. потому что это свойство языка о котором идет речь. не какого-нибудь, а именно этого. он может так делать. и мы знаем об этом. если мы знаем язык. в начале в нем вообще не было типа bool. истина это 1, а ложь это 0. не правда ли выглядит весьма естественно?



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Однако чем сильнее мы себя ограничим явным образом от ошибок - тем лучше будет для нас же самих.
видимо я для себя решил что у меня будет больше ошибок и путаницы если мозги при обнаружении логического выражения сравнения с константой будут обрабатывать его особым образом и выносить ее вперед - пусть лучше обрабатывают все единообразно и не вздумают делать = вместо == вне зависимости от специфики выражения

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2013, 19:48
Помогаю со студенческими работами здесь

Tcp Сервер
Реализовать TCP-север, принимающий соединение на заданный порт. После того, как соединение установлено, сервер записывает в файл все...

сервер TCP/IP
нужна помощь по устранению ошибок! #include&lt;stdafx.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; #include...

TCP/IP клиент и сервер
Сервер # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt; # pragma comment (lib,...

TCP сервер и клиент
Добрый день! Необходимо реализовать TCP сервер, поддерживающий соединения с несколькими клиентами. Сервер должен принимать...

TCP клиент-сервер
Всем привет! Прошу помощи в освоении организации передачи данных по TCP. Если у кого то есть рабочий исходник TCP чата, то было бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru