Можно ли изменить тип сокета с UDP на TCP после создания указанного сокета?
int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);
В зависимости от дополнительной информации я хочу переключить созданный сокет sockfd_udp
с UDP на TCP. Я понимаю, что это не предназначено для выполнения, но я ищу способ обойти эту проблему.
Также можно создать новый сокет (sockfd_tcp
) и закрыть старый (sockfd_udp
), но в этом случае новый сокет должен иметь тот же файловый дескриптор, что и старый сокет (sockfd_tcp = sockfd_udp
).
Попробуйте следующее:
int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);
...
int sockfd_tcp = socket(AF_INET, SOCK_STREAM, 0);
dup2(sockfd_tcp, sockfd_udp);
close(sockfd_tcp);
sockfd_tcp = sockfd_udp;
dup2 () закроет сокет UDP, если он все еще открыт. После вызова базовый TCP-сокет имеет два файловых дескриптора: sockfd_tcp и sockfd_udp. Оставьте желаемый, а другой закройте.
Добавьте необходимую проверку ошибок, потому что эти вызовы могут завершиться ошибкой.
См. страница руководства по дублированию для получения дополнительной информации.