2017-05-17 158 views
0

我的网络不是很好,但试图弄清楚这一点。通过UDP接收数据并通过TCP发送

是否可以通过UDP接收数据,然后通过TCP发送到另一台服务器?

所以会像 UDP客户端 - >(收到UDP数据报)代理(发送TCP数据包) - > TCP服务器

+0

你在将UDP和TCP客户端集中到一个地方(代理)时看到了什么问题? – renzo

+0

它通过udp获取数据,代理服务器就像udp服务器一样,然后通过tcp将相同的数据发送到另一台服务器。我只是不确定这是可能的,目前我看到非常不同的数据级别。所以在udp中有100条消息,而在tcp之外的消息少,但如果我使用tcp和tcp out,则会看到100条消息。 对不起,如果这是简单的东西,不是很擅长网络的东西。 –

回答

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)) 
{ 
} 
+0

TCP没有客户端或服务器;它是一个点对点协议。客户端/服务器概念是一个应用层概念。 –