2017-05-17 1 views
0

내 네트워킹은 그리 좋지는 않지만 이것을 알아 내려고합니다.UDP를 통해 데이터를 받고 TCP로 전송

UDP를 통해 데이터를 수신 한 다음 TCP를 통해 다른 서버로 데이터를 보낼 수 있습니까?

그래서 UDP 클라이언트와 같은 것 ->(받으십시오 UDP 데이터 그램) 프록시 (TCP 패킷을 보내기) -> TCP 서버

+0

UDP 클라이언트와 TCP 클라이언트를 한 곳에서 (프록시) 결합 할 때 어떤 문제점이 있습니까? – renzo

+0

그것은 udp를 통해 데이터를 가져오고 있으며 프록시는 udp 서버처럼 작동하고 동일한 데이터를 tcp를 통해 다른 서버로 보냅니다. 나는 이것이 현재 가능하다는 것을 확신 할 수 없다. 나는 현재 매우 다른 데이터 레벨을보고있다. 그래서 udp에서 100 개의 메시지가 나오고 tcp보다 적습니다. 그러나 tcp in과 tcp를 사용하면 100 개의 메시지를 보게됩니다. 죄송합니다. 이것은 네트워킹 관련 항목에별로 좋지 않은 내용입니다. –

답변

0

나는 UDP 서버처럼 행동에 문제가 표시되지 않으며 TCP 클라이언트가 동시에

처음에는 TCP 서버와의 연결을 설정해야합니다 (리다이렉트 할 곳이 없다면 UDP 데이터 그램이 필요하지 않기 때문에).

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(); 
    } 
} 
: 지금 당신은 UDP 소켓에서 데이터 그램을 수신하고 TCP 소켓에 보낼 단지 필요, 그래서

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; 
} 

다음 tcp_socket가 연결되면

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)); 

, 우리는 UDP 소켓을 만들 수 있습니다

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에 클라이언트 또는 서버가 없습니다. 이것은 피어 - 투 - 피어 프로토콜입니다. 클라이언트/서버 개념은 응용 프로그램 계층 개념입니다. –

관련 문제