2011-05-04 3 views
0

비동기 소켓 연결을 구현하고 클라이언트와 성공적으로 통신하도록했습니다. 현재 문제는 정의 된 프로토콜에 독립적 인 타이머로 클라이언트에 패킷을 보낼 때입니다.SocketAsyncEventArgs (SAEA)에 대한 질문

내가 SAEA.AcceptSocket.SendAsync (...)를 호출 할 때마다 나는 예외를 얻을 : System.InvalidOperationException를 "비동기 소켓 작업이 SocketAsyncEventArgs 인스턴스를 사용하여 이미 진행 중입니다."

나는 몇 가지 테스트를하고 SAEA.AcceptSocket.SendAsync (...) 다른 후 바로 하나를 호출 할 수없는 것. 이것은 SAEA가 설계된 방식입니까, 아니면 예외를 발생시키는 원인이되는 코드에서 잘못된 일을하고 있습니까?

나는 인터넷 검색에 약간의 시간을 보냈지 만 답변을 찾을 수없는 것 같습니다. 누군가 나를 도울 수 있거나 올바른 방향으로 나를 가리킨다면 많은 도움이 될 것입니다!

감사합니다.

답변

2

SocketAsyncEventArgs 인스턴스 당 하나의 조작 만 보류 될 수 있습니다. 현재 대기중인 작업이 완료 될 때까지 기다리거나 송신 당 고유 인스턴스 인 SocketAsyncEventArgs을 사용하기 만하면됩니다.

+0

수락 완료시 SocketAsyncEventArgs가 만들어지면 클라이언트마다 하나의 SocketAsyncEventArgs가 있으므로 고유 한 인스턴스를 어떻게 만듭니 까? – n00b

+0

초기 acceptAsync 호출에 대해 SocketAsyncEventArgs를 만들어 전달한 다음 호출이 완료되면 다시 가져옵니다 ... 다음 재사용하거나 다음 작업을 수행하기 위해 새 작업을 만들 수 있습니다. do ... –

+0

고맙습니다 Len은 당신의 제안으로 올바른 길로 인도합니다. SocketAsyncEventArgs의 고유 인스턴스를 사용하고 다른 SocketAsyncEventArgs의 소켓을 사용하여 동일한 클라이언트에 보냈습니다. SocketAsyncEventArg가 동시에 사용 되었기 때문에 예외가 발생했지만 두 개 이상의 SocketAsyncEventArgs간에 동일한 AcceptSocket을 사용하는 것이 좋습니다. – n00b

0

난 당신이 비동기 연결 프로세스를 종료 먼저 SAEA.AcceptSocket.EndAccept (...)를 호출하거나 SAEA.AcceptSocket.EndSend (...)는 이전이

+0

end라고 말하면 중단되거나 완료됩니까? 왜냐하면 나는 어떤 패킷도 보내지 않기를 원하기 때문이다. – n00b

+0

EndSend (..)는 작업을 완료하고 데이터를 전송합니다. – TobiHeidi

+1

EndAccept는 BeginAccept와 쌍으로 사용되며 AcceptAsync 또는 SocketAsyncEventArgs 개체와는 사용되지 않습니다. – hultqvist

1

때마다 당신에게 보내는 종료 생각 메시지를 보내면 시간 초과 나 오류가 발생할 때까지 기다리거나 보내려고합니다.
당신은 여전히 ​​이전 메시지를 처리하고 있고 동일한 SocketAsyncEventArgs를 사용하여 다시 보내려고했습니다. SocketAsyncEventArgs가 다른 프로세스로 이동하도록 요청하여 다음 프로세스를 기다리는 경우이 오류가 발생합니다.

청취자가 서버 인 경우 클라이언트가 전송을 시도 할 때 새로운 연결을 제안하고 이에 대한 새로운 SocketAsyncEventArgs를 작성하십시오.

+0

안녕하세요, C_Rance, 그것은 새로운 연결을 수립하기위한 괜찮아요, 그것은 내가 패킷을 보내려고 노력하고있어하지만 당신이 바로 SocketAsyncEventArgs가 다른 하나를 보내려고 할 때 여전히 이전의 송신을 처리하고 있다는 것입니다. – n00b