2010-03-20 3 views
0

내 이해에 따라 간단한 TCP 서버는 다음과 같이 코딩됩니다.TCP 서버 프로그램에서 write() 전에 read()를해야하는 이유는 무엇입니까?

소켓() - 바인딩() - 듣기() - 동의() - 읽기() - 다음과 같이 클라이언트가 기록됩니다()

물품.

소켓() - 바인드() (선택 사항) - 연결() - 쓰기() - 클라이언트와 서버 프로그램 사이에() 호출)를 읽어

(읽기의 순서 차이주의()와 연락 드릴 것입니다.

서버 프로그램에서 write()를 읽기 전에 항상 읽는 것이 필요합니까? 그렇다면 이유는 무엇입니까?

덕분에, 나가

답변

1

당신이 중 하나를 순서대로 수행 할 수 있습니다. 그러나 서버는 일반적으로 read() 작업에서 응답을 생성 한 다음 write() 작업으로 응답을 작성하므로이 순서가 적합합니다.

여러 클라이언트를 처리하는 경우 select와 같은 멀티플렉서를 사용하여 클라이언트에서 데이터를 읽을 준비가되었을 때 알려야하므로 클라이언트에서 read()를 시도 할 때마다 서버가 잠기지 않습니다 누가 아무 것도 보내지 않았다.

3

이는 필수는 아니지만 서버가 응답을 작성하기 전에 요청을 읽는 것이 좋습니다. 양측이 분산 된 교착 상태를 막을 수있을만큼 충분히 자주 읽는 것이 필요하다는 것을 기억하십시오. 예를 들어, 양측이 쓰기를 시도하고 읽지 않으려는 경우, 중간 중간의 버퍼가 가득 차서 어느 쪽 쓰기도 할 수 없습니다. 발하다. 이것을위한 한 가지 해결책은 읽을 것이 있다면 읽기를 계속하는 별도의 스레드를 갖는 것입니다 (이것은 클라이언트와 서버 모두에 적용됩니다).

+0

+1 좋은 조언입니다. –

2

간단한 대답은 없습니다. 당신은 당신이 좋아하는 것을 자유롭게 할 수 있습니다.

그러나 대부분의 프로토콜은 클라이언트가 무언가를 보낼 때까지 기다릴 수 있도록 설계되었습니다. 결국, 서버는 기본적으로 요청을 처리하고 요청이 무엇인지 알기 위해 기다려야합니다. "GET /"또는 "HELO"또는 무엇이든간에. 따라서 클라이언트에게 응답을 다시 쓰기 전에 서버가 읽는 것은 상당히 자연스러운 일입니다.

그렇다면 독서를하기 전에 버전 정보를 클라이언트에 쏟아 내고 싶다고 생각할 수 있습니다. 효과를 보려면 telnet을 사용하여 서버에 연결하십시오.

+2

실제로 클라이언트 연결시 서버가 배너 또는 환영 메시지를 보내는 많은 프로토콜이 있습니다. SSH, SMTP, POP3 및 IMAP가 마음에 듭니다. – caf

0

서버 프로그램은 먼저 읽을 필요없이 소켓에 쓸 수 있습니다. 그러나 대부분의 경우 서버 프로그램은 클라이언트가 원하는 것을 알고 있어야하므로 read()를 먼저 호출합니다.

관련 문제