2014-03-18 3 views
2

저는 TCP 클라이언트를 사용하여 VS2010 C#에서 TCPSocket 함수를 사용하는 방법을 배우고 있습니다. read() 함수를 호출하여 데이터를 읽을 수 있습니다. 그 부분은 모두 작동합니다. 내가 이해하지 못하는 것은 클라이언트를 스트림을 듣고 함수를 수동으로 호출하거나 타이머를 사용하지 않고 텍스트 상자에 게시하는 방법입니다. 나는 이것을 이벤트 핸들러로 처리하고 싶지만,이 시점에서 나는 완전히 혼란스러워하고 지금은 약간의 지침이 필요하다.TCP 클라이언트 이벤트 처리기를 사용하여 데이터 받기

MSDN에서 찾은 클라이언트 샘플을 사용하여이 함수가 기본 읽기를 수행하는 방법을 이해하는 데 도움이됩니다. I 매트 데이비스 발견되는 다른 유래 게시물

private static void Receive(Socket client) { 
    try { 
     // Create the state object. 
     StateObject state = new StateObject(); 
     state.workSocket = client; 

     // Begin receiving the data from the remote device. 
     client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
      new AsyncCallback(ReceiveCallback), state); 
    } catch (Exception e) { 
     Console.WriteLine(e.ToString()); 
    } 
} 

는 그것을 시도 할 때

public event EventHandler<DataRecivedEventArgs> DataRecieved; 

은 그러나, "DataRecivedEventArgs는"비주얼 스튜디오의 인식 기능이 아닌 공개 이벤트를 사용하는 example 제공.

TCPClient를 사용하여 데이터를 지속적으로 수신하고 일부 데이터를 수신 할 때 함수를 호출하는 방법을 설명하는 사람이 도와 줄 수 있습니까?

답변

1

주어진 TCP 연결의 경우 수신 된 데이터는 커널의 버퍼 크기 제한 (응용 프로그램에 불투명)까지 버퍼링됩니다.

데이터를 받기를 원할 때 버퍼 크기가 무한하지 않고 커널이 응용 프로그램보다 빠르게 페이로드를 저장할 수 있으므로 데이터를 응용 프로그램 버퍼에 복사해야하는 양을 명시 적으로 커널에 알려야합니다 처리 (응용 프로그램이 정기적으로 선점 된 것을 잊지 마십시오).

응용 프로그램이 TCP 소켓에서 데이터를 수신하는 유일한 방법은 recv(), recvfrom(), recvmsg() 시스템 호출입니다.

사용자 공간에서 사용자가 수행 할 수있는 작업은 해당 시스템 호출에 해당하는 기능을 호출하여 데이터를 수신 할 수있는 것입니다. 주문형 디자인은 주문형입니다. 또한 응용 프로그램은 recv(), recvfrom(), recvmsg(), select(), poll() 또는 epoll()을 호출하기 전까지 데이터가 도착했는지 여부를 알 수 없습니다.

참고 : 저는 C# 사람이 아닙니다. 나는 C와 커널 내부를 알고 있고 그것은 꽤 많이있다. 소켓 통신의 개념을 지적하고자했습니다.

관련 문제