Закрытие сокета UDP при использовании неблокирующего ввода-вывода - PullRequest
0 голосов
/ 01 февраля 2020

Следующий код открывает сокет, устанавливает его как неблокирующий и отправляет по нему некоторые данные, используя UDP, а затем закрывает сокет:

int fd = socket(PF_INET, SOCK_DGRAM, 0);
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
sendto(fd, str.c_str(), str.length(), 0,
     (struct sockaddr*)&addr, sizeof(addr));
close(fd);

Есть ли проблемы, связанные с закрытием дескриптора файла как только вызов sendto () завершится, учитывая, что он не блокируется?

Меня также интересуют какие-либо соображения безопасности потоков при одновременном выполнении вышеуказанного в нескольких потоках?

1 Ответ

3 голосов
/ 01 февраля 2020

Есть ли какие-либо проблемы, связанные с закрытием дескриптора файла, как только завершится вызов sendto (), учитывая, что он не блокируется?

Нет проблем - один раз sendto() вернулось (с возвращаемым значением, не содержащим ошибок), ваши данные были скопированы в системный буфер и могут рассматриваться как «отправленные». Закрытие сокета не помешает выходу данных.

Меня также интересуют соображения безопасности потоков при одновременном выполнении вышеизложенного в нескольких потоках?

Там также нет проблем - поскольку обмен данными между потоками невозможен, условия гонки невозможны.

...