创建后将 POSIX 套接字的类型从 UDP 更改为 TCP
Change the type of a POSIX socket from UDP to TCP after creation
是否可以在创建所述套接字后将套接字类型从 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;
dup2() 将关闭 UDP 套接字(如果它仍处于打开状态)。调用后底层 TCP 套接字有两个文件描述符:sockfd_tcp 和 sockfd_udp。留下想要的一个,关闭另一个。
添加必要的错误检查,因为这些调用可能会失败。
有关详细信息,请参阅 man page of dup。
是否可以在创建所述套接字后将套接字类型从 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;
dup2() 将关闭 UDP 套接字(如果它仍处于打开状态)。调用后底层 TCP 套接字有两个文件描述符:sockfd_tcp 和 sockfd_udp。留下想要的一个,关闭另一个。
添加必要的错误检查,因为这些调用可能会失败。
有关详细信息,请参阅 man page of dup。