|
32 | 32 |
|
33 | 33 | namespace fs = std::filesystem;
|
34 | 34 |
|
| 35 | +static constexpr size_t RPC_IO_CHUNK = 1024ull * 1024ull * 1024ull; // 1 GiB |
| 36 | + |
35 | 37 | #ifdef _WIN32
|
36 | 38 | typedef SOCKET sockfd_t;
|
37 | 39 | using ssize_t = __int64;
|
@@ -323,27 +325,43 @@ static std::shared_ptr<socket_t> create_server_socket(const char * host, int por
|
323 | 325 | static bool send_data(sockfd_t sockfd, const void * data, size_t size) {
|
324 | 326 | size_t bytes_sent = 0;
|
325 | 327 | while (bytes_sent < size) {
|
326 |
| - ssize_t n = send(sockfd, (const char *)data + bytes_sent, size - bytes_sent, 0); |
| 328 | + size_t size_to_send = size - bytes_sent; |
| 329 | + if (size_to_send > RPC_IO_CHUNK) size_to_send = RPC_IO_CHUNK; |
| 330 | + ssize_t n = send(sockfd, (const char *)data + bytes_sent, size_to_send, 0); |
327 | 331 | if (n < 0) {
|
| 332 | +#ifndef _WIN32 |
| 333 | + perror("send"); |
| 334 | +#else |
| 335 | + fprintf(stderr, "send failed (bytes_sent=%zu, size_to_send=%zu)\n", bytes_sent, size_to_send); |
| 336 | +#endif |
328 | 337 | return false;
|
329 | 338 | }
|
330 | 339 | bytes_sent += n;
|
331 | 340 | }
|
332 | 341 | return true;
|
333 | 342 | }
|
334 | 343 |
|
| 344 | + |
335 | 345 | static bool recv_data(sockfd_t sockfd, void * data, size_t size) {
|
336 | 346 | size_t bytes_recv = 0;
|
337 | 347 | while (bytes_recv < size) {
|
338 |
| - ssize_t n = recv(sockfd, (char *)data + bytes_recv, size - bytes_recv, 0); |
| 348 | + size_t size_to_recv = size - bytes_recv; |
| 349 | + if (size_to_recv > RPC_IO_CHUNK) size_to_recv = RPC_IO_CHUNK; |
| 350 | + ssize_t n = recv(sockfd, (char *)data + bytes_recv, size_to_recv, 0); |
339 | 351 | if (n <= 0) {
|
| 352 | +#ifndef _WIN32 |
| 353 | + perror("recv"); |
| 354 | +#else |
| 355 | + fprintf(stderr, "recv failed (bytes_recv=%zu, size_to_recv=%zu)\n", bytes_recv, size_to_recv); |
| 356 | +#endif |
340 | 357 | return false;
|
341 | 358 | }
|
342 | 359 | bytes_recv += n;
|
343 | 360 | }
|
344 | 361 | return true;
|
345 | 362 | }
|
346 | 363 |
|
| 364 | + |
347 | 365 | static bool send_msg(sockfd_t sockfd, const void * msg, size_t msg_size) {
|
348 | 366 | if (!send_data(sockfd, &msg_size, sizeof(msg_size))) {
|
349 | 367 | return false;
|
|
0 commit comments