2017-05-17 203 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沒有客戶端或服務器;它是一個點對點協議。客戶端/服務器概念是一個應用層概念。 –