8-mine commented

This commit is contained in:
2025-12-11 09:40:07 +07:00
parent eabaaf83f1
commit 58f2fb3fe7
2 changed files with 53 additions and 44 deletions

View File

@@ -1,11 +1,11 @@
// client_udp.c
// UDPклиент: читает файл и отправляет его содержимое серверу блоками UDP.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h> // inet_pton, sockaddr_in [web:74]
#include <arpa/inet.h> // inet_pton, sockaddr_in
#include <sys/socket.h>
#include <sys/types.h>
@@ -13,6 +13,7 @@
#define END_MARKER "END_OF_TRANSMISSION"
int main(int argc, char *argv[]) {
// argv[1] — IP сервера, argv[2] — порт, argv[3] — входной файл.
if (argc < 4) {
fprintf(stderr,
"Usage: %s <server_ip> <server_port> <input_file>\n",
@@ -27,6 +28,7 @@ int main(int argc, char *argv[]) {
const char *server_port = argv[2];
const char *input_path = argv[3];
// Разбираем номер порта.
char *endptr = NULL;
errno = 0;
long port_long = strtol(server_port, &endptr, 10);
@@ -43,6 +45,7 @@ int main(int argc, char *argv[]) {
return -1;
}
// Создаём UDPсокет.
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
@@ -50,11 +53,13 @@ int main(int argc, char *argv[]) {
return -1;
}
// Заполняем адрес сервера: IPv4 + порт.
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
// inet_pton конвертирует строку IP ("127.0.0.1") в бинарный вид.
if (inet_pton(AF_INET, server_ip, &servaddr.sin_addr) != 1) {
fprintf(stderr, "ERROR: invalid IP address '%s'\n", server_ip);
close(sockfd);
@@ -64,6 +69,7 @@ int main(int argc, char *argv[]) {
char buf[BUF_SIZE];
// Читаем файл блоками и каждый блок отправляем одной UDPдатаграммой.
for (;;) {
size_t n = fread(buf, 1, sizeof(buf), fin);
if (n > 0) {
@@ -81,6 +87,7 @@ int main(int argc, char *argv[]) {
}
}
// Если прочитали меньше, чем размер буфера — это EOF или ошибка.
if (n < sizeof(buf)) {
if (ferror(fin)) {
perror("fread");
@@ -88,7 +95,7 @@ int main(int argc, char *argv[]) {
fclose(fin);
return -1;
}
break;
break; // EOF.
}
}
@@ -96,6 +103,7 @@ int main(int argc, char *argv[]) {
perror("fclose(input_file)");
}
// Отправляем серверу маркер конца передачи.
ssize_t sent = sendto(sockfd,
END_MARKER,
strlen(END_MARKER),