问题标签 [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 投票
2 回答
1332 浏览

tcp - Berkley sockets的shutdown函数,有多重要?

作为背景,我有一个嵌入式设备,可以通过 IP 与第三方服务器通信。第三方服务器中的代码不太可能更改。在最近的一个版本中,我将 ip disconnect 函数更改为在调用 close() 之前调用 shutdown()(之前它只是调用了 close())。如果发生某些中断,嵌入式设备会在未完成通信会话的情况下断开连接。当这种情况发生在会话中的错误点时,服务器现在正在生成一个跟踪文件,由于各种原因,该文件对客户来说是不可接受的。这仅在调用 shutdown 时发生,服务器将此视为发送失败错误(并生成跟踪文件),而将更突然的 close() 视为不需要跟踪的另一端断开连接错误。

所以显而易见的解决方案是停止调用关机。Barnes 先生在这个问题中的回答很好地描述了这两个功能,但是,如果您知道只有一个进程连接到特定套接字,那么有什么理由在关闭之前使用关闭?

谢谢,帕特里克

0 投票
2 回答
854 浏览

api - 如何测试 Berkley 套接字 (BSD) API?

我想测试 BSP API 实现的正确性和完整性。测试集必须针对 ARM sam7x 进行交叉编译。

0 投票
5 回答
2704 浏览

c++ - 如何在 C++ 中使用 Berkeley 套接字避免 DOS 攻击

我正在阅读Richard Stevens 的UNIX Network Programming Volume 1 并尝试编写一个使用 Telnet 协议的 TCP Echo Client。我仍处于早期阶段并尝试编写读写函数。

我想写它来使用 I/O 多路复用和 Select 函数,因为它需要是多客户端的,我不想在尝试学习 Berkeley Sockets 库时尝试学习 C++ 线程同时。在 I/O 多路复用一章的末尾,Stevens 有一小节介绍 DOS 攻击,他说我计划使用的方法容易受到 DOS 攻击,这种攻击在连接后只发送一个字节然后挂起。之后他提到了 3 种可能的解决方案——非阻塞 IO、线程(出)和对 I/O 操作设置超时。

我的问题是,还有其他方法可以避免这种攻击吗?如果不是,其中哪一个是最好的?我浏览了关于设置操作超时的部分,但它看起来不像我想做的事情。他建议的方法看起来很复杂,我不知道如何将它们变成我已经拥有的。我只看了关于 NIO 的章节,看起来这是现在要走的路,但我想看看是否有其他方法可以解决这个问题,然后再花几个小时浏览这一章。

有任何想法吗?

0 投票
5 回答
8029 浏览

c - 如何忽略自己的广播 udp 数据包

对于以下我假设一个网卡。

我的程序有一个组件,旨在让子网中的其他人知道它的存在。为此,我实现了一个解决方案,每当程序启动时(以及之后定期),它都会向它发送一个广播INADDR_BROADCAST——任何在所需端口上监听的人都会记住它来自何处以供以后使用。

这样做的问题是我不想记住我自己的广播。我认为理论上这很容易做到 - 只需找出本地 ip 并与您获得的内容进行比较recvfrom

但是,我发现很难获得本地 IP:getaddrinfo使用 NULL 返回127.0.0.1getaddrinfo使用主机名返回公共 ip。谁能指出我找到实际子网 ip 的方向?我想我一定在这里遗漏了一些非常明显的东西,但是好吧……我仍然想念它:)

注意:我已经阅读了关于广播的其他 SO 问题,尤其是这个:UDP-Broadcast on all interfaces,但我还没有解决多接口问题。

0 投票
4 回答
10311 浏览

c - 取消引用指针确实违反了使用伯克利套接字的严格抗锯齿规则

我的代码看起来像这样,其中 addr 是 sockaddr*:

我相信这是使用 Berkeley 套接字的非常典型的代码。

但是,当我编译它时,我收到以下警告:
dereferencing pointer 'sin' does break strict anti-aliasing rules

在网上搜索,我发现一些关于我做事方式非常典型的事实的讨论,但是这个编译器警告也很真实,不是一件好事。

重做此代码以修复警告而不只是使其静音的正确方法是什么?

0 投票
4 回答
11314 浏览

c++ - 关于 recv 和读取缓冲区 - C Berkeley Sockets

我正在使用 berkeley 套接字和 TCP(SOCK_STREAM 套接字)。

过程是:

  1. 我连接到一个远程地址。
  2. 我给它发信息。
  3. 我从它那里收到一条消息。

想象一下我正在使用以下缓冲区:

问题是:

  • 我如何知道在第一次调用 recv 后读取缓冲区是否为空?如果它不为空,我将不得不再次调用 recv,但如果我在它为空时这样做,我会让它阻塞很长时间。
  • 我如何知道我读入了 recv_buffer 的字节数?我不能使用 strlen 因为我收到的消息可能包含空字节。

谢谢。

0 投票
3 回答
14537 浏览

c++ - 非常简单的 C++ TCP Echo 服务器

我是 C++ 网络编程的新手,但有 Java 套接字等方面的经验。

我一直在尝试用 C++ 编写一个简单的 TCP 回显服务器,但无法真正取得任何进展。我尝试查看一些代码,例如http://cs.baylor.edu/~donahoo/practical/CSockets/practical/,但无法正常工作。

任何人都可以给我一些简单的C++ 代码来开始使用 TCP 回显服务器之类的东西吗?我什至不明白如何开始。

提前致谢。

0 投票
2 回答
3433 浏览

sockets - 如果一个人没有将 POSIX 的 `recv` 称为“足够快”,会发生什么?

我想考虑一种可能的情况,即我的 TCP/IP 流套接字服务的客户端向我的服务发送数据的速度比它设法将数据移动到其缓冲区(我自然是在谈论应用程序缓冲区)recv和使用它的速度更快。

所以基本上,在这种情况下会发生什么?

显然,我的服务下的某种服务是用户应用程序,必须接收传入的流并将其存储在某个地方,直到我发出“recv”,对吗?最肯定的是操作系统。

我不想重新打开旧问题,但我似乎无法找到这个看似显而易见的问题的答案?

0 投票
2 回答
3197 浏览

c++ - 获取远程地址/IP - C Berkeley Sockets

如果我连接了一个套接字文件描述符(通过连接或绑定),请键入SOCK_STREAM,是否可以获得远程地址/IP 地址?

我需要在除了套接字文件描述符之外没有任何其他数据的函数中执行此操作。

0 投票
1 回答
6018 浏览

windows - Windows 和 Linux 中“使用中的地址”与 bind() 的区别 - errno=98

我有一个侦听端口的小型 TCP 服务器。在调试时,我通常会按 CTRL-C 来终止服务器进程。

在 Windows 上,我可以快速重启服务,并且可以重新启动套接字。在 Linux 上,我必须等待几分钟才能成功返回 bind()

当 bind() 失败时,它返回 errno=98, address in use。

我想更好地理解实现中的差异。Windows 确实对开发人员更友好,但我有点怀疑 Linux 是否在做“错误的事情”。

我最好的猜测是,Linux 会等到所有可能的客户端都检测到旧的套接字已损坏,然后才允许创建新的套接字。它可以做到这一点的唯一方法是等待它们超时

有没有办法在 Linux 开发过程中改变这种行为?我希望复制 Windows 执行此操作的方式