我的网络不是很好,但试图解决这个问题。
是否可以通过UDP接收数据,然后通过TCP将其发送到另一台服务器?
所以会是这样的 UDP客户端 - > (接收UDP数据报)代理(发送TCP数据包) - > TCP服务器
答案 0 :(得分:0)
我没有看到像UDP服务器和TCP客户端同时出现任何问题。
首先,我们需要与TCP服务器建立连接(因为如果你无法重定向它,你不需要UDP数据报,我猜)。
SOCKET tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in tcp_address; // this is the address of 'TCP Server'
tcp_address.sin_addr.s_addr = inet_addr(tcp_server_ip);
tcp_address.sin_port = htons(tcp_server_port);
tcp_address.sin_family = PF_INET;
connect(tcp_socket, (SOCKADDR*)&tcp_address, sizeof(tcp_address));
连接tcp_socket后,我们可以创建UDP套接字:
SOCKET udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in udp_local_address; // this is your local address for receiving datagrams
udp_local_address.sin_addr.s_addr = inet_addr(udp_proxy_ip);
udp_local_address.sin_port = htons(udp_proxy_port);
udp_local_address.sin_family = PF_INET;
if(bind(udp_socket, (SOCKADDR*)&udp_local_address, sizeof(udp_local_address)) == SOCKET_ERROR))
{
// WSAGetLastError()
return false;
}
因此,现在您需要从UDP套接字接收数据报并将其发送到TCP套接字:
sockaddr_in udp_remote_address; // this is the adrees of 'UDP Client'
udp_remote_address.sin_addr.s_addr = inet_addr(udp_client_ip);
udp_remote_address.sin_port = htons(udp_client_port);
udp_remote_address.sin_family = PF_INET;
char buffer[9016];
const int read_size = recvfrom(udp_socket, buffer, 9016, 0, (SOCKADDR*)&udp_remote_address, sizeof(udp_remote_address));
if(read_size > 0)
{
if(send(tcp_socket, buffer, read_size, NULL) == SOCKET_ERROR)
{
// WSAGetLastError();
}
}
要检查tcp_socket是否已连接,您可以使用该代码(它检查套接字是否可写):
const timeval tv = { 0, 0 };
fd_set fd;
FD_ZERO(&fd);
FD_SET(tcp_socket, &fd);
select(NULL, NULL, &fd, NULL, &tv);
if(FD_ISSET(tcp_socket, &fd))
{
}