2013-09-29 2 views
-2

(원본 문제는 아래 나열 됨) "느린 소비자"문제가 있음이 드러났습니다. 내가 서버 프로그램을 제어 할 수 없기 때문에, 나는 setsockopt를 (m_sock,
IPPROTO_TCP,
TCP_NODELAY를
(숯불 *) & 플래그,
는 sizeof (int)를) 설정 시도;C++, Linux, 소켓 보내기 성능

하지만 아직 소켓에 쓰기가 몇 초 정도 소요됩니다. 내가 빠진 것이 있습니까? 원래 문제 : 다음 나는 200bytes에 대해 보내고있다

send(m_sock, v_pData, v_iDataSize, MSG_NOSIGNAL); 

, 5를 보내

int opts = fcntl (m_sock, F_GETFL); 

opts = (opts | O_NONBLOCK); 

fcntl (m_sock, F_SETFL,opts); 

과 : 나는 비 블로킹에

m_sock = socket(AF_INET, SOCK_STREAM, 0); 

설정을 사용하여 소켓을 만든 두 번째 번 약 2 분 후에 데이터를 전송할 때 큰 버퍼와 큰 지연이 발생합니다. 전송 퍼포먼스를 향상시킬 수있는 방법이 있습니까?

우선 편집 : 내가 만들고 소켓을 사용하는 방법에 관해서는 더 많은 코드 추가 해요 :

m_sock = socket (AF_INET, 
     SOCK_STREAM, 
     0); 

if (! is_valid()) 
    return false; 

int on = 1; 
if (setsockopt (m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof (on)) == -1) 
return false; 


server = gethostbyname(host.c_str()); 
if (server == NULL) { 

    return false; 
} 
bzero((char *) &serv_addr, sizeof(serv_addr)); 
serv_addr.sin_family = AF_INET; 
bcopy((char *)server->h_addr, 
    (char *)&serv_addr.sin_addr.s_addr, 
    server->h_length); 
serv_addr.sin_port = htons(portno); 

set_non_blocking(true);// Code for set_non_blocking mentioned above 


connect(m_sock,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) ; 

내가 사용 소켓에 쓸 :

iOut = send(m_sock, v_pData, v_iDataSize, MSG_NOSIGNAL); 
+2

더 많은 코드를 표시하십시오. 어떻게'v_pData'가 계산됩니까? 'gcc -Wall -g'로 컴파일하고'gdb'와'valgrind'로 디버그 했습니까? –

+2

지연이 문제라면 'TCP_NODELAY'가 도움이 될 수 있습니다. 'O_NONBLOCK'을 잘못 사용하고있는 것 같습니다. 그게 무슨 뜻인지 알아? – nosid

+0

질문에서 언급 한대로 큰 버퍼를 만드는 위치는 어디이고 버퍼 크기는 어떻게 계산 했습니까? 성공적인 Btw 연결을하고 있습니까? – joe

답변

1

당신은 참조 Nagle's algorithm.

는 그냥 TCP_NODELAY 소켓 옵션 설정 :

int value = 1; 
setsockopt(m_sock, IPPROTO_TCP, TCP_NODELAY, (void*)&value, sizeof(value)); 

난 당신이 O_NONBLOCK을 필요가 있다고 생각하지 않습니다,하지만 그것은 매우 사용 사례에 따라 달라집니다.

+0

설명한대로 TCP_NODELAY에 소켓을 설정했으나 "느린 소비자"때문에 소켓에 ​​쓸 때 여전히 차단됩니다. – user1997268

+0

@ user1997268 "느린 소비자", TCP_NODELAY도 O_NONBLOCK도 도움이되지 않습니다. "느린 소비자"란 무엇을 의미합니까? 대기 시간이 너무 길거나 소비자가 데이터 소비를 느리게합니까? – villekulla

1

particularily 히 당신이 비 차단 ((예 O_NONBLOCK) I/O를 사용하면 (poll(2)를 .eg처럼 또는 이전 및 폐기 select(2)가) 일부 다중 콜를 사용해야합니다 당신의 소켓이 실제로 읽거나 쓸 수 있도록 즉, 사용하는 경우 읽을 수있는 경우는 read(2) 또는 recv(2), 쓰기 가능한 경우 write(2) 또는 send(2)에 성공합니다.

물론 하나 이상의 소켓이있는 경우 여러 소켓을 멀티플렉싱해야합니다.

은 한마디로 당신은) .... event looppoll 같은 다중 콜 주위에 자신을 (하나 예를 들어, libevent 또는 libev을 ... 제공하는 라이브러리를 사용할 수 있습니다), 또는이 필요합니다. 그리고 하나의 단일 양방향 소켓을 사용하더라도 입력 및 출력 (블로킹 또는 비 블로킹 I/O 모두)을 멀티플렉싱해야합니다.

좋은 책을 읽으세요. 예 : Advanced Linux Programming 일부 Linux Socket TutorialUnix Network Programming 권입니다.

귀하의 질문에 답변을 드릴만큼 정확하지 않습니다. 더 많은 코드를 제공하거나 적어도 의심스러운 시스템 콜에 대한 관련 strace 추적을 제공해야합니다.

+0

제 생각에는 그의 문제는 비 차단 I/O와 관련이 없습니다. – villekulla

+0

나는 동의하지만, 원래 질문의 세부 사항을 이해하지 못했기 때문에 (이는 분명하지 않다). –