Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
unlimeted
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 32
#1

Клиент-серверный чат на C++ с использованием WinSock - C++

02.10.2016, 18:46. Просмотров 233. Ответов 0
Метки нет (Все метки)

Привет всем, прошу помощи в реализации Клиент-серверного чата C++, такое дело есть сервер который с "слушает подключения " и создает новый поток под каждого клиента отправляя любое сообщения всем клиентам, так вот вроде все нормально, сообщения принимаются и отправляются, но при отключении какого либо клиента сервер зацикливается, не пойму в чем дела, выкладываю коды сервера и клиента:
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
// Server
 
#include <iostream>
#include <windows.h>
#include <winsock.h>
#pragma comment (lib, "ws2_32.lib")
 
void getWord(char *mas);
void SendMessageToClient(int ID);
int ClientCount = 0;
SOCKET *Connections;
using namespace std;
 
int main()
{
    system("chcp < nul 1251");
 
    cout << "Server: " << endl;
 
    char message[MAX_PATH];
    char *m_connect = "Сообщение от сервера : Вы подключились к серверуe.";
 
    WSAData wsa;
    WORD Version = MAKEWORD(2, 1);
    WSAStartup(Version, &wsa);
    Connections = (SOCKET*)calloc(64, sizeof(SOCKET));
 
    if (WSAStartup(Version, &wsa) != 0)
    {
 
        cout << "WSA library startup error." << endl;
 
    }
    else
    {
 
        cout << "WSA library startup complite." << endl;
 
    }
 
    SOCKET Listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKET Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (Listen == SOCKET_ERROR || Connect == SOCKET_ERROR)
    {
 
        cout << "Ошибка создания сокета" << endl;
 
    }
    else
    {
        cout << "Сокет создан" << endl;
 
    }
 
    SOCKADDR_IN Server;
 
    Server.sin_family = AF_INET;
    Server.sin_port = htons(1337);
    Server.sin_addr.s_addr = INADDR_ANY; 
 
    
    if (bind(Listen, (SOCKADDR*)&Server, sizeof(Server)) == SOCKET_ERROR)
    {
 
        cout << "Ошибка соединение" << endl;
 
    }
    else
    {
 
        cout << "Сервер активен" << endl;
 
    }
 
    listen(Listen, SOMAXCONN);
 
    while (true)
 
    {
 
        if (Connect = accept(Listen, NULL, NULL))
        {
 
            cout << "Подключен клиент" << endl;
            
            Connections[ClientCount] = Connect;
            send(Connections[ClientCount], m_connect, strlen(m_connect), NULL);
 
            recv(Connect, message, sizeof(message), 0);
            ClientCount++;
        
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)SendMessageToClient, (LPVOID)(ClientCount-1), NULL, NULL);
 
 
 
        }
 
 
 
    }
 
 
}
 
}
 
