Я создал эхо-сервер под UDP и работаю над клиентом, который разбивает данный файл на пакеты и передает его на сервер, который затем возвращает пакеты для повторной сборки клиентом.
Отправка отдельных пакетов работает нормально. Однако я пытаюсь использовать параметр сокета UDP_CORK для передачи как можно большего количества частей файла в одном пакете. Я работаю со следующим кодом:
#define LINE_SIZE 80
...
// s = socket descriptor.
...
int one = 1;
int zero = 0;
setsockopt(s, IPPROTO_UDP, UDP_CORK, &one, sizeof(one)); // cork
/* Send to server, receive from server, write to new file. */
FILE *orig, *copy;
char line[LINE_SIZE];
if ((orig = fopen(input + 3, "rb")) == NULL) // original file
print_error(input);
if ((copy = fopen(filename, "wb")) == NULL) // copy of file
print_error("fopen");
while (fread(line, sizeof(char), LINE_SIZE, orig) > 0) {
if (sendto(s, line, LINE_SIZE, 0, (struct sockaddr *)&srv, len) == -1)
print_error("sendto");
}
setsockopt(s, IPPROTO_UDP, UDP_CORK, &zero, sizeof(zero)); // uncork
if (recvfrom(s, line, LINE_SIZE, 0, (struct sockaddr *)&srv, &len) == -1)
print_error("recvfrom");
fwrite(line, sizeof(char), LINE_SIZE, copy);
Сервер указывает, что он получает только один пакет «нормального размера», а не заглушенный пакет, который мне хотелось бы. Из этого следует, что он отправляет обратно только один нормальный пакет, полученный клиентом через вызов recvfrom().
Я не уверен, что правильно настроил UDP_CORK. Верен ли второй аргумент? Я не знаком с тем, что на самом деле означает второй вариант, поскольку справочная страница не совсем ясна. Также возможно, что я неправильно понимаю, как работает пробка.
Несколько замечаний:
- Я считаю себя программистом среднего уровня, но у меня мало опыта сетевого программирования.
- Я понимаю, что UDP не лучший вариант для передачи файлов. Со временем это будет адаптировано к другому протоколу, который я помогаю разрабатывать.
Благодарю вас!