我在打电话给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;
}注意:,我正在使用阻塞套接字。
发布于 2015-03-09 12:38:21
如果客户端发送多个字节,服务器将读取第一个字节,并在其接收队列中使用数据调用close,从而将RST发送到客户端。客户机将在等待服务器响应的recv( )调用时被阻塞。在接收到RST后,DieWithError( )报告由对等方重置的问题连接。因此,在调用close之前可以使用关机。我希望本文能对您相关的RST http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/TCPRST.pdf有所帮助。
https://stackoverflow.com/questions/28941572
复制相似问题