草庐IT

c++ - 网络:当接口(interface)打开/关闭时在所有接口(interface)上绑定(bind)一个套接字

我正在创建一个需要在特定端口上监听所有网络接口(interface)的套接字。我使用INADDR_ANY创建它,因此套接字可以正确监听所有本地IP地址。我的问题是:如果新接口(interface)上线会怎样?套接字会自动监听新接口(interface),还是我必须重新绑定(bind)它?示例:我的套接字已经在监听,我创建了一个wifiad-hoc连接。我是否需要检测是否有可用的新接口(interface)(临时接口(interface)),然后重新绑定(bind)套接字?(我现在在Windows上使用C++,但代码必须移植到MacOS) 最佳答案

c++ - 阻塞套接字性能与非阻塞套接字

我需要编写一个C++程序以高速接收来自2个不同NIC的udp数据包-每个套接字大约45MB/s(同一台计算机上每个NIC的单个套接字)。我首先创建了一个基于事件的套接字(使用WSAEventSelect),但我想知道:这种类型的套接字模型(基于事件)是否可能意味着一些性能损失?(因为事件将以高速率触发,因此操作系统可能会导致一些延迟)如果我选择阻塞套接字,我会减少延迟吗?在高吞吐量下,阻塞套接字的性能可能优于非阻塞套接字,这对吗?注意:可伸缩性不是问题,因为我们处理的套接字不超过两个。谢谢,空调 最佳答案 如果您只有两个套接字,为什

c++ - 在两个不同的程序之间发送/接收数据

我主要在这里寻找一些建议。我正在开发一个应用程序,其中主要处理(存储在服务器上)是用C++执行的,GUI(前端)是用Python执行的。这两个程序将相互通信。Python将发送C++程序运行所需的文件,并为C++程序提供一些数据以供处理。后端随后将与处理后的数据进行通信。因此使用套接字会更好吗?我想过使用文本文件来完成这个,但是,已经放弃了这个想法,而是将数据保存为.txt文件,以便将来可以打开它。另外,如果我要使用套接字,使用Python/C++会不会有任何冲突? 最佳答案 尝试ZeroMQØMQ(alsoknownasZeroM

c++ - 如何确定通过套接字接收到的(序列化和模板化)对象是什么类型?

我正在使用googleprotobuf实现一个简单的Request/Response基于协议(protocol)。对等点可以通过socket接收两者Request和Response,(当然是serialized)作为string.我正在使用我自己的C++套接字实现,所以我实现了operator>>这样(同样适用于operator)从socket接收数据对象:...templatevoidoperator>>(M&m)throw(socks::exception){std::stringstr;if(!this->recv(str)){throwsocks::exception(">>f

c++ - boost ASIO 和线程之间的消息传递

我正在设计一个websocket服务器,它接收一条消息并将其保存到一个嵌入式数据库。为了阅读消息,我正在使用boostasio.要将消息保存到嵌入式数据库,我会看到几个选项:在同一线程上收到消息后,立即同步保存消息。在单独的线程上异步保存消息。我很确定第二个答案是我想要的。但是,我不确定如何将消息从套接字线程传递到IO线程。我看到以下选项:每个线程使用一个io服务并使用postfunction线程之间进行通信。这里不得不担心锁的争用。我应该吗?使用Linux域套接字在线程之间传递消息。据我了解,没有锁争用。在这里,我可能可以使用BOOST_ASIO_DISABLE_THREADS宏来获

c++ - 如何对 BSD 套接字进行单元测试

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭5年前。Improvethisquestion我正在使用BSD套接字在Ubuntu中编写基于服务器/客户端的C++应用程序。我使用GoogleC++测试框架作为我的单元测试框架。我想知道有没有一种方法可以在我的单元测试中创建服务器和客户端,这样我就可以测试服务器的监听/接受,以及双方的发送/接收。问题是,如果我要测试服务器的套接字接受(在监听端口之后),我怎样才能让一些客户端在这个测试中连接到它?我可以使用多线程让客户端连接到在同一TEST()(或T

c++ - 为什么调用closesock后socket accept函数不释放?

我有一个服务器应用程序打开套接字并监听连接。在应用程序中,我有一个单独的线程创建一个套接字,绑定(bind)它并调用它的监听和接受函数。当应用程序关闭时,我在创建的套接字上调用closesocket,然后等待套接字线程关闭。但是,如果线程正在等待接受函数,则线程永远不会完成。我以为调用cloasesocket后accept函数会返回。这是一个正确的想法吗?如果是这样,为什么接受函数不返回?是否有其他方法可以使accept函数返回? 最佳答案 除非select表示可以,否则不要调用accept。在那种情况下,accept永远不会阻塞。

c++ - 在创建的 QThread 中运行所需的 Qt Socket 阻塞函数。有办法过去吗?

标题很隐晦,就这样吧!我正在编写一个以非常同步的方式运行的客户端。由于协议(protocol)和服务器的设计,一切都必须按顺序发生(发送请求、等待回复、服务回复等),所以我使用阻塞套接字。这就是Qt的用武之地。在我的应用程序中,我有一个GUI线程、一个命令处理线程和一个脚本引擎线程。我在命令处理线程中创建QTcpSocket,作为我的Client类的一部分。Client类有各种方法,归结为写入套接字、读回特定数量的字节并返回结果。当我尝试从脚本引擎线程直接调用客户端方法时出现问题。Qt套接字随机超时,当使用Qt的调试版本时,我收到以下警告:QSocketNotifier:socketn

c++ - 追踪 WinSock MFC 应用程序中句柄泄漏的来源

我们正在开发一个应用程序,我们在其中使用基于WinSock的sime套接字方法与外部模块进行通信。我们的要求是确保连接始终处于开启状态,因此,每当我们断开连接时,我们都会每1分钟不断重试连接。我们的问题从这里开始。我们观察到,在每次重试套接字重新连接时,它恰好泄漏了两个Windows句柄。我们尝试了很多选项,但没有一个有效。哪些句柄可能泄漏了,我们如何才能确定罪魁祸首?以下是我们现在使用的代码:boolCSocketClass::ConnectToServer(intnLineNo){stringstrIPAddress;intnPortNo;SOCKET*l_ClientSocket

c++ - C select() 超时 STDIN 单字符(无 ENTER)

我希望能够使用select()从STDIN输入单个字符(无ENTER)。因此,当用户按下单个键时,select()应该立即返回,而不是等待用户按下ENTER。intmain(void){fd_setrfds;structtimevaltv;intretval;/*Watchstdin(fd0)toseewhenithasinput.*/FD_ZERO(&rfds);FD_SET(0,&rfds);/*Waitupto2seconds.*/tv.tv_sec=2;tv.tv_usec=0;retval=select(1,&rfds,NULL,NULL,&tv);if(retval==-1