2017-10-23 4 views
-1

나는 프로젝트를 위해 꽤 오랜 시간 동안 golang을 사용하기 시작했다. 내 프로젝트에서 나는 TCP 클라이언트에 응답하는 tcp 서버를 구현해야한다. 서버는 클라이언트에 많은 메시지를 보내야합니다. 문제는 서버가 클라이언트 연결에 메시지를 쓸 때 클라이언트가 버퍼에서 해당 메시지를 읽은 다음 다른 메시지를 보낼 때까지 기다려야한다는 것입니다 (서버가 클라이언트가 reader.ReadString('\n') 메서드를 호출 할 때까지 기다려야 함). 내 서버 코드에서클라이언트가 tcp 버퍼에서 읽는 것을 찾는 방법

내가 쓴 :

for { 
    data := <-client.outgoing 
    client.writer.WriteString(data + "\n") 
    client.writer.Flush() 
} 

있지만 서버는 클라이언트에서 ReadString을 기다리지 않고 클라이언트에 모든 메시지를 전송합니다.

클라이언트가 메시지를 읽고 다른 메시지를 보낼 때까지 서버를 대기 상태로 만드는 방법은 무엇입니까?

+3

수 없습니다. 그것은 TCP가 작동하는 방식이 아닙니다. – JimB

+0

클라이언트 tcp 무료 버퍼 크기를 얻을 수있는 방법은 무엇입니까 ?? – Alireza

+3

나는 당신이 잘못된 문제를 풀려고 노력하고 있다고 생각합니다. 뒤로 물러나서 달성하려는 내용 (예 : 상위 수준보기)을 설명 할 수 있습니까? – cnicutar

답변

0

할당이 모호하거나 사용자가 잘못 해석하여 the XY problem을 해결한다고 생각합니다.

간단히 대답하면 은 클라이언트가 TCP 대화을보고 메시지를 읽었는지 여부를 알 수 없습니다. 이 "프로토콜"을 응용 프로그램에 구현해야합니다. 응용 프로그램에서

  1. 당신이 정말는 TCP가 무엇을하고 있는지에 액세스 할 수 없습니다 : 여기

    는 몇 가지 문제가 있습니다. I/O를 수행 할 수있는 스트림을 얻습니다.

    • 스트림에 대한 쓰기가 "성공"한다는 사실은 TCP가 귀하의 콘텐츠를 전송하려고 시도하고 독점적 인 사본을 가지고 있음을 의미합니다. 그것은 데이터가 수신되었는지 여부에 대해 아무 말도하지 않고 심지어 당신은 TCP의 내부 동작에 피어 특정 메커니즘을 찾을 수있는 데이터도
    • 을 보냈습니다 의미하지 않는다 (예 : ioctl의, SIOCINQ, SIOCOUTQ 또는 다양한 setsockopts) : 원격 TCP가을하고있는 무슨이 당신이 당신의 TCP가 수행되고 있는지 확인하더라도
  2. 도움이되지 않습니다, 이것은 단지 당신에게 을 알려줍니다. 따라서 TCP를 완전히 제어 할 수 있고 동료의 승인을 확인하는 경우에도이 수행하는 작업은 입니다. 응용 프로그램이 아직 데이터를 읽지 않았을 가능성이 있습니다 (데이터를 요청하지 않았거나, TCP가 이상한 이유로 버퍼에서 보류되었을 수 있습니다. 스케줄러가 원격 프로세스 등을 예약하지 않았을 수 있습니다)

질문에 다시 돌아 가면 원격 응용 프로그램이 메시지를 받았는지 여부를 실제로 알 수있는 방법은 원격 응용 프로그램에서 알려주는 것입니다.그것은 당신의 물건

  • 는 점 2에서 알고 있기 때문에 (더 많은 물건을 보내기를 받았다을 알려주는 응용 프로그램에서 메시지를 위해 서버에서
  • 기다립니다

    1. 보내기 물건이 당신이 당신의 프로토콜을 구조 조정해야한다는 것을 의미 그렇게하는 것이 안전합니다.)