Клиент-серверный чат на C++ с использованием WinSock
02.10.2016, 18:46. Показов 4015. Ответов 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
|