Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 1
Регистрация: 08.09.2014
Сообщений: 110
1

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

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

Author24 — интернет-сервис помощи студентам
Привет всем, прошу помощи в реализации Клиент-серверного чата 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2016, 18:46
Ответы с готовыми решениями:

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

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

Сокеты, Клиент-серверный чат
Здравствуйте. Мне нужно создать чат. Чтобы был в одном Jframe. Есть проблемы. Прога не видит...

Клиент-серверный чат через сокеты
Здравствуйте. Такой вопрос. Есть допустим у меня два приложения(клиент и сервер). Всё сделано через...

0
02.10.2016, 18:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2016, 18:46
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru