创建套接字后,是否可以将套接字的类型从UDP更改为TCP?
int sockfd_udp = socket(AF_INET, SOCK_DGRAM, 0);
根据其他信息,我想将创建的套接字sockfd_udp
从UDP切换到TCP。我知道这不是要完成的,但我正在寻找解决此问题的方法。
创建新套接字(sockfd_tcp
)和关闭旧套接字(sockfd_udp
)也是一种选择,但是在这种情况下,新套接字必须具有与套接字相同的文件描述符。旧套接字(sockfd_tcp = sockfd_udp
)。
答案 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。