void getWord(char *mas)
{
    int c;
    for (int i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
        mas[i] = c;
}
 
void SendMessageToClient(int ID)
{
    char *buffer = new char[1024];
    char buffer[MAX_PATH];
    for (;; Sleep(75))
 
    {
 
        if (recv(Connections[ID], buffer, MAX_PATH, NULL))
        {
            printf("Сообщение: %s", buffer);
            printf("\n");
            for (int i = 0; i <= ClientCount; ++i)
            {
                send(Connections[i], buffer, MAX_PATH, NULL);
            }
        }
        ZeroMemory(buffer, sizeof(buffer));
    }
 
}
Client:

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
#include <iostream>
#include <windows.h>
#include <winsock.h>
#include <pthread.h>
 
#pragma comment (lib, "ws2_32.lib")
 
using  std::cout;
using  std::cin;
using  std::endl;
SOCKET Connect;
 
void getWord(char *mas);
 
void RecvToClient()
{
    //char *buffer = new char[1024];
    char *buffer = new char[1024];
    for (;; Sleep(75))
        //while(true)
    {
        memset(buffer, 0, sizeof(buffer));
        if (recv(Connect, buffer, 1024, NULL))
        {
            printf("Сообщение: %s", buffer);
            printf("\n");
            
        }
    }
 
}
 
 
int main()
{
 
    system("chcp < nul 1251");
    cout << "Client: " << endl;
 
    char ip[15];
    u_short port;
    //  char message[MAX_PATH];
    
    cout << "IP: ";
    cin >> ip;
    cout << endl;
 
    cout << "Port: ";
    cin >> port;
    cout << endl;
    
    
    char message[MAX_PATH];
    
    WSAData wsa;
    WORD Version = MAKEWORD(2, 1);
 
    WSAStartup(Version, &wsa);
 
    if (WSAStartup(Version, &wsa) != 0)
    {
 
    cout << "Can't load WSA library." << endl;
 
    }
    else
    {
 
    cout << "WSA library load complite" << endl;
 
    }
 
     Connect = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (Connect == SOCKET_ERROR)
    {
 
    cout << "Ошибка создания сокета" << endl;
 
    }
    else
    {
 
    cout << "Сокет создан" << endl;
 
    }
 
    SOCKADDR_IN Client;
 
    Client.sin_family = AF_INET;
    Client.sin_port = htons(port);
    Client.sin_addr.s_addr = inet_addr(ip);
 
    while (1) // !!!
    {
 
    if (connect(Connect, (SOCKADDR*)&Client, sizeof(Client)))
    {
 
    cout << "Подключен к серверу" << endl;
 
    send(Connect, "Сообщение от клиента: Подключен клиент.", MAX_PATH, 0);
 
    recv(Connect, message, sizeof(message), 0);
 
    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)RecvToClient, NULL, NULL, NULL);
    break;
 
    }
 
    }
 
    cout << message << endl;
 
    ZeroMemory(message, sizeof(message));
 
    while (1)
    {
 
    cout << "Введите сообщение серверу" << endl;
    getWord(message);
    send(Connect, message, MAX_PATH, 0);
    ZeroMemory(message, sizeof(message));
    }
 
    
    closesocket(Connect);
    WSACleanup();
    system("pause");
 
    return 0;
 
}
 
void getWord(char *mas)
{
    int c;
    for (int i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
        mas[i] = c;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2016, 18:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Клиент-серверный чат на C++ с использованием WinSock (C++):

Winsock C++ клиент - сервер - C++
#include &lt;winsock2.h&gt; // сервер #include &lt;iostream&gt; using namespace std; int main(){ // инициализация winsock WSADATA...

Клиент на WinSock и ошибка LNK1120 - C++
Добрый день. Вчера я обращался к форумчанам за помощью в сборке сервера. Теперь пытаюсь собрать клиент по примеру всё того же самоучителя...

Многопоточный чат с использованием пула потоков - C++
есть вопрос как реализовать можно чат с использованием пулов потоков.Без пула все понятно на каждого клиента создается поток и потоки висят...

Клиент-серверный чат - C++
Когда клиент пытается принять сообщение о сервера он слушает порт 1) порт свой или сервера? 2) если свой, то на какой порт сервер...

Клиент-серверный чат - Java Сети
Добрый день! Java нечто новое для меня. Нашла интересную статью, где реализовано клиент-серверное приложение в виде: клиент отправляет...

Клиент-серверный чат придерживаясь MVC - Java SE
Собираюсь написать клиент-серверный чат придерживаясь MVC. В базе будет храниться логин пароль и история сообщений. Подскажите что точно...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2016, 18:46
Привет! Вот еще темы с ответами:

.NET 3.x Реализовать клиент-серверный чат (консольная версия) - C#
Реализовать клиент-серверный чат (консольная версия) со следующими возможностями: • При подключении к серверу клиент получает...

Клиент-серверный алгоритм - Алгоритмы
Привет. Вот такая задачка имеется : ​​есть кучка скриптов , которые представляют собой одно целое , и сервер. Эти скрипты должны отправлять...

1C 8.x (тонкий) 8.3 клиент серверный вариант - 1С
Подскажите пожалуйста, что мне необходимо иметь (купить), что бы настроить работу 1с в клиент-серверном режиме. База будет работать под 8.3.

Клиент-серверный проект-парсер сайтов - Web-серверы
Нужно реализовать клиент-серверный проект, где сервер содержит роботов-парсеров, которые &quot;дёргаются&quot; раз в определённый промежуток времени,...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru