C++、Linux、套接字发送性能

标签 c++ linux sockets

(下面列出的原始问题) 原来我有一个“消费缓慢”的问题。由于我无法控制服务器程序,因此我尝试设置 setsockopt(m_sock,
IPPROTO_TCP,
TCP_NODELAY,
(char *) &flag,
大小(整数));

但我仍然遇到写入套接字需要几秒钟的时间。 我错过了什么吗? 原刊: 我使用

创建了一个套接字
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); 

最佳答案

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

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

简而言之,您需要一个 event loop (您可以使用提供一个库的库,例如 libeventlibev ...),或者围绕多路复用系统调用使用您自己的库,例如 poll ....)。即使只有一个双向套接字,您也需要对其输入和输出进行多路复用(同时使用阻塞或非阻塞 I/O)。

读一些好书,例如Advanced Linux Programming 还有一些Linux Socket TutorialUnix Network Programming书。

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

关于C++、Linux、套接字发送性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19078319/

相关文章:

c# - socket 推荐

c++ - std::make_tuple 是右值引用时如何保留 std::string 类型

c++ - 在 x86 中增加一个整数原子吗?

java - 当运行队列延迟太大时如何调整 Linux 性能?

linux - 具有局部和静态变量的动态库

node.js - 使用 Socket.io 和 Redis 的 Node 集群问题

c - 套接字读/写错误

c++ - 对我的 do-while 循环程序感到困惑

c# - 将图像转换为要绘制的线条数组

.net - 使用大文件作为消息负载进行发布/订阅