【问题标题】:"Invalid argument" when sending UDP packet, but which?发送UDP数据包时出现“无效参数”,但是哪个?
【发布时间】:2011-11-22 05:58:34
【问题描述】:

我的 C++ 应用程序正在以 UDP 数据包的形式发送二进制数据。 sendto() 调用返回 EINVAL(无效参数),但我没有看到我传递的参数有任何问题。

我对应用程序进行了 strace,以下是相关的系统调用:

socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 33
setsockopt(33, SOL_IP, IP_RECVERR, [1], 4) = 0
fcntl(33, F_SETFD, FD_CLOEXEC)          = 0
bind(33, {sa_family=AF_INET, sin_port=htons(1510), sin_addr=inet_addr("127.0.0.1")}, 16) = 0

sendto(33, "\2055\5\0\0\0\1\0\0\0\1\20 \0t\0c\300Ny\274B\10*\206H\206\367\r\2\5\0\200\200\331'\344\272\322\362sD\277\312\300\23\240\224\212\16\20\1\0\0\22", 55, 0, {sa_family=AF_INET, sin_port=htons(1510), sin_addr=inet_addr("219.132.100.190")}, 16) = -1 EINVAL (Invalid argument)

有人看到哪个参数无效吗?

该应用程序最近被移植以支持 IPv6,但我不知道这是否与它有关。

【问题讨论】:

  • 您的路由表是否包含到该地址的有效路由?你系统上的sizeof (sockaddr_in) 是什么?
  • @Ben:是的,有一条有效的路线,16 是 sockaddr_in 的正确长度。
  • 绑定到 127.0.0.1 可能绑定到 lo。 219.132.100.190 可能不是一个有效的地址,无法将数据发送到lo
  • 这可能听起来很奇怪,但请尝试删除对 bind 的调用。

标签: c++ sockets udp sendto invalid-argument


【解决方案1】:

您将套接字绑定到本地地址 127.1,但您正在发送到非本地地址。我需要检查一下,但也许 EINVAL 的意思是“你不能将 127.1 数据包发送到主机之外。”

【讨论】:

  • 或者等效地,路由表中没有使用接口lo的219.132.100.190目的地的路由。
  • 他将他的socket绑定到127.0.0.1。你不绑定本地地址。
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多