问题标签 [network-programming]

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 投票
8 回答
28753 浏览

ruby - Ruby - 查看端口是否打开

我需要一种快速的方法来确定给定端口是否已使用 Ruby 打开。我目前正在摆弄这个:

如果端口是打开的,它会很好用,但它的缺点是偶尔它会坐下来等待 10-20 秒,然后最终超时,抛出ETIMEOUT异常(如果端口关闭)。我的问题是:

可以将此代码修改为仅等待一秒钟(false如果到那时我们什么都没有返回,则返回)还是有更好的方法来检查给定端口是否在给定主机上打开?

编辑:调用 bash 代码也是可以接受的,只要它可以跨平台工作(例如,Mac OS X、*nix 和 Cygwin),尽管我更喜欢 Ruby 代码。

0 投票
7 回答
4042 浏览

java - 网络编程:是否维护套接字?

我目前正在将 API 从 C# 转换为具有网络组件的 Java。

C# 版本似乎在使用其类期间保持输入和输出流以及套接字打开。

它是否正确?

考虑到应用程序正在根据用户输入发送命令和接收事件,为每个“消息”打开一个新的套接字流是否更明智?

我正在维护一个 ServerSocket 来监听服务器抛出的事件,但我不太确定为出站通信维护一个 Socket 和输出流是一个好主意。

我不太习惯 Socket 编程。与许多开发人员一样,当我需要进行网络连接时,我通常在应用程序层工作,而不是在套接字层工作,而我在大学做这些事情已经有 5 或 6 年了。

为帮助喝彩。我想这更多的是寻求建议而不是明确的答案。

0 投票
2 回答
1060 浏览

c# - 处理基于线路的网络 I/O 流的好方法是什么?

注意:让我为这个问题的长度道歉,我不得不在其中输入很多信息。我希望这不会导致太多人简单地略读并做出假设。请完整阅读。谢谢。

我有一个通过套接字传入的数据流。该数据是面向行的。

我正在使用 .NET(BeginRead 等)的 APM(异步编程方法)。这排除了使用基于流的 I/O,因为异步 I/O 是基于缓冲区的。可以重新打包数据并将其发送到流,例如内存流,但也存在问题。

问题是我的输入流(我无法控制)没有给我任何关于流有多长的信息。它只是一个看起来像这样的换行符流:

因此,使用 APM,并且由于我不知道任何给定的数据集会有多长时间,数据块很可能会跨越需要多次读取的缓冲区边界,但这些多次读取也将跨越多个数据块。

例子:

我的第一个想法是使用 StringBuilder 并将缓冲区行简单地附加到 SB。这在某种程度上有效,但我发现很难提取数据块。我尝试使用 StringReader 读取换行数据,但无法知道您是否获得了完整的行,因为 StringReader 在添加的最后一个块的末尾返回部分行,然后返回 null 。没有办法知道返回的是否是完整的换行数据行。

例子:

更糟糕的是,如果我只是继续追加数据,缓冲区会变得越来越大,而且由于这可能一次运行数周或数月,这不是一个好的解决方案。

我的下一个想法是在阅读时从 SB 中删除数据块。这需要编写我自己的 ReadLine 函数,但后来我在读写过程中卡住了数据。此外,较大的数据块(可能包含数百个读取和数兆字节的数据)需要扫描整个缓冲区以查找换行符。它效率不高,而且很丑陋。

我正在寻找具有 StreamReader/Writer 的简单性和异步 I/O 的便利性的东西。

我的下一个想法是使用 MemoryStream,并将数据块写入内存流,然后将 StreamReader 附加到流并使用 ReadLine,但我再次遇到问题,知道缓冲区中的最后一次读取是否是完整的行或不是,而且从流中删除“陈旧”数据更加困难。

我还考虑过使用具有同步读取的线程。这样做的好处是,使用 StreamReader,它将始终从 ReadLine() 返回整行,除非在连接断开的情况下。但是,这会导致取消连接的问题,并且某些类型的网络问题可能会导致长时间挂起阻塞套接字。我正在使用异步 IO,因为我不想在程序阻塞数据接收的整个生命周期中占用一个线程。

连接是持久的。随着时间的推移,数据将继续流动。在初始连接期间,有大量数据流,一旦该流完成,套接字保持打开状态等待实时更新。我不确切知道初始流程何时“完成”,因为唯一知道的方法是不会立即发送更多数据。这意味着我不能等待初始数据加载在处理之前完成,因为它进入时我几乎被“实时”处理。

那么,任何人都可以提出一种不太复杂的方式来处理这种情况的好方法吗?我真的希望它尽可能简单和优雅,但由于所有边缘情况,我不断提出越来越复杂的解决方案。我想我想要的是某种 FIFO,我可以在其中轻松地继续追加更多数据,同时从中弹出符合某些条件的数据(即换行符终止的字符串)。

0 投票
1 回答
2978 浏览

tcp - 是否有一种算法可以对捕获的会话中使用的 TCP 拥塞控制算法进行指纹识别?

我想要一个程序来确定在捕获的 TCP 会话中使用的TCP 拥塞控制算法。

引用的维基百科文章指出:

TCP New Reno 是最常实现的算法,SACK 支持非常普遍,是 Reno/New Reno 的扩展。其他大多数是仍需要评估的竞争提案。从 2.6.8 开始,Linux 内核将默认实现从 reno 切换到 BIC。在 2.6.19 版本中,默认实现再次更改为 CUBIC。

