我的網絡不是很好,但試圖弄清楚這一點。通過UDP接收數據並通過TCP發送
是否可以通過UDP接收數據,然後通過TCP發送到另一臺服務器?
所以會像 UDP客戶端 - >(收到UDP數據報)代理(發送TCP數據包) - > TCP服務器
我的網絡不是很好,但試圖弄清楚這一點。通過UDP接收數據並通過TCP發送
是否可以通過UDP接收數據,然後通過TCP發送到另一臺服務器?
所以會像 UDP客戶端 - >(收到UDP數據報)代理(發送TCP數據包) - > TCP服務器
我看不出像個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))
{
}
TCP沒有客戶端或服務器;它是一個點對點協議。客戶端/服務器概念是一個應用層概念。 –
你在將UDP和TCP客戶端集中到一個地方(代理)時看到了什麼問題? – renzo
它通過udp獲取數據,代理服務器就像udp服務器一樣,然後通過tcp將相同的數據發送到另一臺服務器。我只是不確定這是可能的,目前我看到非常不同的數據級別。所以在udp中有100條消息,而在tcp之外的消息少,但如果我使用tcp和tcp out,則會看到100條消息。 對不起,如果這是簡單的東西,不是很擅長網絡的東西。 –