C++ socket select()创建线程,close()不结束线程
当我在套接字上进行选择时,它会创建一个线程。当我关闭插座时,它不会松开螺纹 我正在cygwin中运行代码。在第一次暂停时,我连接了gdb,有三个线程不确定为什么是三个。我退出gdb并继续执行打开的程序,该程序执行以下操作:打开套接字、绑定、选择、关闭。然后我点击第二个暂停,然后连接gdb,现在有四个线程。我甚至还添加了关机。我确信我错过了一些简单的东西,但我似乎找不到 这是代码C++ socket select()创建线程,close()不结束线程,c++,sockets,cygwin,C++,Sockets,Cygwin,当我在套接字上进行选择时,它会创建一个线程。当我关闭插座时,它不会松开螺纹 我正在cygwin中运行代码。在第一次暂停时,我连接了gdb,有三个线程不确定为什么是三个。我退出gdb并继续执行打开的程序,该程序执行以下操作:打开套接字、绑定、选择、关闭。然后我点击第二个暂停,然后连接gdb,现在有四个线程。我甚至还添加了关机。我确信我错过了一些简单的东西,但我似乎找不到 这是代码 #include <netdb.h> #include <fstream> #include
#include <netdb.h>
#include <fstream>
#include <iostream>
#include <shlobj.h>
using namespace std;
void mySleep(int miliSeconds)
{
usleep(miliSeconds * 1000);
}
void mySleep(int miliSeconds)
{
// Sleep(miliSeconds);
usleep(miliSeconds * 1000);
}
void myPause()
{
cout << "Paused, hit enter to continue..."<< endl;
getchar();
}
int main()
{
myPause();
struct sockaddr_in serv_addr, client_addr;
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(10000);
client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
struct hostent* server = gethostbyname("127.0.0.1");
memset((char *) &serv_addr, 0, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
memcpy((char *)&serv_addr.sin_addr.s_addr, (char *) server->h_addr, server->h_length);
serv_addr.sin_port = htons(10000);
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0)
{
cout << "Error opening socket" << endl;
exit(-1);
}
int retCode;
socklen_t sockAddrLen = sizeof(sockaddr_in);
retCode = bind(sockfd, (const struct sockaddr *) &client_addr, sockAddrLen);
if (retCode < 0)
{
cout << "Unable to bind" << endl;
close(sockfd);
exit(-1);
}
struct timeval tv;
fd_set socks;
FD_ZERO(&socks);
FD_SET(sockfd, &socks);
tv.tv_sec = 5;
tv.tv_usec = 0;
retCode = select(sockfd + 1, &socks, NULL, NULL, &tv);
if (retCode < 0)
{
cout << "Unable to select" << endl;
close(sockfd);
exit(-1);
}
retCode = shutdown(sockfd, 2); // 2 = stop both reception and transmission
if (retCode < 0)
{
cout << "Unable to shutdown" << endl;
close(sockfd);
exit(-1);
}
retCode = close(sockfd);
if (retCode < 0)
{
cout << "Unable to close" << endl;
close(sockfd);
exit(-1);
}
sockfd = -1;
mySleep(5000);
myPause();
return 0;
}
关闭UDP套接字不会导致该套接字上的select结束。我不清楚为什么,但这是预期的行为。请参见也许这就是cygwin实现选择的方式?如果是这样,那么就不必太担心了。可能的重复尝试将可重用选项添加到套接字中,这样即使它没有超时也可以打开。cout@wildplasser但cygwin使用线程实现select。我认为这是原因之一。@cerkiewny-不相关。问题不是关闭套接字,问题是当套接字关闭时,所述套接字上的打开选择不会释放。谢谢大家。我预计几分钟后,线程将消失,但它没有。如果我反复调用select,它不会创建更多的线程,所以我想我应该很高兴,继续前进。非常令人不安。再次感谢。