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

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

Восстановить пароль Регистрация
 
unlimeted
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 26
02.10.2016, 18:46     Клиент-серверный чат на C++ с использованием WinSock #1
Привет всем, прошу помощи в реализации Клиент-серверного чата 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2016, 18:46     Клиент-серверный чат на C++ с использованием WinSock
Посмотрите здесь:

C++ winsock. ip
C++ Модификатор FAR (WinSock)
C++ WinSock tcp client/server
Winsock. Recv с ошибкой 10053(WSAECONNABORTED) C++
Многопоточный чат с использованием пула потоков C++
Winsock C++ клиент - сервер C++
Winsock - UDP вместо ТСР C++
C++ Winsock.h ругается на ssleay32.dll

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 18:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru