问题标签 [berkeley-sockets]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
139 浏览

c++ - recvfrom 非阻塞返回 C++ 中的 BAD ADDRESS 错误

我在尝试收听而不是发送时收到“BAD ADDRESS”错误。发送与 sendto() 完美配合。

这是创建要侦听的套接字的函数。IP 和端口是本地的(这是为了在同一个本地网络中执行,实际上是在使用 linux 虚拟机和 windows 机器的同一台 pc 中)。

在 getaddrinfo(NULL, port, &hints, &addrInfoResults); 中使用 NULL 似乎要走的路:不知道为什么使用发件人的本地 IP(例如 192.168.1.50)不起作用。但发送工作。

连接时,任何呼叫均未收到错误消息。套接字已创建。接听电话是这个:

为什么我收到 BAD Address 错误?我已阅读与此相关的所有帖子,但没有任何帮助。我总是收到-1。

到目前为止我所做的测试:

  • 检查地址的大小。地址和长度是一样的。
  • 我创建了两个小控制台程序,令人惊讶的是它可以工作。仅当我将 getaddrinfo 设置为 NULL 时才会收到数据,但设置 IP 不起作用。这令人困惑。没有什么不同。
0 投票
0 回答
89 浏览

c++ - C++:尝试从服务器端套接字“写入”或“发送”在数百个请求后返回 -1

我已经使用标头在 C++ 中编写了基本服务器的代码sys/socket.h。运行服务器并响应请求的方法如下所示。只要成员变量 (Server::keep_server_设置为 true ),代码就会在连续循环中运行。收到 JSON 请求后,它会从映射中查找适当的处理程序,调用它以生成 JSON 响应,然后send/write将其返回给客户端:

此代码的功能与预期的数百个请求和响应周期一样,此时sendwrite(我都尝试过,它们都遇到相同的问题)返回-1,并且进程退出。

为什么socket写了这么久会突然失败?我应该如何处理?

编辑:澄清一下,所有客户端/服务器活动都在本地运行(即它们只是我机器上的两个不同线程)。

编辑 2:errno是 14,这显然是“错误的文件描述符”。

编辑 3:另一位用户建议提供一个最小的可重现示例。该错误似乎是由重复向服务器发送请求触发的。

为了实现这一点,我将首先提供我的服务器类的完整代码,这是一个将某个类作为模板参数的模板类。服务器在其构造中被传递一个此类的实例以及该类中的许多std::mem_fns,它绑定到某些命令类型。服务器随后通过在提供的模板参数类的实例上调用相关处理程序来处理请求:

我还定义了一个基本的客户端类,如下所示:

要重现我的问题,您只需要使用旨在处理 JSON 请求的方法定义基本服务器类型:

然后,实例化一个服务器映射方法到命令字符串。向它发送大量请求,并且在不到一秒的时间内,sendorwrite将返回 -1,导致程序抛出运行时错误:

希望这足以重现。对不起,如果这个问题以前格式不正确。

编辑 4:我想到这可能是与每个程序的最大文件描述符有关的问题。但是,我的程序在失败之前恰好完成了 2031 个请求-响应周期。这似乎不符合最大文件描述符上限。

0 投票
0 回答
34 浏览

socketcan - 向上/向下时的 SocketCAN 行为

SocketCAN 应用程序在 linux 平台上运行。启动时,它会使用适当的设置配置 canX,并在更高层 CAN 堆栈开始使用它之前启动套接字(“ip link”/“ifconfig”)。

按照设计,应用程序会关闭套接字,然后再次启动它而不会出现任何问题。但有时,TX 帧不再被发送出去,但 RX 帧仍然进来。测试从 canX 上的新套接字发送帧,例如通过新控制台,是可行的。这种情况并不总是发生,而是随机发生。

当套接字被取下并重新设置时会发生什么?描述符或其他动态分配是否已更改,导致应用程序对 canX 的使用过时?

0 投票
0 回答
5 浏览

berkeley-sockets - 如果另一端没有服务器正在侦听(),或者目标计算机无法访问,则连接()的正常行为是什么?

这是一个关于伯克利套接字的问题。

通常情况下,客户端会通过调用该函数连接到服务器connect(),并假设目标机器可达并且目标机器上的应用程序已经通过调用该listen()函数进入监听状态,从而建立连接。这还假设客户端正在尝试连接到正确的端口,并且服务器正在侦听该端口号。

我的问题是如果由于外部原因connect()失败会发生什么?内部原因可能是没有足够的可用资源,例如端口已在使用中,或者系统内存不足等。

connect()我想到的可能失败的两个重要外部原因是:

  • 目标机器IP地址不可达(没有到主机的路由,或者没有到网络的路由等)
  • 目标计算机在预期端口号上没有打开的侦听端口。(很可能监听服务器应用程序没有运行)

出现这个问题的原因是在内部原因失败的情况下,这些事情很可能在任何函数或系统调用返回时就已经知道了。

  • 例如,如果应用程序尝试访问connect()主机并且所需的系统资源不可用,则调用connect()可能会在函数返回时返回错误代码。可能是这种情况,因为connect()可能会通过 OS 系统调用与 OS 产生一些交互,并且这些系统调用将返回指示问题的错误代码。

另一方面,一旦消息/数据包从网络接口发送出去,关于这是否成功的信息将在一段时间内不知道。

  • 在网络不可达的情况下,操作系统可能会提前知道它无法将 IP 流量路由到某个子网,因为没有到该子网的已知路由。但它可能不会。“duckduckgo.com”可能在 5 分钟前可以访问,现在可能由于某种原因无法访问。
  • 即使操作系统在从网络接口发送数据包之前知道数据包可以路由到主机,它也不知道该数据包在途中会发生什么。(被防火墙过滤?主机可能没有打开和监听某个端口?)

在这种情况下,会发生什么?我假设该connect()函数必须返回,但即使即将发生错误也可能返回而没有错误。(由于外部原因,如上所述。)

这个问题的原因是我试图找出解决我正在开发的应用程序问题的最佳方法,其中用户输入了一个不存在或不响应的服务器的 IP 地址。目前,我对如何connect()在不知道如何处理的情况下如何工作知之甚少。

我应该补充一点,例如,我也不知道这是否在某些规范中定义,或者这是否是未定义的行为或取决于操作系统。