-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient_grp.cpp
More file actions
106 lines (85 loc) · 3.24 KB
/
Copy pathclient_grp.cpp
File metadata and controls
106 lines (85 loc) · 3.24 KB
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
// Client-side implementation in C++ for a chat server with private messages and group messaging
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <arpa/inet.h>
#define BUFFER_SIZE 1024
std::mutex cout_mutex;
void handle_server_messages(int server_socket) {
char buffer[BUFFER_SIZE];
while (true) {
memset(buffer, 0, BUFFER_SIZE);
int bytes_received = recv(server_socket, buffer, BUFFER_SIZE, 0);
if (bytes_received <= 0) {
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << "Disconnected from server." << std::endl;
close(server_socket);
exit(0);
}
std::lock_guard<std::mutex> lock(cout_mutex);
std::cout << buffer << std::endl;
}
}
int main() {
int client_socket;
sockaddr_in server_address{};
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
std::cerr << "Error creating socket." << std::endl;
return 1;
}
server_address.sin_family = AF_INET;
server_address.sin_port = htons(12345);
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(client_socket, (sockaddr*)&server_address, sizeof(server_address)) < 0) {
std::cerr << "Error connecting to server." << std::endl;
return 1;
}
std::cout << "Connected to the server." << std::endl;
// Authentication
std::string username, password;
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
recv(client_socket, buffer, BUFFER_SIZE, 0); // Receive the message "Enter the user name" for the server
// You should have a line like this in the server.cpp code: send_message(client_socket, "Enter username: ");
std::cout << buffer;
std::getline(std::cin, username);
send(client_socket, username.c_str(), username.size(), 0);
memset(buffer, 0, BUFFER_SIZE);
recv(client_socket, buffer, BUFFER_SIZE, 0); // Receive the message "Enter the password" for the server
std::cout << buffer;
std::getline(std::cin, password);
send(client_socket, password.c_str(), password.size(), 0);
memset(buffer, 0, BUFFER_SIZE);
// Depending on whether the authentication passes or not, receive the message "Authentication Failed" or "Welcome to the server"
recv(client_socket, buffer, BUFFER_SIZE, 0);
std::cout << buffer << std::endl;
if (std::string(buffer).find("Authentication failed") != std::string::npos) {
close(client_socket);
return 1;
}
// Start thread for receiving messages from server
std::thread receive_thread(handle_server_messages, client_socket);
// We use detach because we want this thread to run in the background while the main thread continues running
receive_thread.detach();
// Send messages to the server
while (true) {
std::string message;
std::getline(std::cin, message);
if (message.empty()) continue;
send(client_socket, message.c_str(), message.size(), 0);
if (message == "/exit") {
close(client_socket);
break;
}
}
return 0;
}