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

时间:2018-08-10 09:16:32

标签: linux sockets tcp udp posix

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

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

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

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

1 个答案:

答案 0 :(得分:1)

尝试以下操作:

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