UDP socket에서 source ip address와 source udp port를 지정하려면?
한 task내에서 일어나야 되는 일입니다.
이 task에서 udp port 1000을 bind해서 사용하고 있습니다.
이 task는 ip 10.1.1.2에서 수행되고 있다고 합시다.
remote host (10.1.1.1)에서 source port 2000, dest port 1000으로 packet이 들어왔습니다.
당연히, recvfrom()해서 받았지요. 보통 여기서 bind()한 socket으로 다시 sendto()해서
reply를 보내지 않습니까? -- 여기서 사용된 socket descriptor를 sd_org 라고 합시다.
그런데!!!
여기서, packet을 보낼때, source ip를 다른 것으로 바꾸고 싶습니다.
그래서, 다른 socket을 열어서, bind할때, sockaddr.sin_addr.s_addr = new_address; 했지요.
그런데, 여기서 source port 번호를 1000으로 주려고,
sockaddr.sin_port = 2000;
으로 bind를 했더니, error가 납니다. 왜냐면 원래 recvfrom()하는 socket에서 이 address를 bind했기
때문으로 보입니다.
SO_REUSE_ADDR을 해봤지만, 원래 socket 즉, sd_org가 close()를 전혀 하지 않았기 때문인것 같습니다.
그렇다고, sd_org를 close()할 수는 없습니다. 왜냐면 계속 packet을 받아야 하기 때문이죠.
정리하자면,
내 ip(10.1.1.2) 내 udp port=1000 인데,
응답 보낼때는 내ip만 10.1.1.3으로 바꿔서 보내고 싶습니다.
물론, 응답 보낼때, dest ip = 10.1.1.1(원래 상대방 주소), dest port=2000, src port=1000
이렇게 보낼려면 어떻게 해야 할까요?
댓글 달기