首页 > 解决方案 > 创建后将 POSIX 套接字的类型从 UDP 更改为 TCP

问题描述

创建所述套接字后,是否可以将套接字的类型从 UDP 更改为 TCP?

int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);

根据其他信息,我想将创建的套接字sockfd_udp从 UDP 切换到 TCP。我知道这不是打算完成的,但我正在寻找解决此问题的方法。

sockfd_tcp创建新套接字 ( ) 并关闭旧套接字 ( )也是一种选择sockfd_udp,但在这种情况下,新套接字需要与旧套接字 ( ) 具有相同的文件描述符sockfd_tcp = sockfd_udp

标签: linuxsocketstcpudpposix

解决方案


尝试以下操作:

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;

如果 UDP 套接字仍然打开,dup2() 将关闭它。调用后底层 TCP 套接字有两个文件描述符:sockfd_tcp 和 sockfd_udp。保留想要的,关闭另一个。

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

有关更多信息,请参见dup 的手册页。


推荐阅读