创建后将 POSIX 套接字的类型从 UDP 更改为 TCP

Change the type of a POSIX socket from UDP to TCP after creation

是否可以在创建所述套接字后将套接字类型从 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。留下想要的一个,关闭另一个。

添加必要的错误检查,因为这些调用可能会失败。

有关详细信息,请参阅 man page of dup