2010-11-22 4 views
1

select()의 모든 문서에서 알 수 있듯이 send()에 대한 소켓 (설명자) 사용 가능성을 확인하기 위해 fd_set을 쓸 수 있습니다. select()이 사용 될 수 있습니다. 성공적인 비 차단 connect() 시도를 감지 할 수 있지만 무엇을 얻을 수없는 것은 성공적인 connect() 또는 accept() 후에 소켓을 사용할 수 없게되었을 때입니다. 그리고 이론상 소켓이 항상 send() ing에 사용 가능하다는 것을 의미합니까?select() ing write의 개념 fd_set

마지막 질문으로 전체 세션의 쓰기 작업을 위해 연결된 소켓을 계속 유지하는 것이 실용적인가요?

감사합니다.

답변

3

쓰기에 사용할 수없는 소켓의 가장 일반적인 경우는 응용 프로그램이 포화시킬 수있는 상대적으로 느린 네트워크 링크를 통해 연결될 때입니다. 운영 체제는 제한된 양의 데이터를 버퍼링하므로 소켓을 사용할 수 있는지 (일부 데이터가 전송되었고 버퍼에 여유 공간이 있음을 나타냄) 확인하여 응용 프로그램을 제한해야합니다.

다른 질문에 대해서는, 예를 들어 다음과 같은 경우와 같이 단일 스레드에서 사용중인 여러 종류의 소켓이있는 경우 웹 서버라면 select()를 사용하여 효율적으로 관리 할 수 ​​있습니다.

1

비 블로킹 소켓을 사용할 때 WSAEWOULDBLOCK 오류로 인해 모든 작업이 실패 할 수 있습니다. connect() 및 send()의 경우 select()를 사용하여 보류중인 connect() 호출이 서버에 성공적으로 연결되었거나 소켓이 쓰기 가능할 때이를 차단하지 않고 새 데이터를 받아 들일 수 있는지 여부를 결정할 수 있습니다.

1

'보낼 수 있음'은 소켓의 송신 버퍼에 공간이 있음을 나타냅니다. 이것은 연결이 완료되고 버퍼가 할당 된 때부터 시작하는 대부분의 경우에 해당됩니다. 버퍼가 채워지는 경우에만 사실이 아니며, 대상 소켓의 수신 버퍼가 채워질 때만 발생합니다. 읽기 전용 응용 프로그램이 작성자보다 느린 경우에만 발생합니다.

+0

대상 소켓의 수신 버퍼가 가득 차지 않았을 수 있습니다. 느린 네트워크 연결 일 수도 있습니다. – mark4o