为什么我在socket使用connection为keep-alive时读取花费的时间比为close时长

发布于 2022-08-28 11:20:25 字数 1360 浏览 6 评论 0

int make_server_socket(int port, string host)
{

WSADATA inet_WsaData;
WSAStartup(MAKEWORD(2, 0), &inet_WsaData);
if (LOBYTE(inet_WsaData.wVersion) != 2 || HIBYTE(inet_WsaData.wVersion) != 0)
{
    WSACleanup();
    return -1;
}
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
struct hostent * hp = ::gethostbyname(host.c_str());
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
memcpy(&saddr.sin_addr, hp->h_addr, 4);
if (connect(tcp_socket, (const struct sockaddr *)&saddr, sizeof(saddr)) == -1)
{
    cerr << "error in connect" << endl;
}
return tcp_socket;

}
int main()
{

string url = "www.baidu.com";
string name = "/";
int client_socket = make_server_socket(80, url);
string request = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Keep-alive\r\n\r\n";
string request2 = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Close\r\n\r\n";
if (send(client_socket, request.c_str(), request.size(), 0) == SOCKET_ERROR)
{
    cout << "send error" << endl;
}
char buf[1024];
::memset(buf, 0, sizeof(buf));
int n = 0;
while ((n = recv(client_socket, buf, sizeof(buf)-sizeof(char), 0)) > 0)
{

}
closesocket(client_socket);
system("pause");
return 0;
}

当我用request时(connection:keep-alive)花费的时间比用request2(connection:close)要长

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贱贱哒 2022-09-04 11:20:25

因为你使用的套接字是阻塞的,while循环的条件是,recv的返回值大于0。

当情况为connection:keep-alive
最后一次recv是有数据的,返回值是大于0的。
按照你代码的逻辑,最后一次recv之后,还会再执行一直recv,这时候阻塞了,不会立刻返回,直到套接字默认的超时时间才会返回。

当情况为connection:close
最后一次recv之后,服务器的TCP连接会关闭,再执行一次recv会立刻返回0,所以时间不会长。

递刀给你 2022-09-04 11:20:25

你如何计算时间长短的呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文