在这个 C++ TCP 客户端中,我在哪里设置 TCP_NODELAY?
Posted
技术标签:
【中文标题】在这个 C++ TCP 客户端中,我在哪里设置 TCP_NODELAY?【英文标题】:Where do I set TCP_NODELAY in this C++ TCP Client? 【发布时间】:2015-08-13 20:17:05 【问题描述】:在这个 C++ TCP 客户端中我应该在哪里设置TCP_NODELAY
?
// Client socket descriptor which is just integer number used to access a socket
int sock_descriptor;
struct sockaddr_in serv_addr;
// Structure from netdb.h file used for determining host name from local host's ip address
struct hostent *server;
// Create socket of domain - Internet (IP) address, type - Stream based (TCP) and protocol unspecified
// since it is only useful when underlying stack allows more than one protocol and we are choosing one.
// 0 means choose the default protocol.
sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
if (sock_descriptor < 0)
printf("Failed creating socket\n");
bzero((char *) &serv_addr, sizeof(serv_addr));
server = gethostbyname(host);
if (server == NULL)
printf("Failed finding server name\n");
return -1;
serv_addr.sin_family = AF_INET;
memcpy((char *) &(serv_addr.sin_addr.s_addr), (char *) (server->h_addr), server->h_length);
// 16 bit port number on which server listens
// The function htons (host to network short) ensures that an integer is
// interpreted correctly (whether little endian or big endian) even if client and
// server have different architectures
serv_addr.sin_port = htons(port);
if (connect(sock_descriptor, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
printf("Failed to connect to server\n");
return -1;
else
printf("Connected successfully - Please enter string\n");
【问题讨论】:
在获得套接字描述符后随时调用 setsocketopt。尽职调查要求我问你为什么要关闭 Nagel。内格尔是你的朋友。 @user4581301 因为通讯是从虚拟机到它的主机。 仍然需要吃掉所有额外的数据包开销。如果您的目标是低延迟,我可以推荐 UDP,可能使用轻量级的握手来确认收据吗? 【参考方案1】:TCP_NODELAY 是给 setsockopt 系统调用的选项:
#include <netinet/tcp.h>
int yes = 1;
int result = setsockopt(sock,
IPPROTO_TCP,
TCP_NODELAY,
(char *) &yes,
sizeof(int)); // 1 - on, 0 - off
if (result < 0)
// handle the error
这是为了关闭 Nagle 缓冲。仅当您真正知道自己在做什么时才应打开此选项。
【讨论】:
TCP_NODELAY
未找到。我应该导入什么库?
知道了。 #include <netinet/tcp.h>
以上是关于在这个 C++ TCP 客户端中,我在哪里设置 TCP_NODELAY?的主要内容,如果未能解决你的问题,请参考以下文章
c++ 服务器在客户端终止连接进程后不关闭 TCP 套接字连接
我在哪里可以为我的 C++ 项目找到一个好的 Scope Guard 实现?
我在哪里可以找到我或我的客户YouTube“内容所有者ID”?