20 std::cout <<
"ClientSocket constructor" << std::endl;
24 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
25 std::cout <<
"WSAStartup failed: " << WSAGetLastError() << std::endl;
26 throw std::runtime_error(
"Failed to initialize Winsock");
28 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
29 if (sockfd == INVALID_SOCKET) {
30 std::cout <<
"Error at socket(): " << WSAGetLastError() << std::endl;
32 throw std::runtime_error(
"Failed to create socket");
34 #elif defined(__unix__
) || defined(__unix__
) || defined(__APPLE__) && defined(__MACH__)
35 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
37 std::cout <<
"Error sockfd < 0 sockfd : " <<
sockfd << std::endl;
38 throw std::runtime_error(
"Failed to create socket");
42 timeout = std::make_unique<
struct timeval>();
50 std::cout <<
"Socket created successfully (fd: " <<
sockfd <<
")" << std::endl;
61 #elif defined(__unix__
) || defined(__unix__
) || defined(__APPLE__) && defined(__MACH__)
79 if (inet_pton(AF_INET, ip.c_str(), &
serv_addr.sin_addr) <= 0) {
115 char *buffer =
static_cast<
char *>(malloc(
sizeof(SplitPacket)));
116 memset(buffer, 0,
sizeof(SplitPacket));
118 memcpy(buffer, packet,
sizeof(SplitPacket));
119 if (sendto(
sockfd,
reinterpret_cast<
const char *>(buffer),
sizeof(SplitPacket), 0, (
struct sockaddr *)&dest,
121 throw std::runtime_error(
"Failed to send packet");
134 SplitPacket splitPacket{};
135 struct sockaddr_in cli_addr {
137 timeval receveidTime{};
138 socklen_t len =
sizeof(cli_addr);
139 char *buffer =
static_cast<
char *>(malloc(
sizeof(SplitPacket)));
140 memset(buffer, 0,
sizeof(SplitPacket));
141 if (select(sockfd + 1, &_readfds,
nullptr,
nullptr, timeout.get()) > 0) {
142 if (recvfrom(
sockfd, buffer,
sizeof(SplitPacket), 0, (
struct sockaddr *)&cli_addr, &len) < 0) {
143 throw std::runtime_error(
"Failed to read from socket");
151 memcpy(&splitPacket, buffer,
sizeof(SplitPacket));
153 gettimeofday(&receveidTime,
nullptr);
154 _packetBuffer.emplace_back(std::make_unique<SplitPacket>(splitPacket), receveidTime);
166 std::unique_ptr<Packet> packet = std::make_unique<Packet>();
168 long long int size = 0;
169 std::unique_ptr<
struct timeval> currentTime = std::make_unique<
struct timeval>();
170 std::unique_ptr<
struct timeval> diffTime = std::make_unique<
struct timeval>();
172 auto it2 = _packetBuffer.begin();
173 while (it2 != _packetBuffer.end()) {
174 auto &[splitPacketInBuffer, receveidTimeInBuffer] = *it2;
175 if (splitPacketInBuffer->packet_id == 0 && splitPacketInBuffer->max_packet_id == 0) {
176 packet->code = splitPacketInBuffer->code;
177 packet->data_size = splitPacketInBuffer->max_packet_id * 1024;
178 if (packet->data_size == 0) {
179 packet->data_size = 1024;
181 packet->data = malloc(packet->data_size);
182 memcpy(packet->data, splitPacketInBuffer->data, packet->data_size);
183 it2 = _packetBuffer.erase(it2);
186 if (splitPacketInBuffer->packet_id == counter) {
187 size += strlen(splitPacketInBuffer->data);
189 if (counter == splitPacketInBuffer->max_packet_id) {
190 packet->code = splitPacketInBuffer->code;
191 packet->data_size = size;
192 packet->data = malloc(packet->data_size);
193 memset(packet->data, 0, packet->data_size);
194 int counterAssign = 0;
195 auto it = _packetBuffer.begin();
196 while (it != _packetBuffer.end()) {
197 auto &[splitPacketInBufferAssign, receveidTimeInBufferAssign] = *it;
198 if (splitPacketInBufferAssign->packet_id == counterAssign) {
199 memcpy((
char *)packet->data + counterAssign * 1024, splitPacketInBufferAssign->data,
200 strlen(splitPacketInBufferAssign->data));
201 it = _packetBuffer.erase(it);
217 auto it = _packetBuffer.begin();
218 while (it != _packetBuffer.end()) {
219 auto &[splitPacketInBuffer, receveidTimeInBuffer] = *it;
220 gettimeofday(currentTime.get(),
nullptr);
221 timersub(currentTime.get(), &receveidTimeInBuffer, diffTime.get());
222 if (diffTime->tv_sec > 0 || diffTime->tv_usec > 100000) {
223 it = _packetBuffer.erase(it);
239 std::unique_ptr<Packet> packet = getPacketFromBuffer();
240 if (packet !=
nullptr) {
241 return std::make_tuple(std::move(packet), 0);
243 return std::make_tuple(
nullptr, 0);
311 void ClientSocket::read_input()
315 std::getline(std::cin, message);
317 std::lock_guard<std::mutex> lock(mtx);
330 std::cout <<
"ClientSocket run" << std::endl;
332 std::tuple<std::unique_ptr<Packet>,
int> packet_client_id;
334 std::unique_ptr<Packet> packet;
337 inputThread = std::thread(&ClientSocket::read_input,
this);
343 std::lock_guard<std::mutex> lock(mtx);
344 if (!input.empty()) {
349 if (!message.empty()) {
350 std::unique_ptr<Packet> packet = std::make_unique<Packet>();
351 packet->code = MESSAGE;
352 packet->data_size = message.size();
353 packet->data = malloc(packet->data_size);
354 memcpy(packet->data, message.c_str(), packet->data_size);
355 send(packet.get(), serv_addr);
357 if (FD_ISSET(sockfd, &_readfds)) {
358 if (select(sockfd + 1, &_readfds,
nullptr,
nullptr, timeout.get()) > 0) {
365 #elif defined(__unix__
) || defined(__unix__
) || defined(__APPLE__) && defined(__MACH__)
369 if (lastMessage ==
"exit") {
383 std::cout <<
"listen_server" << std::endl;
384 int action = select(FD_SETSIZE, &_readfds,
nullptr,
nullptr,
nullptr);
385 std::cout <<
"action: " << action << std::endl;
387 throw std::runtime_error(
"Error: select failed");
388 }
else if (action == 0) {
389 throw std::runtime_error(
"Error: select timeout");
391 std::cout <<
"FD_ISSET(STDIN_FILENO, &_readfds): " << FD_ISSET(0, &_readfds) << std::endl;
392 if (FD_ISSET(0, &_readfds)) {
394 if (!std::getline(std::cin, message)) {
396 return std::make_tuple(
nullptr, 0);
398 std::unique_ptr<Packet> packet = std::make_unique<Packet>();
399 packet->code = MESSAGE;
400 packet->data_size = message.size();
401 packet->data = malloc(packet->data_size);
402 memcpy(packet->data, message.c_str(), packet->data_size);
403 send(packet.get(), serv_addr);
405 if (FD_ISSET(
sockfd, &_readfds)) {
409 return std::make_tuple(
nullptr, 0);
420 FD_SET(0, &_readfds);
422 FD_SET(
sockfd, &_readfds);
453 std::unique_ptr<SplitPacket> splitPacket = std::make_unique<SplitPacket>();
454 splitPacket->code = packet->code;
458 splitPacket->packet_id = 0;
459 splitPacket->max_packet_id = 0;
460 splitPacket->data[0] =
'\0';
461 memset(splitPacket->data, 0, 1024);
462 memcpy(splitPacket->data, packet->data, packet->data_size);
463 sendPacket(splitPacket.get(), dest);
465 splitPacket->max_packet_id = packet->data_size / 1024 + 1;
467 splitPacket->packet_id = i;
468 memset(splitPacket->data, 0, 1024);
469 memcpy(splitPacket->data, (
char *)packet->data + i * 1024, 1024);
470 sendPacket(splitPacket.get(), dest);
474 splitPacket->packet_id = i;
475 memset(splitPacket->data, 0, 1024);
476 memcpy(splitPacket->data, (
char *)packet->data + i * 1024 + 1, rest);
477 sendPacket(splitPacket.get(), dest);