현재 클라이언트에서 로그인 할 수있는 UDP 응용 프로그램을 프로그래밍 중입니다. 그 다음에는 엔드 포인트가 목록에 저장됩니다.UDP 및 포트 랜덤 화
private void socket_Callback(IAsyncResult result_)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
socket.EndReceiveFrom(result_, ref remote);
if (!listOfEndPoints.Contains(remote))
{
// registration process
// add it to list
listOfEndPoints.Add(remote)
}
else
{
// process packet
}
}
그러나 클라이언트의 NAT는 모든 패킷에 다른 외부 종점을 할당하기도합니다. 등록 패킷의 소스 끝 점이 12.34.56.78:1000이면 해당 끝점이 목록에 추가됩니다. 그러나 동일한 클라이언트가 다른 패킷을 보내면 NAT가 다른 포트를 할당하므로 소스 끝 점이 12.34.56.78:1001이됩니다. 이 결과로 서버는 클라이언트가 등록되지 않았다고 가정하고 패킷을 등록 된 것으로 처리하려고합니다. 말할 필요도없이 작동하지 않습니다.
이 문제를 해결하는 방법은 ID를 전송하는 것입니다 (그러나 매우 신빙성이 없다면 쉽게 위장 할 수 있습니다). 그러나 클라이언트는 서버에 보내는 각 패킷에이를 추가해야합니다. 이렇게 그렇게하는 것은 그리 효과적이지 않을 것입니다.
패킷이 등록 패킷과 동일한 클라이언트에서 왔음을 알리는 다른 방법이 있습니까?
감사합니다. 내 코드의 버그 인 경우 왜 패킷의 끝점을 사용하지 않아야합니까? 그것은 모든 고객에게 그다지 독특하지 않겠습니까? 그리고 보안 체크섬은 어떻게 생겼을까요? 등록 할 때 클라이언트에게 임의의 번호를 보내는 것에 대해 생각하고있었습니다. 클라이언트는 패킷에 md5 (패킷 데이터 XOR 체크섬)를 추가합니다. 그런 다음 서버는 체크섬의 정확성을 검사합니다. 그게 당신이 의미하는 바 였나요? – haiyyu
@haiyyu : 엔드 포인트 데이터를 사용하지 않는 이유는 상대방의 IP 주소가 변경 될 수 있기 때문입니다. TCP를 사용하면 네트워크가 패킷을 세션과 연관시켜야하며 NAT 장치는 IP를 보존해야한다는 것을 알고 있습니다. UDP에서는 그렇지 않습니다. 그리고 네, 그것이 제가 의미하는 것입니다. 물론 최상의 솔루션은 요구 사항에 따라 다릅니다. –