Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
Рейтинг 4.68/180: Рейтинг темы: голосов - 180, средняя оценка - 4.68
 Аватар для mifeliz
2 / 2 / 1
Регистрация: 18.01.2011
Сообщений: 35

TCP-клиент

14.03.2011, 17:28. Показов 36324. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
СЕРВЕР:
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
135
136
137
138
139
140
141
// Пример простого TCP-эхо-сервера
#include <stdio.h>
#include <winsock2.h> // Wincosk2.h должен быть раньше windows!
#include <windows.h>
 
#define MY_PORT 666 // Порт, который слушает сервер 666
 
// макрос для печати количества активных пользователей
#define PRINTNUSERS if (nclients) printf("%d user on-line\n", nclients); \
        else printf("No User on line\n");
 
// прототип функции, обслуживающий подключившихся пользователей
DWORD WINAPI SexToClient(LPVOID client_socket);
 
 
 
 
// глобальная переменная - количество активных пользователей
int nclients = 0;
 
int main(int argc, char* argv[])
{
    char buff[1024]; // Буфер для различных нужд
 
    printf("TCP SERVER DEMO\n");
    // Шаг 1 - Инициализация Библиотеки Сокетов
    // т.к. возвращенная функцией информация не используется
    // ей передается указатель на рабочий буфер, преобразуемый к указателю
    // на структуру WSADATA.
    // Такой прием позволяет сэкономить одну переменную, однако, буфер
    // должен быть не менее полкилобайта размером (структура WSADATA
    // занимает 400 байт)
    if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 2 - создание сокета
    SOCKET mysocket;
    // AF_INET - сокет Интернета
    // SOCK_STREAM - потоковый сокет (с установкой соединения)
    // 0 - по умолчанию выбирается TCP протокол
    if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        // Ошибка!
        printf("Error socket %d\n", WSAGetLastError());
        WSACleanup(); // Деиницилизация библиотеки Winsock
        return -1;
    }
 
    // Шаг 3 - связывание сокета с локальным адресом
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(MY_PORT); // не забываем о сетевом порядке!!!
    local_addr.sin_addr.s_addr = 0; // сервер принимает подключения
                                    // на все свои IP-адреса
 
    // вызываем bind для связывания
    if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr)))
    {
        // Ошибка
        printf("Error bind %d\n", WSAGetLastError());
        closesocket(mysocket); // закрываем сокет!
        WSACleanup();
        return -1;
    }
 
    // Шаг 4 - ожидание подключений
    // размер очереди - 0x100
    if (listen(mysocket, 0x100))
    {
        // Ошибка
        printf("Error listen %d\n", WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
 
    printf("ozidanie podkluceniy...\n");
 
    // Шаг 5 - извлекаем сообщение из очереди
    SOCKET client_socket; // сокет для клиента
    sockaddr_in client_addr; // адрес клиента (заполняется системой)
 
    // функции accept необходимо передать размер структуры
    int client_addr_size = sizeof(client_addr);
 
    // цикл извлечения запросов на подключение из очереди
    while ((client_socket = accept(mysocket, (sockaddr *)&client_addr, \
           &client_addr_size)))
    {
        nclients++; // увеличиваем счетчик подключившихся клиентов
 
        // пытаемся получить имя хоста
        HOSTENT *hst;
        hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);
 
        // вывод сведений о клиенте
        printf("+%s [%s] new connect!\n",
        (hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
        PRINTNUSERS
 
        // Вызов нового потока для обслужвания клиента
        // Да, для этого рекомендуется использовать _beginthreadex
        // но, поскольку никаких вызовов функций стандартной Си библиотеки
        // поток не делает, можно обойтись и CreateThread
        DWORD thID;
        CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
    }
    return 0;
}
 
// Эта функция создается в отдельном потоке
// и обсуживает очередного подключившегося клиента независимо от остальных
DWORD WINAPI SexToClient(LPVOID client_socket)
{
    SOCKET my_sock;
    my_sock = ((SOCKET *)client_socket)[0];
    char buff[20 * 1024];
    #define sHELLO "SOCKET PODKLUCHEN\r\n"
 
    // отправляем клиенту приветствие
    send(my_sock, sHELLO, sizeof(sHELLO), 0);
 
    // цикл эхо-сервера: прием строки от клиента и возвращение ее клиенту
    int bytes_recv;
    while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
    bytes_recv != SOCKET_ERROR)
    send(my_sock, &buff[0], bytes_recv, 0);
 
    // если мы здесь, то произошел выход из цикла по причине
    // возращения функцией recv ошибки - соединение с клиентом разорвано
    nclients--; // уменьшаем счетчик активных клиентов
    printf("-disconnect\n"); PRINTNUSERS
 
    // закрываем сокет
    closesocket(my_sock);
    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
// Пример простого TCP-клиента
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
 
#define PORT 666
#define SERVERADDR "*.*.*.*" //Звёздочками пометил свой IP
 
int main(int argc, char* argv[])
{
    char buff[1024];
    printf("TCP DEMO CLIENT\n");
 
    // Шаг 1 - инициализация библиотеки Winsock
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        printf("WSAStart error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 2 - создание сокета
    SOCKET my_sock;
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (my_sock < 0)
    {
        printf("Socket() error %d\n", WSAGetLastError());
        return -1;
    }
 
    // Шаг 3 - установка соединения
    // заполнение структуры sockaddr_in - указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    HOSTENT *hst;
 
    // преобразование IP адреса из символьного в сетевой формат
    if (inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else
    {
        // попытка получить IP адрес по доменному имени сервера
        if (hst = gethostbyname(SERVERADDR))
            // hst->h_addr_list содержит не массив адресов,
            // а массив указателей на адреса
            ((unsigned long *)&dest_addr.sin_addr)[0] =
            ((unsigned long **)hst->h_addr_list)[0][0];
        else
        {
            printf("Invalid address %s\n", SERVERADDR);
            closesocket(my_sock);
            WSACleanup();
            return -1;
        }
    }
 
    // адрес сервера получен - пытаемся установить соединение
    if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
    {
        printf("Connect error %d\n", WSAGetLastError());
        return -1;
    }
 
    printf("Soedinenie s %s uspeshno ustanovlenno\n \
            Type quit for quit\n\n", SERVERADDR);
 
    // Шаг 4 - чтение и передача сообщений
    int nsize;
    while ((nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0)) != SOCKET_ERROR)
    {
        // ставим завершающий ноль в конце строки
        buff[nsize] = 0;
 
        // выводим на экран
        printf("S=>C:%s", buff);
 
        // читаем пользовательский ввод с клавиатуры
        printf("S<=C:"); fgets(&buff[0], sizeof(buff) - 1, stdin);
 
        // проверка на "quit"
        if (!strcmp(&buff[0], "quit\n"))
        {
            // Корректный выход
            printf("Exit...");
            closesocket(my_sock);
            WSACleanup();
            return 0;
        }
 
        // передаем строку клиента серверу
        send(my_sock, &buff[0], strlen(&buff[0]), 0);
    }
    printf("Recv error %d\n", WSAGetLastError());
    closesocket(my_sock);
    WSACleanup();
    return -1;
}
Вопрос:
1) Дома 2 компа. соединённые роутеров, на котором в свою очередь открыл порт. В общем дома на обоих компах клиент-сервер работает. А когда клиент со своим ip отправляю знакомому в другом городе, у него открывается но не конектит со мной.(Пробывал разным знакомым передавать файл из разных регионов.)

2) Вот на этом примере в клиенте когда что то печатаешь он отправляет серверу и получает автоматический ответ того что напечатал. Реально ли сделать так что бы клиент что то печатал и отправлял, а я с сервера допустим отвечал так же в ручную. Ну что то типа чата получается) Если да то что где на что поменять надо. Я мучался мучался но так и не допёр. в С++ разбираюсь плохо. Гугл молчит по этому поводу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.03.2011, 17:28
Ответы с готовыми решениями:

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

