C ++,Linux,socket发送性能

时间:2013-09-29 12:59:37

标签: c++ linux sockets

(原始问题如下) 事实证明我有一个“慢消费者”的问题。由于我无法控制服务器程序,所以我尝试了设置   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);

我发送大约200字节,每秒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); 

2 个答案:

答案 0 :(得分:1)

您会看到Nagle's algorithm正在运行。

只需设置TCP_NODELAY套接字选项:

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

我认为你不需要O_NONBLOCK,但这在很大程度上取决于你的用例。

答案 1 :(得分:1)

特别是如果你使用非阻塞I / O(例如O_NONBLOCK),你应该使用一些多路复用系统调用(如.eg poll(2)或旧的和过时的{{ 1}})确保您的套接字确实可读或可写(即在可读时可在read(2)recv(2)成功,或在可写时在write(2)send(2)上成功。

当然,如果您有多个套接字,则需要多路复用。

简而言之,你需要一个event loop(你可能会使用提供一个例如libeventlibev ...的库),或者拥有像{{1}这样的多路复用系统} ....)即使使用单个双向插槽,您也需要多路复用其输入和输出(包括阻塞或非阻塞I / O)。

阅读一些好书,例如Advanced Linux Programming 以及一些Linux Socket TutorialUnix Network Programming本书。

你的问题不够精确,无法回答。您应该提供更多代码,或者至少在可疑的系统调用上提供相关的select(2)跟踪。