2012-08-24 2 views
0

TCP 소켓을 사용하여 이더넷을 통해 PC에 연결하는 임베디드 시스템을 개발 중입니다. PC는 TCP 클라이언트가되며 임베디드 시스템은 서버가됩니다. 내가 올바르게 이해한다면, 고전적인 커뮤니케이션 모델은 클라이언트가 서버에 데이터를 보내고 서버가 매번 응답한다는 것입니다. 서버는 절대로 통신을 시작하지 않습니다.1 : 1로 보내기/받기 방식으로 TCP를 사용해야합니까?

내가하고 싶은 것은 해당 응답없이 PC에서 임베디드 시스템으로 명령을 보내는 것입니다. 그런 다음 임베디드 시스템은 명령에 설명 된 작업을 실행합니다. 임베디드 시스템에 오류가 있거나보고 할 상태 메시지가있는 경우 PC에서 폴링하지 않고 이러한 메시지를 보냅니다.

나는 PC 측에서 수신하는 것 이외 모든 것을 알아 냈습니다. C#에서 PC 응용 프로그램을 프로그래밍 중입니다. 소켓에서 데이터가 수신 될 때마다 발생하는 콜백을 설정할 수 있습니까? 내가 본 모든 예제는 블로킹 방식으로 receive 메소드를 사용한다.

+1

TCP 연결은 양방향 연결을 제공합니다. 정의한 것 이외에 어느 방향으로 향한 바이트 간에는 관계가 없습니다. 메시지가 아니라 바이트 스트림을 처리한다는 점을 명심하십시오. TCP는 바이트를 같은 순서로 중복없이 맨 끝으로 가져올 수 있습니다. 특정 바이트 그룹을 함께 이동시키는 것에 대한 어떠한 주장도하지 않으며 네트워크가 지시하는대로 버퍼를 분할하거나 결합 할 수 있습니다. – HABO

답변

0

소켓 스트림에서 비동기 I/O를 사용할 수 있습니다. 이것은 거의 정확히 당신이 요구하는 것입니다 - 수신 작업을 시작하고 수신이 완료되면 콜백 할 수 있습니다.

BeginReceive/EndReceive 기능을 확인하십시오. 여기

상세 정보 : http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx

0

긴이 짧은 물론, '예'입니다.

연결하려는 각 클라이언트에 대해 새 스레드를 실행 한 다음 이벤트/명령 스레드에서 이벤트를 발생시킵니다. 패킷을받을 때 ACK를 보내는 것 이외의 요청에 응답 할 의무가 없습니다 (운영 체제의 TCP/IP 스택에서 처리합니다). OS가이 부분에 대해 걱정하지 마십시오. 무엇이 TCP/IP를 신뢰할 수있게하는지).

소켓이 활성화되어 있으면 클라이언트에 응답을 보낼 수 있어야하므로 기본적으로 명령이 실행되는 동안 소켓을 활성화 상태로 유지해야합니다.

다음은 Microsoft에서 제공하는 예제를 보여줍니다. http://msdn.microsoft.com/en-us/library/bew39x2a.aspx#Y0