C++ tcp клиент
Здравствуйте, учусь создавать tcp соединения на С/С++. Программирую в Qt на linux mint. Создал консольный проект и пишу следующее#include...

tcp сервер клиент
как сделать так чтобы программа работала и на винде и на линуксе? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

12
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
14.03.2011, 19:30
Цитата Сообщение от mifeliz Посмотреть сообщение
#define SERVERADDR "*.*.*.*" //Звёздочками пометил свой IP
А вы какой IP-адрес здесь вписываете? Не тот, что присвоен вашему компьютеру в локальной сети?

И даже если здесь IP-адрес присвоенный вам в глобальной сети, то вы могли отключаться, пока суть да дело. В этом случае вы уверены, что он у вас статический? Это довольно редкое явление.

Лучше сделали бы для клиента что-нибудь типа этого:
C++
1
char SERVERADDR[100]; cout << "Input server address: "; cin >> SERVERADDR;
Ну, и сообщаете знакомому свой адрес (тот, что увидите на страничке myip.ru)
1
 Аватар для mifeliz
2 / 2 / 1
Регистрация: 18.01.2011
Сообщений: 35
14.03.2011, 19:52  [ТС]
Я вписывал свой статический выданный мне провайдером моим.
После замены на ваш код выскакивает ошибка.
C++
1
2
3
4
5
[CPP]1>.\client.cpp(9) : error C2143: синтаксическая ошибка: отсутствие ";" перед ">>"
1>.\client.cpp(9) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>Журнал построения был сохранен в "file://c:\Documents and Settings\MacroCD\Мои документы\projekt\client\client\Release\BuildLog.htm"
1>client - ошибок 4, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
[/CPP]
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
14.03.2011, 20:40
Это должно решить проблему
C++
1
2
#include <iostream>
using namespace std;
Такие вещи пора бы знать уже

