(原始問題如下) 原來我有一個「緩慢的消費者」問題。因爲我沒有控制服務器程序,我嘗試設置 setsockopt的(m_sock,
IPPROTO_TCP,
TCP_NODELAY,
(字符*)&標誌,
的sizeof(int)的);C++,Linux,套接字發送性能
但我仍然認爲寫入套接字需要幾秒鐘的時間。 我錯過了什麼嗎? 原始發行日期: 我創建使用
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);
我送大約200bytes,5在大約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