嗨,我正在想办法在同一个程序中同时监听一个套接字并连接到不同的套接字(在相同的 ip 但不同的端口号上)。当我监听一个套接字时,它会一直阻塞,直到它收到一些消息,所以我我无法同时收听和连接。我实际上需要模拟不同路由器之间的 LSP 数据包交换。所以我正在编写一个程序来模拟路由器,以便运行它 n(路由器数量)次。
有人可以分享如何进行吗?
如果我正确理解了您的问题,其中之一可能会有所帮助。
多线程或多进程
基本上,当您收到客户端时,您可以在单独的线程或新进程中单独处理客户端。您将能够接收传入连接并连接到来自其他来源的新客户端,同时处理已经连接的客户端。
伪代码:
main() {
while(1) {
accept client
/*
After the fork or creation of the new thread, the loop goes back to
accepting clients while connected clients are being processed.
*/
fork or create new thread passing and client socket to it
}
}
processClient() {
do whatever you need to do...
}
选择
Select 是另一种实现非阻塞套接字的好方法。Select 基本上等待数据(即数据,新的客户端请求)到达服务器并一一处理它们。服务器不会阻止接受,因为它会等到它收到一些东西后再处理它。
伪代码:
main() {
while(1) {
wait on select
if new client {
accept it
}
for client in clients {
if client has data {
process it
}
}
}
}
ePoll(如果您使用的是 Linux)
ePoll 与 Select 类似,只是它可以处理 WAY 更多的客户,而且更性感。
这是一个包含所有这些的存储库。我的代码在这里并不完美,因为这是我在学校时做的一个项目。