Добавлено через 4 минуты
Подозреваю, что провайдер выдал вам адрес своего сервера (для настройки поключения к Интернет). Вы точно уверены в том, что вам провайдер выдал статический IP? Обычно за это дополнительную плату берут 50-100 руб в месяц.
Сравните то, что вам выдал провайдер с тем, что покажет myip.ru/
0
 Аватар для mifeliz
2 / 2 / 1
Регистрация: 18.01.2011
Сообщений: 35
14.03.2011, 20:41  [ТС]
Это я знаю. Но почему то не поменяло ситуацию.
Подозреваю, что провайдер выдал вам адрес своего сервера (для настройки поключения к Интернет). Вы точно уверены в том, что вам провайдер выдал статический IP? Обычно за это дополнительную плату берут 50-100 руб в месяц.
Сравните то, что вам выдал провайдер с тем, что покажет myip.ru/
Да. Я специально покупал. и плачу абонентскую плату.
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
15.03.2011, 00:56
а разве обычный сокет позволяет вот так вот "стрелять" через кучу промежуточных серверов и маршрутизаторов?

по-моему тут нужно уже вэб службы использовать.
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
15.03.2011, 01:20
А что такое по вашему сокет? Это же просто программный интерфейс для обмена данными между процессами, который в том числе поддерживает стек протоколов TCP/IP.
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
15.03.2011, 01:53
да, только при сложной адресации с промежуточными сетевыми экранами, а также прокси серверами, десятками подсетей, в заголовке пакета появляется куча дополнительной информации. а вот обрабатывается ли она автоматически системой в самом простом варианте, как например этот - это вопрос к мастдай.
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
15.03.2011, 11:11
Цитата Сообщение от resource2008 Посмотреть сообщение
да, только при сложной адресации с промежуточными сетевыми экранами, а также прокси серверами, десятками подсетей, в заголовке пакета появляется куча дополнительной информации. а вот обрабатывается ли она автоматически системой в самом простом варианте, как например этот - это вопрос к мастдай.
А при чем здесь уже это? Вы же в сообщении #6 о другом спрашивали. Но тем не менее, я же как то открываю в своем браузере веб-страницу этого сайта, находясь за 7 тыс. км. от сервера, где этот сайт расположен. И ничего, что добираясь до меня данные прошли несколько промежуточных серверов.
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
17.03.2011, 16:06
а по вашему вэб-клиент вот так просто это делает?
более того, если на сервере спросить айпи-адрес отправителя, то зачастую мы получаем ведь не конечный адрес, а всего-лишь адрес сервера провайдера. конечный адресат указывается дополнительно в заголовке пакета и направляется провайдером.

