回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有两个后端。后端A和后端B.<br/>
后端B使用运行在端口4243上的套接字服务器发送和接收信息<br/></p>
<p>然后,使用后端A,我需要捕获该信息并保存它。但我还必须在后端a上有一个套接字服务器,在端口4243上运行</p>
<p>问题是,当我在运行后端B之后运行后端A时,我收到错误“<code>EADDRINUSE</code>”,因为我在两个应用程序上使用相同的主机:端口</p>
<p>如果,对于后端A,我使用Python,那么问题就会消失,因为我有一个名为<code>SO_REUSEADDR</code>的套接字配置<br/>
这里我们有一些例子:</p>
<ul>
<li><a href="https://www.programcreek.com/python/example/410/socket.SO_REUSEADDR" rel="nofollow noreferrer">https://www.programcreek.com/python/example/410/socket.SO_REUSEADDR</a></li>
<li><a href="https://subscription.packtpub.com/book/networking-and-servers/9781849513463/1/ch01lvl1sec18/reusing-socket-addresses" rel="nofollow noreferrer">https://subscription.packtpub.com/book/networking-and-servers/9781849513463/1/ch01lvl1sec18/reusing-socket-addresses</a></li>
</ul>
<p>但是,我想使用JavaScript对后端A进行编码,所以我使用<a href="https://nodejs.org/api/net.html" rel="nofollow noreferrer">net package</a>对套接字进行编码,但由于“<code>EADDRINUSE</code>”错误,我无法让它工作</p>
<p>NodeJS文档说“<a href="https://node.readthedocs.io/en/latest/api/net/#:%7E:text=(Note%3A%20All%20sockets%20in%20Node%20set%20SO_REUSEADDR%20already)" rel="nofollow noreferrer">All sockets in Node set SO_REUSEADDR already</a>”,但它似乎对我不起作用</p>
<p>这是我目前的代码:</p>
<pre class="lang-js prettyprint-override"><code>
// Step 0: Create the netServer and the netClient
console.log(`[DEBUG] Server will listen to: ${HOST}:${PORT}`);
console.log(`[DEBUG] Server will register with: ${AGENT_ID}`);
const netServer = net.createServer((c) => {
console.log('[netServer] Client connected');
c.on('message', (msg) => {
console.log('[netServer] Received `message`, MSG:', msg.toString());
});
c.on('*', (event, msg) => {
console.log('[netServer] Received `*`, EVENT:', event);
console.log('[netServer] Received `*`, MSG:', msg);
});
}).listen({
host: HOST, // 'localhost',
port: PORT, // 4243,
family: 4, // ipv4, same as socket.AF_INET for python
});
// Code copied from nodejs documentation page (doesn't make any difference)
netServer.on('error', function (e) {
if (e.code == 'EADDRINUSE') {
console.log('Address in use, retrying...');
setTimeout(function () {
netServer.close();
netServer.listen(PORT, HOST);
}, 1000);
}
});
const netClient = net.createConnection(PORT, HOST, () => {
console.log('[netClient] Connected');
});
// Step 1: Register to instance B of DTN with agent ID 'bundlesink'
netClient.write(serializeMessage({
messageType: AAPMessageTypes.REGISTER,
eid: AGENT_ID,
}));
</code></pre>
<p>使用此代码,我在终端中获得以下输出:</p>
<p><a href="https://i.stack.imgur.com/qhz8I.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qhz8I.png" alt="enter image description here"/></a></p>
<p>但是,使用Python代码,套接字成功连接:</p>
<p><a href="https://i.stack.imgur.com/PhUhO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/PhUhO.png" alt="enter image description here"/></a></p>
<p>我不知道该怎么办:(<br/>
我希望我能得到一些帮助</p>
<hr/>
<p>编辑1</p>
<p>顺便说一下,<code>lsof</code>命令为JavaScript后端抛出以下输出:</p>
<p><a href="https://i.stack.imgur.com/2u3Kn.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2u3Kn.png" alt="enter image description here"/></a></p>
<p>Python后端的另一个输出:</p>
<p><a href="https://i.stack.imgur.com/gXsRr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gXsRr.png" alt="enter image description here"/></a></p>
<hr/>
<p>编辑2</p>
<p>这似乎确实是JavaScript的问题。<a href="https://gist.github.com/eplawless/ac41bc976f2982ecfe0f4253883339aa" rel="nofollow noreferrer">I also found this snippet</a>:</p>
<pre class="lang-js prettyprint-override"><code>var net = require('net');
function startServer(port, host, callback) {
var server = net.createServer();
server.listen(port, host, function() {
callback(undefined, server);
});
server.on('error', function(error) {
console.error('Ah damn!', error);
callback(error);
});
}
startServer(4000, '0.0.0.0', function(error, wildcardServer) {
if (error) return;
startServer(4000, '127.0.0.1', function(error, localhostServer) {
if (error) return;
console.log('Started both servers!');
});
});
</code></pre>
<p>从本帖:
<a href="https://medium.com/@eplawless/node-js-is-a-liar-sometimes-8a28196d56b6" rel="nofollow noreferrer">https://medium.com/@eplawless/node-js-is-a-liar-sometimes-8a28196d56b6</a></p>
<p>正如作者所说:</p>
<blockquote>
<p>Well, that prints “Started both servers!” which is exactly what we don’t want.</p>
</blockquote>
<p>但对我来说,我没有打印它,而是得到了一个错误:</p>
<pre><code>Ah damn! Error: listen EADDRINUSE: address already in use 127.0.0.1:4000
at Server.setupListenHandle [as _listen2] (node:net:1319:16)
at listenInCluster (node:net:1367:12)
at doListen (node:net:1505:7)
at processTicksAndRejections (node:internal/process/task_queues:84:21) {
code: 'EADDRINUSE',
errno: -98,
syscall: 'listen',
address: '127.0.0.1',
port: 4000
}
</code></pre>
<p>我真的无法运行并打印“已启动两台服务器!”。<br/>
因为这就是我想要我的代码做的</p>
<hr/>
<p>编辑3</p>
<p>这是Python服务器套接字:<a href="https://gitlab.com/d3tn/ud3tn/-/blob/master/tools/aap/aap_receive.py" rel="nofollow noreferrer">https://gitlab.com/d3tn/ud3tn/-/blob/master/tools/aap/aap_receive.py</a></p>
<p>这是重要的部分:</p>
<pre class="lang-py prettyprint-override"><code>addr = (args.tcp[0], int(args.tcp[1])) # args.tcp[0] = "localhost", args.tcp[1] = "4243"
with AAPTCPClient(address=addr) as aap_client:
aap_client.register(args.agentid) # args.agentid = "bundlesink"
run_aap_recv(aap_client, args.count, args.verify_pl)
</code></pre>
<p>它创建了一个AAPTCPClient,而AAPTCPClient所做的唯一事情是:</p>
<pre class="lang-py prettyprint-override"><code>def __init__(self, socket, address):
self.socket = socket
self.address = address
self.node_eid = None
self.agent_id = None
def register(self, agent_id=None):
"""Attempt to register the specified agent identifier.
Args:
agent_id: The agent identifier to be registered. If None,
uuid.uuid4() is called to generate one.
"""
self.agent_id = agent_id or str(uuid.uuid4())
logger.info(f"Sending REGISTER message for '{agent_id}'...")
msg_ack = self.send(
AAPMessage(AAPMessageType.REGISTER, self.agent_id)
)
assert msg_ack.msg_type == AAPMessageType.ACK
logger.info("ACK message received!")
def send(self, aap_msg):
"""Serialize and send the provided `AAPMessage` to the AAP endpoint.
Args:
aap_msg: The `AAPMessage` to be sent.
"""
self.socket.send(aap_msg.serialize())
return self.receive()
def receive(self):
"""Receive and return the next `AAPMessage`."""
buf = bytearray()
msg = None
while msg is None:
data = self.socket.recv(1)
if not data:
logger.info("Disconnected")
return None
buf += data
try:
msg = AAPMessage.parse(buf)
except InsufficientAAPDataError:
continue
return msg
</code></pre>
<p>我没有看到任何绑定,我也不明白为什么python代码可以调用“<code>socket.recv</code>”,但在我的JavaScript代码中我不能调用“<code>netServer.listen</code>”。我认为应该是一样的</p>
<hr/>