c# udp 비동기 예제

원격 호스트에서 비동기적으로 데이터그램을 수신합니다. BeginReceive 메서드는 작업이 사용하는 스레드와 콜백을 호출할 때 발생하는 작업을 제어합니다. .Net에는 실행중인 스레드 비동기 콜백을 결정하는 데 가장 자주 사용되는 “SynchronizationContext”라는 클래스가 있습니다. https://docs.microsoft.com/en-us/dotnet/api/system.threading.synchronizationcontext 컨텍스트를 사용할지 여부를 결정하는 것은 여전히 비동기 코드에 달려 있습니다. 이 두 부분으로 구성된 문서 시리즈에서는 비동기 UDP 소켓을 사용하여 간단한 클라이언트-서버 채팅 응용 프로그램을 구현하는 방법을 보여 드리겠습니다. 시리즈의 첫 번째 기사에서는 채팅 응용 프로그램의 서버에 초점을 맞출 것입니다. 클라이언트는 2부에서 설명합니다. 함수가 완료되면 비동기 호출 백 함수가 호출됩니다. 이벤트가 대리자를 트리거할 수 있는 것처럼 .NET은 메서드가 대리자를 트리거하는 방법도 제공합니다. .NET AsyncCallback 클래스를 사용하면 메서드가 비동기 함수를 시작하고 비동기 함수가 완료될 때 호출하는 대리자 메서드를 제공할 수 있습니다. 친애하는 데이브, 실제로 나는 질문이 있습니다.

이제 UDP 프로토콜을 사용하여 메시지를 보내고 받는 채팅 응용 프로그램을 개발하고 있습니다. 지금은 일반 응용 프로그램 (예 : MSN, 야후 메신저)와 같은 요청을 보내고 싶습니다. 예를 들어 내 PC에서 요청을 보내려면 다음 측면에서 “IP에서 요청을 받은 경우 …….. 이 IP 주소를 목록에 추가하시겠습니까?”. 그래서 나는 IP를 얻을 수 없습니다 ……. 당신은 어떤 추천, 또는 대답이 있습니까? 멋진 웹 사이트에 대한 대단히 감사합니다, 그리고 예제를 이해하기 쉬운. 나는 내가 해결할 수없는 문제에 부딪, 당신이 어떤 아이디어가 있는지 궁금해. 클라이언트가 닫히기 전에 자체적으로 정리할 기회가 없는 경우 서버는 BeginReceiveFrom에서 “기존 연결이 원격 호스트에 의해 강제로 닫혔습니다”를 throw합니다. 이 시점에서 소켓을 다시 사용할 수 없습니다. 서버가 들어오는 요청을 받으면 아래의 ReceiveData 메서드를 비동기적으로 호출합니다: 비동기 BeginReceive 작업은 EndReceive 메서드를 호출하여 완료되어야 합니다. 일반적으로 메서드는 요청호출 대리자에 의해 호출됩니다. 따라서 클라이언트와 서버가 통신할 때마다 UDP를 통해 이 데이터 패킷을 전송합니다.

예를 들어 클라이언트가 LogIn으로 설정된 데이터 식별자를 사용하여 패킷을 보내는 서버에 연결하려는 경우, 이름 집합은 사용자 이름으로 설정되고 이름 길이는 사용자 이름의 바이트로 설정된 길이, 메시지는 null로 설정되고 메시지 길이는 0으로 설정됩니다. 위의 비동기 메서드에 따라 매우 유사한 방식으로 동기 메서드에서 구현할 수도 있습니다. 일대일 채팅의 경우 여러 가지 방법으로 채팅을 할 수 있습니다. 가장 쉬운 방법은 통신 데이터 패킷을 수정하여 메시지의 누구를 포함하고 채팅 서버는 IP 주소 또는 포트를 기반으로 보낼 사람을 결정하는 것입니다. 그러나 나는이 일을하는 다른 방법이 있다고 확신합니다. 서버와 클라이언트를 모두 처리하기 위한 이중 목적 클래스입니다. 비동기 수신 및 동기 전송을 사용합니다(나중에 도움이 되는 것으로 판명되면 비동기 전송으로 전환할 수 있음). 내 서버는 클라이언트 소켓을 사용하여 서로 통신하고 여러 서버인 “단일 샤드” 유형 환경에서 내부 연결 테스트를 수행합니다. 나는 몇 가지 무거운 부하 테스트 방법을 조금 더 아래로 고안 할 것이다, 그러나 나는 거기에 도착하기 전에 주요 gotchas의 대부분을 낚시를 기대하고있다.

이 예제에서는 데이터 패킷에 클라이언트 연결 이름, 클라이언트가 보낸 메시지, 이름 길이 및 메시지 길이, 마지막으로 데이터 식별자를 호출하는 필드가 포함되어야 합니다. 수신된 데이터가 포함되어 있습니다.