簡體   English   中英

C ++,Linux,socket發送性能

[英]C++, Linux, socket send performance

(原始問題如下所示)事實證明我有一個“慢消費者”的問題。 由於我無法控制服務器程序,我嘗試設置setsockopt(m_sock,
IPPROTO_TCP,
TCP_NODELAY,
(char *)&flag,
的sizeof(INT));

但我仍然達到寫入套接字需要幾秒鍾的程度。 我錯過了什么嗎? 原始問題:我使用了創建了一個套接字

m_sock = socket(AF_INET, SOCK_STREAM, 0);

將其設置為非阻止:

int opts = fcntl ( m_sock, F_GETFL );

opts = ( opts | O_NONBLOCK ); 

fcntl ( m_sock, F_SETFL,opts );

然后發送

send(m_sock, v_pData, v_iDataSize, MSG_NOSIGNAL);

我在大約2分鍾后發送大約200字節,每秒5次,它會創建一個大緩沖區,並且在發送數據時會有很大的延遲。 有沒有辦法改善發送的性能?

First Edit:我正在添加更多關於如何創建和使用套接字的代碼:

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); 

你看到了Nagle的算法

只需設置TCP_NODELAY套接字選項:

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

我認為你不需要O_NONBLOCK,但這在很大程度上取決於你的用例。

特別是如果你使用非阻塞I / O(例如O_NONBLOCK ),你應該使用一些多路復用系統調用 (如.eg poll(2)或舊的和過時的select(2) )來確保你的套接字確實可讀或可寫(即在可讀時讀取(2)recv(2) ,或者在寫入時寫入(2)發送(2)將成功。

當然,如果你有多個套接字,你需要多個套接字。

簡而言之,你需要一個事件循環 (你可能會使用提供一個例如libeventlibev ...的庫),或者擁有自己的多路復用系統調用,例如poll ....)。 即使使用單個雙向插槽,您也需要多路復用其輸入和輸出(兩者都具有阻塞或非阻塞I / O)。

閱讀一些好書,例如高級Linux編程和一些Linux套接字教程Unix網絡編程書。

你的問題不夠精確,無法回答。 您應該提供更多代碼,或者至少在可疑的系統調用上提供相關的strace跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM