【发布时间】:2018-09-29 12:11:50
【问题描述】:
谁能帮助我提高 udp 接收器的性能。我只能获得 1Mb/s,但需要将性能提高到几乎 5Mb/s。也缺少日志,因为接收者由于性能较低而无法接收所有消息。有没有关于我们如何提高性能的提示。我正在使用套接字调用来获取数据包。
#define MAX_PACKET_SIZE 65535
#define UPD_DATAGRAM_BUFFER_SIZE 1536
m_nSocket = socket(AF_INET, SOCK_DGRAM, 0);
/* Set socket buffer size */
int buffer_size = m_nBufferSize;
ret = setsockopt(m_nSocket, SOL_SOCKET, SO_RCVBUF, (char*) &buffer_size, sizeof(buffer_size));
ret = setsockopt(m_nSocket6, SOL_SOCKET, SO_RCVBUF, (char*) &buffer_size, sizeof(buffer_size));
/* Set socket timeout */
#if defined (WIN32) || defined (WIN64)
int timeout = m_nTimeout;
ret = setsockopt(m_nSocket, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(timeout));
ret = setsockopt(m_nSocket6, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(timeout));
#else
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = m_nTimeout * 1000; //must be in microseconds
ret = setsockopt(m_nSocket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
ret = setsockopt(m_nSocket6, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
#endif
//bind
m_address.sin_family = AF_INET;
m_address.sin_addr.s_addr = htonl(INADDR_ANY);
m_address.sin_port = htons(m_nPort);
ret = bind(m_nSocket, (struct sockaddr*) &m_address, sizeof(m_address));
//receive data
recvfrom(m_nSocket, m_sBuffer, UPD_DATAGRAM_BUFFER_SIZE, 0, (struct sockaddr*) &m_address, &server_length);
增加缓冲区大小会提高 udp 性能吗?我们还能做些什么来提高 udp 性能?
【问题讨论】:
-
我们是否需要增加接收缓冲区大小和接收超时值
-
您当然应该将接收缓冲区的大小设置得尽可能高。接收超时值不影响性能。但是 UDP 数据报丢失可能发生在网络中的任何地方,而不仅仅是在接收方,因为它很慢。注意不要使用 cmets 来改善您的问题。改进你的问题。在问题中。
-
MAX_PACKET_SIZE是干什么用的?如果它是最大 UDP 有效负载,则它太大了。如果是接收缓冲区大小,它太小了。m_nBufferSize的值是多少? -
在预处理器条件之前,您似乎缺少很多
#。 -
@EJP : MAX_PACKET_SIZE 在以下链接中提到:stackoverflow.com/questions/42609561/udp-maximum-packet-size m_nBufferSize 是我们作为接收器缓冲区大小给出的值。在我们的例子中,我们给出 1,048,576 字节,即 1Mb
标签: c++ performance network-programming udp packet-loss