我正在使用TCP连接连接服务器进程和客户端进程,我必须检测
到两台计算机之间的物理连接已关闭.我正在尝试使用keepalive执行此操作,
将默认的系统范围值减少到:
TCP_KEEPIDLE = 5
TCP_KEEPCNT = 5
TCP_KEEPINTVL = 1
当连接断开(我断开电缆)时,只有服务器在10秒内检测到连接已丢失,客户端只挂起发送.
这是客户端代码:
#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/tcp.h>
int main(int argc, char** argv) {
char myVector[1600];
int mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (mySocket < 0 ) {
std::cout << "error creating the socket" << strerror(errno) << std::endl;
::exit(-1);
}
struct sockaddr_in sin;
memset( (char *)&sin, 0, sizeof( sin ) );
sin.sin_addr.s_addr = inet_addr("192.168.21.27");
sin.sin_port = htons(7788);
sin.sin_family = AF_INET; …Run Code Online (Sandbox Code Playgroud) 我有一个多线程应用程序,我希望htop(例如)每个运行的线程显示一个不同的名称,此时显示的是用于运行main的"命令行".
我试过用
prctl(PR_SET_NAME, .....)
Run Code Online (Sandbox Code Playgroud)
但它只适用于顶部,并且只有该调用才能指定最多16个字节的名称.
我想诀窍是修改/ proc/PID/cmdline内容,但这是一个只读字段.
谁知道如何实现它?
我有一个应用程序,必须计算文件的MD5,我已经使用openssl库,valgrind抱怨一些块仍然可以访问.
编译以下代码:
#include <openssl/bio.h>
int main(int, char**)
{
BIO * mem = BIO_new(BIO_s_mem());
BIO_vfree(mem);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用valgrind运行它是我得到的:
==23597== 220 bytes in 6 blocks are still reachable in loss record 1 of 1
==23597== at 0x4022D78: malloc (vg_replace_malloc.c:207)
==23597== by 0x432FD0D: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x433036E: CRYPTO_malloc (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x43989C9: lh_new (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x4332025: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x433249B: (within /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x4332B5D: CRYPTO_new_ex_data (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x438E053: BIO_set (in /usr/lib/i686/cmov/libcrypto.so.0.9.8)
==23597== by 0x438E0E9: …Run Code Online (Sandbox Code Playgroud) 要在我的非默认NIC(dvb)上接收多播,请执行以下操作:
此时,接收所需多播数据包的唯一方法是在路由表中添加一条规则,通过dvb到达发送方所在的网络(另一个网络),就像dvb需要回复多播发送方一样; 让我们说一种源发送器组播模式.谁知道发生了什么事?这个问题让我讨厌,因为原则上我不知道发送者的ip.
在我的应用程序中,我使用 infiniband 基础设施将数据流从服务器发送到另一个服务器。我过去习惯通过 infiniband 轻松开发 ip,因为我更熟悉套接字编程。到目前为止,性能(最大带宽)对我来说已经足够好了(我知道我没有获得可实现的最大带宽),现在我需要从无限带宽连接中获得更多带宽。
ib_write_bw 声称我的最大可实现带宽约为 1500 MB/s(我没有得到 3000MB/s,因为我的卡安装在 PCI 2.0 8x 中)。
到现在为止还挺好。我使用 ibverbs 和 rdma 对我的通信通道进行了编码,但我得到的带宽远远低于我可以获得的带宽,我什至获得的带宽比使用套接字少一点,但至少我的应用程序不使用任何 CPU 功率:
ib_write_bw:1500 MB/s
套接字:700 MB/s <= 在此测试期间,我的系统的一个核心处于 100%
ibvers+rdma: 600 MB/s <= 在这个测试过程中根本没有使用 CPU
看来瓶颈就在这里:
ibv_sge sge;
sge.addr = (uintptr_t)memory_to_transfer;
sge.length = memory_to_transfer_size;
sge.lkey = memory_to_transfer_mr->lkey;
ibv_send_wr wr;
memset(&wr, 0, sizeof(wr));
wr.wr_id = 0;
wr.opcode = IBV_WR_RDMA_WRITE;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.send_flags = IBV_SEND_SIGNALED;
wr.wr.rdma.remote_addr = (uintptr_t)thePeerMemoryRegion.addr;
wr.wr.rdma.rkey = thePeerMemoryRegion.rkey;
ibv_send_wr *bad_wr = NULL;
if (ibv_post_send(theCommunicationIdentifier->qp, &wr, …Run Code Online (Sandbox Code Playgroud) linux ×3
c ×2
c++ ×1
infiniband ×1
multicast ×1
networking ×1
openssl ×1
performance ×1
pthreads ×1
rdma ×1
routing ×1
sockets ×1
valgrind ×1