linux - 创建后将 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
。
解决方案
尝试以下操作:
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 的手册页。
推荐阅读
- javascript - 每个新的 SAPUI5 项目都显示一个空白页
- javascript - 尝试将数据存储到 Firestore 时遇到错误
- rest - 为禁止访问正确建模 RESTful 资源
- django - 如果列数太多,我应该将表除以 OneToOneField 吗?
- java - Spring Boot 2.1.8 带有 SAML InResponseToField 的响应与发送的消息不对应
- python - 训练/验证/测试分割时间 LSTM
- chromium - 使用 Puppeteer 在新页面上运行 JS
- postgresql - Postgresql insert 的表达式比 target 多
- c++ - SDL2 - SDL_PollEvent 在 Ubuntu/Mac OS X 上比 Windows 慢
- reactjs - 如何在 React.js 中访问另一个组件中一个组件的状态变量或 let、const、var 变量?