C++,Linux,套接字发送性能
C++, Linux, socket send performance
(原始问题列在下面(事实证明,我遇到了"消费者缓慢"的问题。由于我无法控制服务器程序,因此我尝试设置 setsockopt(m_sock,
IPPROTO_TCP,
TCP_NODELAY,
(字符 *( 和标志,
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);
使用非阻塞 I/O(例如O_NONBLOCK
(,你应该使用一些多路复用系统调用(如 .e.g. poll(2( 或较旧和过时的 select(2)
(来确保您的套接字确实是
当然,如果您有多个套接字,则需要多路复用多个套接字。
简而言之,你需要一个事件循环(你可以使用提供一个的库,例如libevent或libev......(,或者像poll
这样的多路复用系统调用有自己的循环......即使只有一个双向套接字,您也需要多路复用其输入和输出(具有阻塞或非阻塞 I/O(。
阅读一些好书,例如高级Linux编程以及一些 Linux 套接字教程和 Unix 网络编程书籍。
您的问题不够精确,无法回答。您应该提供更多代码,或者至少提供有关可疑系统调用的相关strace
跟踪。
你可以看到内格尔算法在起作用。
只需设置TCP_NODELAY套接字选项:
int value = 1;
setsockopt(m_sock, IPPROTO_TCP, TCP_NODELAY, (void*)&value, sizeof(value));
我认为您不需要O_NONBLOCK,但这在很大程度上取决于您的用例。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- c#非阻塞接收套接字,带有try-catch SocketException,性能
- C++,Linux,套接字发送性能
- RPC、套接字和性能注意事项