Вы можете сделать это абсолютно.Например, libc делает это:
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
ssize_t sendto(int sockfd, const void *buf, size_t len, ...);
Эти функции могут принимать дескриптор сокета в качестве первого аргумента.
Замечание к вашему коду: перед return
не забудьте close(fd)
.
Рекомендуется аккуратно разделить функции, которые создают, используют и закрывают дескриптор файла.