还:

Compound TCP 是 Microsoft 的 TCP 实现,它同时维护两个不同的拥塞窗口,目标是在 LFN 上实现良好的性能,同时不损害公平性。它已与 Microsoft Windows Vista 和 Windows Server 2008 一起广泛部署,并已移植到较旧的 Microsoft Windows 版本以及 Linux。

确定正在使用哪种 CC 算法(来自捕获会话的第三方)的一些策略是什么?

更新

这个项目已经建立了一个工具来做到这一点:

互联网最近已经从同构拥塞控制发展到异构拥塞控制。几年前,互联网流量主要由标准 TCP AIMD 算法控制,而现在互联网流量由许多不同的 TCP 拥塞控制算法控制,如 AIMD、BIC、CUBIC、CTCP、HSTCP、HTCP、HYBLA、ILLINOIS、LP、 STCP、VEGAS、VENO、WESTWOOD+ 和 YEAH。然而,关于异构拥塞控制的互联网性能和稳定性研究的工作却很少。一个根本原因是缺乏不同 TCP 算法的部署信息。该项目的目标是:

0 投票
3 回答
896 浏览

java-me - 是否可以在 j2me 中将数据作为后台进程上传?

即使网络连接不佳?

具体来说,我编写的代码会启动一个单独的线程(来自 UI),该线程尝试通过 HTTP POST 上传文件。但是,我发现,如果连接不好,处理器会卡在 outputstream.close() 或 httpconnection.getheaderfield() 或任何强制数据通过网络的读/写上。这不仅会导致线程卡住,还会窃取整个处理器,因此甚至用户界面也会变得无响应。

我试过降低线程的优先级,但无济于事。

我的理论是没有简单的方法可以避免这种行为,这就是为什么所有 j2me 教程都指示开发人员创建一个“通过网络发送数据……”屏幕,而不是仅仅在后台线程中发送所有内容。如果有人能证明我错了,那就太好了。

谢谢!

0 投票
3 回答
17113 浏览

network-programming - Linux 上 C 语言中的默认网关

如何在 Linux 上使用 C 找到路由表的默认网关?

我不想调用 shell 或读取文件。有用于添加和删除路由(SIOCADDRT,SIOCDELRT)的 ioctl,我在参考获取路由(SIOCGRTCONF)时找到了,但似乎我使用的内核版本不支持 SIOCGRTCONF。

0 投票
4 回答
309 浏览

actionscript-3 - 协议简单性与“适当性”

我和我的一个朋友还有另一个争论。

考虑需要设计一个简单的基于 JSON 的协议,该协议基本上用于在各方之间发送某种事件(消息)。

说,像

我建议像上面一样保留这个协议,而我的朋友建议做类似的事情:

他的论点是,就像 TCP 和 HTTP 处于不同的“责任”层一样,该协议应该使用“详细信息”子对象以保持数据分离。

他的另一个论点是处理匹配事件的处理程序不应该知道任何有关“路由”信息(例如 event_id)的信息。

我的论点是:

  1. 为了向处理程序隐藏这些信息,我们正在增加每条消息的长度(以及网络流量,这对于与大量消息交换的系统可能很重要)
  2. 处理程序确实需要知道“路由”信息,例如,才能正确回答它们:

    /li>
  3. 即使我们需要从处理程序中隐藏 event_id 和类似的东西,我们也可以在传递给处理程序之前将它们去掉,这样仍然可以节省流量

该协议非常简单,不应该被其他任何人使用。

你怎么

0 投票
5 回答
6056 浏览

c++ - C++ 的网络框架(UDP 或 TCP)?

我正在使用SDLOpenGL编写一个线程化的跨平台应用程序(Linux/Windows),并且为了进行网络,我正在考虑使用 SDL Net2,因为它位于 SDL_Net 之上。

但是,我以前从未使用 C/C++ 进行过网络,因此我对任何可用的跨平台技术都不熟悉。有没有使用 SDL_Net 或 Net2 经验的人会建议使用不同的库?

0 投票
2 回答
2556 浏览

iphone - CFReadStreamHasBytesAvailable 轮询 - 最佳实践

我目前正在使用 轮询我CFReadStream的新数据CFReadStreamHasBytesAvailable

(首先,一些背景:我正在做自己的线程,我不想/不需要弄乱runloop的东西,所以客户端回调的东西在这里并不适用)。

我的问题是:民意调查的公认做法是什么?

Apple关于该主题的文档似乎没有太大帮助。

他们建议“在等待时做点别的事情”。我目前只是在做一些事情:

usleepsched_yield“足够好”吗?那里有一个“好”的号码可以睡觉usleep

(另外:是的,因为这是在我自己的线程中运行的,所以我可以阻止CFReadStreamRead- 这很好,但我也试图阻止上传进度和下载进度,所以阻止那里没有帮助...... )。

任何见解将不胜感激 - 谢谢!

0 投票
4 回答
821 浏览

c# - 套接字通信程序的测试

我从一个简单的 UDPClient 程序开始使用套接字编程来发送一些数据。大代码片段如下:

该示例在本地计算机上运行良好,但无法将数据发送到 Intranet 上的另一台计算机。

在测试期间

  • 我正在取消注释适当的代码以将数据发送到他的机器
  • 我正在他的机器上运行接收器位
  • 已检查他的机器上是否打开了所需的端口

我错过了什么吗?请建议。