(원본 문제는 아래 나열 됨) "느린 소비자"문제가 있음이 드러났습니다. 내가 서버 프로그램을 제어 할 수 없기 때문에, 나는 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);
더 많은 코드를 표시하십시오. 어떻게'v_pData'가 계산됩니까? 'gcc -Wall -g'로 컴파일하고'gdb'와'valgrind'로 디버그 했습니까? –
지연이 문제라면 'TCP_NODELAY'가 도움이 될 수 있습니다. 'O_NONBLOCK'을 잘못 사용하고있는 것 같습니다. 그게 무슨 뜻인지 알아? – nosid
질문에서 언급 한대로 큰 버퍼를 만드는 위치는 어디이고 버퍼 크기는 어떻게 계산 했습니까? 성공적인 Btw 연결을하고 있습니까? – joe