C unix 域套接字,recvfrom() 未设置 struct sockaddr* src_addr

2024-01-03

我正在编写一个通过 unix 域套接字侦听 UDP 数据包的应用程序。考虑以下代码块。

int sockfd;
struct sockaddr_un servaddr;

sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);

if(sockfd < 0)
{
    perror("socket() failed");
}

unlink(port);

bzero(&servaddr, sizeof(servaddr));
servaddr.sun_family = AF_LOCAL;
strcpy(servaddr.sun_path, port);    

if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
    perror("bind() failed");
    close(sockfd);
}

int n;
struct sockaddr_un cliaddr;
socklen_t len = sizeof(cliaddr);
discovery_msgs client_message;


bzero(&client_message, sizeof(client_message));
// Wait for a message to be received
n = recvfrom(sock_fd, &client_message, sizeof(client_message), 0, 
    (struct sockaddr *) &cliaddr, &len);

// At this point n = 560, client_message is filled with the expected data 
//len = 0 and cliaddr has no information about the client that sent the data

现在的类型是client_message并不重要,我正在接收一个 UDP 数据包并且client_message包含我期望的所有数据。当我看到时问题就开始了cliaddr and len打电话后recvfrom. cliaddr未被修改recvfrom就像正常网络 TCP/UDP 一样len调用后设置为0(这意味着recvfrom没有写入数据&cliaddr)。我需要以下信息cliaddr填充 unix 域路径,以便我可以发送响应。

我究竟做错了什么?


解决方案是在使用 Unix 域套接字时在客户端绑定套接字。否则,为发送 UDP 数据包而创建的临时路径名将立即消失sendto(),这就解释了为什么客户端的地址信息在服务器端不可用。

请参阅史蒂文斯网络编程第 419 页或查看解决此问题的示例客户端实现:libpix.org/unp/unixdgcli01_8c_source.html

#include    "unp.h"

int
main(int argc, char **argv)
{
    int                 sockfd;
    struct sockaddr_un  cliaddr, servaddr;

    sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);

    bzero(&cliaddr, sizeof(cliaddr));       /* bind an address for us */
    cliaddr.sun_family = AF_LOCAL;
    strcpy(cliaddr.sun_path, tmpnam(NULL));

    Bind(sockfd, (SA *) &cliaddr, sizeof(cliaddr));

    bzero(&servaddr, sizeof(servaddr)); /* fill in server's address */
    servaddr.sun_family = AF_LOCAL;
    strcpy(servaddr.sun_path, UNIXDG_PATH);

    dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));

    exit(0);
}

