gpt4 book ai didi

c++ - 奇怪的 closesocket() 行为

转载 作者:行者123 更新时间:2023-11-28 06:23:28 25 4
gpt4 key购买 nike

我在调用 closesocket() 时注意到一个奇怪的行为。如果我创建一个调用 recv() 的线程,则 closesocket() 将向另一端发送一个 RST 数据包。但是,如果我不创建接收线程,则 closesocket() 将执行正常断开连接(4 次握手)。

以下代码将导致 closesocket() 发送一个 RST 数据包:

#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <process.h>

unsigned int __stdcall thread(void *s)
{
char buffer[1024];
recv((SOCKET)s, buffer, 1024, 0);

return 0;
}

int main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("173.194.116.18");
addr.sin_port = htons(80);
connect(s, (sockaddr*)&addr, sizeof(addr));

// Start thread
_beginthreadex(0, 0, thread, (void*)s, 0, 0);
Sleep(1000); // give thread some time to start

// RST packet will be sent (if you remove the receive thread then a graceful disconnection will be performed)
closesocket(s);

return 0;
}

注意:我正在使用阻塞套接字。

最佳答案

如果客户端发送多个字节,服务器将读取第一个字节并使用其接收队列中的数据调用关闭,导致将 RST 发送到客户端。客户端将在调用 recv() 时被阻塞,等待来自服务器。收到 RST 后,DieWithError() 报告连接被对等方重置的问题。所以shutdown可以在调用close之前使用。希望这篇文章对你相关的RST有所帮助http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/TCPRST.pdf

关于c++ - 奇怪的 closesocket() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28941572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com