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

Posted

技术标签:

【中文标题】创建后将 POSIX 套接字的类型从 UDP 更改为 TCP【英文标题】:Change the type of a POSIX socket from UDP to TCP after creation 【发布时间】:2019-01-17 20:44:51 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于创建后将 POSIX 套接字的类型从 UDP 更改为 TCP的主要内容,如果未能解决你的问题,请参考以下文章

TCP/UDP套接字网络协议

node.js中通过dgram数据报模块创建UDP服务器和客户端

python:UDP网络程序与总结

重新绑定 UDP 套接字

Python 非阻塞套接字和可靠的 UDP

未连接的 UDP 套接字上的 WSARecvFrom 不返回