2013-01-13 1 views
2

UDP를 통해 연결된 응용 프로그램 (WP8도 가능)을 통해 데이터를 전송해야하는 WP8 프로젝트에서 작업하고 있습니다. DatagramSocket을 사용하여 Windows 8과 코드를 공유하기로 결정했습니다.읽기 중 WinRT UDP 통신 예외가 발생했습니다.

서버와 클라이언트 응용 프로그램은 서로 연결할 수 있습니다. 클라이언트가 서버에 연결되면 서버에 응답해야하는 명령을 전송합니다. 클라이언트 연결 및 명령 전송 코드는 다음과 같습니다.

var stream = await _udpSocket.GetOutputStreamAsync(server, UdpCommunication.Port); 
var writer = new DataWriter(stream); 
writer.UnicodeEncoding = UnicodeEncoding.Utf8; 

uint messageSize = writer.MeasureString(UdpCommunication.ReceiveImageCommand); 
writer.WriteUInt32(messageSize); 
await writer.StoreAsync(); 

writer.WriteString(UdpCommunication.ReceiveImageCommand); 
await writer.StoreAsync(); 
await writer.FlushAsync(); 

그래서 메시지 크기와 문자열 명령 이름을 전송합니다. 여태까지는 그런대로 잘됐다.

서버는 DatagramSocket에서 MessageReceived 이벤트를 수신하고 DataReader와 trz를 가져와 4 바이트를 읽습니다. 이 호출하는 동안 다음 예외 메시지가 나타납니다. "작업 식별자가 올바르지 않습니다." (HRESULT -2147020579)이 MessageReceived 이벤트

코드 :

DataReader reader = args.GetDataReader(); 
reader.UnicodeEncoding = UnicodeEncoding.Utf8; 

await reader.LoadAsync(4); 
uint messageSize = reader.ReadUInt32(); 

await reader.LoadAsync(messageSize); 
string message = reader.ReadString(messageSize); 

이 예외가 던져지고 어떻게 그것을 해결하기 위해 왜 사람이 단서가 있습니까? TCP, 블루투스 및 NFC를 수행했으며 모두 작동하며 비슷한 코드가 있습니다. 그러나 UDP는 나를 미치게합니다 ...

시간과 도움에 감사드립니다!

+1

나는 나쁜 소식을 전하는 사람이되기를 싫어하기 때문에 단지 의견입니다. 하지만 여기서 샌드 박스 제한을 위반하고 있습니다. 프로세스는 서로 통신 할 수 없습니다. 로컬 루프백은 일반적인 맬웨어 기술입니다. 테스트 목적으로 만 일시적으로 사용하지 못하게 할 수는 있지만 저장소를 통해 가져올 수는 없습니다. 이것은 계획에 거대한 구멍을 불어 넣을 것입니다. 미안합니다. –

+0

두 장치간에 통신이 발생합니다. 그래서 당신의 요점은 제 경우에는 적용해서는 안되지만 알고있는 것이 좋습니다. –

답변

2

DatagramSocketMessageReceivedEventArgs.GetDataReader() 호출에서 반환 된 DataReader에서 LoadAsync으로 전화하지 마십시오. 데이터 그램이 이미로드 된 것 같습니다. 해당 독자의 UnconsumedBufferLength을 확인하면 데이터 그램의 전체 크기가 표시됩니다.

사실, 이것은 WinSock 라이브러리 (WinRock 소켓의 기본 구현)에서 항상 하나의 전체 데이터 그램을 수신하기 때문에 UDP 소켓에 대해 의미가 있습니다. recvfrom 호출 (충분히 큰 버퍼를 제공 한 경우 WinRT가 이것을 처리하기를 바랍니다.) 스트림을 비동기 적으로 읽을 필요가 없습니다. 모든 데이터가 이미 있습니다.

따라서 해당 스트림에서 값을 읽으십시오. 귀하의 코드는 다음과 같이 번역됩니다 :

DataReader reader = args.GetDataReader(); 
reader.UnicodeEncoding = UnicodeEncoding.Utf8; 
uint messageSize = reader.ReadUInt32(); 
string message = reader.ReadString(messageSize); 
+0

이 답변으로 문제가 해결되면이를 수락하는 것을 고려하십시오.이를 읽는 다른 사람들도이 지식을 활용할 수 있습니다. – Haspemulator

0

사실, 위의 코드는 코드와 함께 정답을 제공했지만 작동하지 않습니다. 다음과 같이 작동하게하는 방법은 다음과 같습니다.

var reader = args.GetDataReader(); 
reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8; 
var size = reader.UnconsumedBufferLength; 
var message = reader.ReadString(size); 
관련 문제