Note: unp.h定义Bind()这就是简单的bind()进行一些错误检查(在史蒂文斯网络编程中常用)。以相同的方式,(SA *)相当于(struct sockaddr *).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C unix 域套接字,recvfrom() 未设置 struct sockaddr* src_addr 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 安装 Python 3.5 包“socket”pycharm 时出错

    仅使用 PyCharm 或命令提示符无法安装此软件包 Collecting socket Using cached socket 0 5 tar gz Complete output from command python setup py
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 如何在 JavaScript 中模拟按键? [复制]

    这个问题在这里已经有答案了 我正在尝试找到一种模拟按键的方法 例如 当功能启动时 应按下 向下箭头 键 因此网页应稍微滚动 我只对 Chrome 感兴趣 jQuery 或纯 JS 都合适 纯 JS 会更可取 这是我尝试过的代码示例之一 va
  • 使用 find 排除子目录

    我有这样的目录结构 data abc incoming def incoming processed 123 incoming 456 incoming processed Data 目录内的所有文件夹中都有一个传入子文件夹 我想获取除 d
  • 将作品放入 Postman 但不放入 AXIOS

    这是我的 MERN 应用程序中最奇怪的事情 当我从 Postman 向我的 api 执行 PUT 时 它会工作并更新我的 api 和 mongoDB 在前端 即使控制台日志显示正确的值并且 url 相同 它也不会更新 api 任何帮助或指导
  • 是否有固定大小分配器的优雅 C++ 实现?

    我认为如果必须包含的头文件数量尽可能少 C 库就是 优雅的 我知道已经存在固定大小的分配器 例如Loki SmallObjectAllocator and boost pool 虽然两者都很优秀 但我认为它们不够优雅 也不容易无缝集成到项目
  • 我应该如何使用 pandas 处理时间序列数据中的重复时间?

    我从 API 调用返回以下内容作为更大数据集的一部分 时间 datetime datetime 2017 5 21 18 18 1 tzinfo tzutc 价格 0 052600 时间 datetime datetime 2017 5 2
  • T-SQL 如何匹配多行

    有两个表 包装表和产品表 就我而言 包装中包含多种产品 我们需要识别多个产品是否可以与包裹记录中已有的包裹匹配 一些脚本如下 DECLARE tblPackage TABLE PackageID int ProductID int INSE
  • Mailgun Laravel 发送电子邮件错误 客户端错误消息

    在 Laravel 5 1 上设置 mailgun 后 我确实收到错误消息 客户端错误响应 url https api mailgun net v3 messages mime https api mailgun net v3 messag
  • 如何在脚本化 ssh 命令中使用简单引号和双引号

    我正在编写一个小型 bash 脚本 并希望通过 ssh 执行以下命令 sudo i mysql uroot pPASSWORD execute select user host password last changed from mysq
  • ICU 资源包是否用于消息翻译资源

    我了解 ICU 的本地化部分 日期 时间和货币格式 排序规则等 当谈到消息翻译时 我看到人们说 ICU 不提供消息翻译功能 例如检查这个 SOF 问题 https stackoverflow com questions 5644412 ph
  • 工作单元模式的实现

    我首先使用 ASP NET MVC 和实体框架代码创建一个应用程序 我正在使用存储库和工作单元模式 并受到以下链接的影响 http www asp net mvc tutorials getting started with ef 5 us
  • Intellij 在新块中添加额外的行

    当我在 Intellij 中编写代码时 我经常通过键入以下类型的序列来创建新块 if test 键入左大括号会导致 Intellij 自动插入右大括号并将光标移动到两个大括号之间 if test 此时 我只需按 Enter 即可获得一个格式
  • 谷歌地图打开时的信息窗口事件

    您好 我正在使用谷歌融合表和谷歌地图 问题是我的标记显示正确 但我想在信息窗口中插入一些图像 所以问题是我进行查询来查找这些标记的位置 并且这些标记可以有许多类别 这就是为什么我无法使用合并表 当用户单击标记时 信息窗口将显示并显示标记上的
  • Java URL:未知协议“C”

    我知道有similar对这个问题的提问 比如this https stackoverflow com questions 7243550 unknown protocol c jdom a saxbuilder一 但是 在读完 类似标题的问
  • Facebook 如何禁用浏览器的集成开发人员工具?

    显然 由于最近的诈骗 开发人员工具被人们利用来发布垃圾邮件 甚至用于 破解 帐户 Facebook 屏蔽了开发者工具 我什至无法使用控制台 他们是怎么做到的 Stack Overflow 上的一篇帖子声称这是不可能的 https stack
  • Angular2 - 具有登录结构的路由器出口

    我正在构建 angular2 应用程序 目前我有一个带有导航栏 工具栏和路由器出口的主组件用于主要内容 我想为登录机制添加一个额外的页面 因此 如果用户未经过身份验证 登录页面将显示在整个屏幕上 用户登录后将导航到具有上述结构的组件 我该如
  • 使用pm2将环境变量传递给node.js

    我正在尝试将一些参数传递给由 pm2 运行的 Express 应用程序 他们的文档中没有任何提示这样做 但显然可以将一些 EV 传递到您的节点应用程序 例如SOME STUFF xxx pm2 start app js 注意 更新环境中的环
  • Spring Integration 中下游流完成后,如何从队列中一次轮询 1 条消息

    我目前正在努力提高集成流程的性能 尝试并行化消息处理 我已经使用 Java DSL 实现了所有内容 当前的集成流程从具有固定轮询器的队列通道获取消息 并通过多个处理程序依次处理该消息 直到到达最终处理程序 该处理程序会考虑前一个处理程序的每
  • 未捕获的 ReferenceError:无法处理与 Ajax 的绑定

    我有两个分层的 MVC4 NET 应用程序 带有 DAL 层和 Web 层 我在尝试将数据与 Ajax 返回的数据绑定时遇到问题 在 Html 上 我试图获取 SubcriteriaList 成员并在填写每个成员的值时为每个成员创建表 HT
  • 我们是否可以设置持久的默认参数,这些参数在明确更改之前一直保持设置状态?

    下面是一个函数fn预期结果是a b c在每次调用时定义fn 是否传递对象参数 如果传递设置属性的对象 则应仅为该对象设置属性 const fn opts a 1 b 2 c 3 gt console log opts 当不带参数调用时 结果
  • C unix 域套接字,recvfrom() 未设置 struct sockaddr* src_addr

    我正在编写一个通过 unix 域套接字侦听 UDP 数据包的应用程序 考虑以下代码块 int sockfd struct sockaddr un servaddr sockfd socket AF LOCAL SOCK DGRAM 0 if