2009-12-12 2 views
0

채팅 프로그램을 작성 중이며 서버에 대해 데이터를 보낼 때 send() 함수가 데이터를 보내는 데 오랜 시간이 걸릴 수 있습니까?send 함수 블록을 보낼 수 있습니다.

내 문제는 다음과 같습니다. 단일 스레드에서 epoll과 함께 Linux 2.6을 사용하고 있습니다. send() 블록을 사용하면 서버의 다른 모든 활동이 중지됩니다. TCP 패킷에 오랜 시간 동안 ACK 응답을 보내지 않는 매우 느린 클라이언트가있는 경우처럼, send 함수는 즉시 실행되거나 클라이언트에 대해 오랜 시간 기다릴 것입니다. 내가 원하지 않는 일은 한 명/몇 명의 느린 클라이언트가 채팅 서버에서 지연을 일으키는 것입니다.

내가 원하는 것은 send()를 비 블록화하고 매우 빠르게 반환하는 것입니다. 모든 데이터를 전송하지 않으면 단순히 전송 한 금액 만 반환하고 버퍼에서 해당 데이터를 제거하고 모든 데이터가 전송 될 때까지 다음 번에 서비스를 계속 보냅니다. 기본적으로 나는 천천히 또는 응답하지 않는 클라이언트에서 오랫동안 차단하도록 보내기를 원하지 않습니다.

답변

3

소켓을 비 차단 모드로 설정할 수 있으며 송신이 차단되지 않습니다. 문제는 쓰기 파일 설명자가 다시 활성화 될 때 부분 쓰기가 발생했다는 사실을 관리하고 나머지 데이터를 보내야한다는 것입니다.

일반적으로 프로그램을 복잡하게하면서 비 차단 모드에서 send와 recv를 모두 수행하면 꽤 잘 작동한다는 것을 알게되었습니다. 같은

사용 무언가 :

if (-1 == (flags = fcntl(fd, F_GETFL, 0))) 
     flags = 0; 
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK); 
관련 문제