вводя адрес в браузере мы также не обязательно обращаемся непосредственно к серверу сервиса.

а о чем я спрашивал в 6 посте?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
17.03.2011, 19:51
Цитата Сообщение от resource2008 Посмотреть сообщение
...а о чем я спрашивал в 6 посте?
На мой взгляд в сообщении №6 вы не совсем корректно ставите вопрос. Но, насколько я понял вы там спрашивали о принципиальной возможности создания приложений, которые будут обмениваться данными через глобальную сеть, при помощи какой-либо библиотеки сокетов (сетевых)
Если вопрос стоит так, то ответ: Да, возможно. Для этого нужно выбрать сетевой протокол IP, транспортный TCP (UDP), правильно указать адрес узла и номер порта (ну, естественно, само приложение должно быть правильно написано). Кстати, а вы не думали, что при разработке сетевых служб тоже используют библиотеки сокетов?
Если же под сокетами вы подразумеваете точки доступа, то тоже ответ: Да.

Ну, а в следующих сообщениях вы стали уходить от темы сокетов и ставить под сомнение возможность пересылки данных между точками глобальной сети, котрые разделены несколькими маршрутизаторами.
0
 Аватар для resource2008
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
17.03.2011, 23:57
а разве обычный сокет позволяет вот так вот "стрелять" через кучу промежуточных серверов и маршрутизаторов?
дальше попытка разъяснить непонятный встречный вопрос (некорректный).
Цитата Сообщение от resource2008 Посмотреть сообщение
в заголовке пакета появляется куча дополнительной информации. а вот обрабатывается ли она автоматически системой в самом простом варианте
Цитата Сообщение от bigredcat Посмотреть сообщение
пересылки данных между точками глобальной сети, котрые разделены несколькими маршрутизаторами
чем дальше в лес - тем толще партизаны

Цитата Сообщение от bigredcat Посмотреть сообщение
Ну, а в следующих сообщениях вы стали уходить от темы сокетов и ставить под сомнение возможность пересылки данных между точками глобальной сети
Цитата Сообщение от bigredcat Посмотреть сообщение
Кстати, а вы не думали, что при разработке сетевых служб тоже используют библиотеки сокетов?
конечно нет, глобальная сеть ведь не использует сокеты. а вы разве не знали???

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


тема "TCP клиент", вопрос:
Цитата Сообщение от mifeliz Посмотреть сообщение
В общем дома на обоих компах клиент-сервер работает. А когда клиент со своим ip отправляю знакомому в другом городе, у него открывается но не конектит со мной.
значит сокет создается, и судя по посту автора отправляет данные.
наверное пакет не доходит до адресата? "на деревню дедушке"? может маска посети отличается (на достаточно много)?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
18.03.2011, 09:33
Цитата Сообщение от resource2008 Посмотреть сообщение
конечно - данные в глобальной сети передать нельзя. это как на солнце фонариком светить - оно до тебя доходит, а ты до него - нет.
Занятная метафора.

Короче, не хочу вести бесполезный спор.
Прочтите на досуге Windows Sockets 2. И вот еще до кучи Request for Comments (RFC)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2011, 09:33

tcp сервер-клиент
Есть 2 проекта: в одном server.cpp, а в другом client.cpp. Что у меня не правильно, следующие ошибки: 1&gt;LINK : warning LNK4067:...

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/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 сервер, поддерживающий соединения с несколькими клиентами. Сервер должен принимать...

С++ клиент и C# TCP сервер
Есть TCP C# сервер, необходимо сделать C++ клиента, который может соединится с C# tcp сервером и отправит какой нибудь пакет. Возможно ли...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru