gpt4 book ai didi

c++ - 关闭阻塞 UDP 套接字的正确方法

转载 作者:可可西里 更新时间:2023-11-01 16:39:41 26 4
gpt4 key购买 nike

我有一个 C++ 对象,它创建一个线程来从阻塞的 UDP 套接字中读取数据:

mRunning.store(true);
while (mRunning.load(boost::memory_order_consume)) {
...
int size = recvfrom(mSocket, buf, kTextBufSize , 0,
(struct sockaddr *) &packet->mReplyAddr.mSockAddr, (socklen_t*)&packet->mReplyAddr.mSockAddrLen);

if (size > 0) {
//do stuff
}
}
return 0;

(mRunning 是一个 boost::atomic)对象的析构函数从另一个线程调用并执行此操作:

mRunning.store(false);  
#ifdef WIN32
if (mSocket != -1) closesocket(mSocket);
#else
if (mSocket != -1) close(mSocket);
#endif
pthread_join(mThread, NULL);

这似乎可行,但我的一位同事建议,如果 recv 在读取某些内容的过程中被中断,则可能会出现问题。这个线程安全吗?关闭阻塞 UDP 套接字的正确方法是什么? (需跨平台OSX/Linux/Windows)

最佳答案

可能会有很多不同的问题。将我的应用程序从一个 FreeBSD 版本移动到另一个版本,我发现这样的 close() 在较旧的内核上正常工作并且只是挂起 close() 直到从 recv() 在较新的内核上返回一些东西。 OSX 是基于 FreeBSD 的:)

从不同线程关闭套接字的可移植方法是创建管道和 block ,而不是在 recv() 中,而是在 select() 中。当您需要关闭套接字时,向管道写入一些内容,select() 将解除阻塞,您可以安全地执行 close()。

关于c++ - 关闭阻塞 UDP 套接字的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305441/

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