- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的项目代码创建了一个 UDP 套接字来接收多播数据包。该代码可移植到 Linux 和 Solaris 操作系统。我的项目的一个扩展是在使用 recvmsg() 函数时寻找检索 UDP 数据包的源 IP 地址。我曾就此事询问过一位专家,她提到 Linux 似乎能够提供源 IP 地址,但 Solaris 在使用 recvmsg() 函数时可能无法提供。所以我在这里提出问题,我能否在 Solaris 10 上使用 recvmsg() 检索源 IP 地址?
操作系统:Solaris 10、Sunstudio 12 cc(无 U1 或 U2)。代码库:C/C++
//Socket initially opened with the following options from a different function.
// This connects the socket to receive multicast:
setsockopt(data->fd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
(char *)&mregs, sizeof(mregs) ) < 0)
//A different function performs an infinite loop reading from the socket:
struct iovec vector;
vector.iov_base = buf; //passed in param
vector.iov_len = len; //passed in param
struct msghdr msg;
char caddr[100] ;
msg.msg_name = caddr;
msg.msg_namelen = 100;
msg.msg_iov = &vector;
msg.msg_iovlen = 1;
int flags = 0;
char controlBuffer[1024];
msg.msg_control = controlBuffer;
msg.msg_controllen = 1024;
bytes = ::recvmsg(data->fd, &msg, flags);
//removed error checking
struct cmsghdr *cmsg;
struct in_pktinfo *dest_ip_ptr;
rrcp_u32_t dest_ip = 0;
cmsg = CMSG_FIRSTHDR(&msg);
for ( cmsg = CMSG_FIRSTHDR(&msg);
cmsg != NULL;
cmsg = CMSG_NXTHDR( &msg, cmsg ) )
{
//if ( cmsg->cmsg_type == IPPROTO_IP && cmsg->cmsg_level == IP_PKTINFO )
{
#ifdef Linux
struct in_pktinfo *dest_ip_ptr = (struct in_pktinfo*)CMSG_DATA(cmsg);
dest_ip = dest_ip_ptr->ipi_addr.s_addr;
#else
//in_addr only has 1 address
struct in_addr * dest_ip_ptr = (struct in_addr *)CMSG_DATA(cmsg);
dest_ip = dest_ip_ptr->_S_un._S_addr;
#endif
}
}
if( ipaddr )
ipaddr->IP = dest_ip;
//according to the Linux article mentioned below, the caddr should have the source
//socket address. In my case, the caddr field is not filled with any coherent data,
//so this does not seem to be the source address. Then again, "source socket" could
//be the interface IP on the local machine, which isn't what I need.
我还看到了以下文章,但它们似乎没有回答我的问题: Get destination address of a received UDP packet ,解决方案:Get destination address of a received UDP packet
最佳答案
有两个问题:一是你哪里都不用caddr
也不说是什么,所以不好帮你;另一个(可能是您遇到的问题)是您从 recvmsg
获得的地址不是字符串。
msg.msg_name
应该指向一个struct sockaddr_in
而msg.msg_namelen
应该是sizeof(struct sockaddr_in)
.然后您可以从中获取地址。
关于c++ - Solaris 10 -- 从 recvmsg() 的 UDP 多播数据包中获取 IP 源地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922740/
iam 尝试使用 sendmsg、recvmsg 函数在两个进程之间传递文件描述符.. 我通过在unix域中创建套接字来做到这一点。 当我执行它时,我收到了recvmsg的操作不支持错误,它与send
我正在使用 recvmsg 和 sendmsg 通过异步 STREAM 套接字发送数据。要传输的数据量相当大,在 15 MB 到 30 MB 之间。 我不明白为什么数据到达时损坏了。发送消息和接收函数
我有套接字系列 PF_PACKET 类型 SOCK_RAW。通过 recvmsg 和 poll() 读取消息。我随机地和定期地收到 recvmsg 返回 EDEADLK。我尝试用下一个代码调试这个问题
本文整理了Java中org.zeromq.ZMsg.recvMsg()方法的一些代码示例,展示了ZMsg.recvMsg()的具体用法。这些代码示例主要来源于Github/Stackoverflow/
自 recvmsg()在 asyncio 中丢失模块,我试图以与 BaseEventLoop.sock_recv() 完全相同的方式重新实现它已实现: import asyncio, socket d
我正在Linux中打开RAW套接字并读取所有消息。 recvmsg(mysock, &msg, 0); 我遍历该msg缓冲区上的所有cmsg,但只有一个。 for (c = CMSG_FIRS
如果C套接字的recvmsg()具有队列,我如何找出队列中积压了多少项? 我的问题是,从recvmsg()接收到某些内容后,代码的速度有时会比发送到recvmsg()的数据速率慢,这在逻辑上会导致排队
我在接收 UDP 数据包时遇到问题。我的环境在 ARMv7 上运行 Android 2.1。对于 C 套接字编程,我使用 recvmsg 从内核接收数据包,但偶尔会出现一些数据包丢失事件。发送方和接收
我正在开发一个在两个进程之间进行IPC调用的程序。我使用socketpair创建两个套接字fd: int fds[2] = {-1,-1}; if (socketpair(AF_LOCAL, SOCK
在这个问题上有点困惑 :-)。我有一些代码在 Ubuntu 10.04 上运行,它使用 recvmsg 调用来接收音频 UDP 数据包。这部分是一个更大的 SIP 客户端的一部分,我一直在通过网络使用
我正在编写一个程序,使用 sendmsg 在两个进程之间传递文件描述符和 recvmsg通过域套接字。对于发送文件描述符,附加数据包含在 msghdr.msg_iov 中和 msghdr.msg_io
我有一个使用 pthreads 的小 Unix 守护进程。一个线程循环运行,使用 recvmsg 读取网络数据包。当守护进程收到信号时,会设置一个标志,告诉所有线程跳出循环并退出。然而,“监听”线程从
我正在编写一个 CAN 记录器程序。我记录数据的方式类似于 candump -tool 在调用 candump 时执行此操作喜欢 candump any : https://github.com/li
我正在使用 Linux 机器,并且正在发送 UDP 数据包。 我想为传输的数据包获取 NIC 上的硬件时间戳。我看过其他帖子并设置了适当的标志。 int flag = SOF_TIMESTAMPING
在unix系统上使用TCP套接字,python似乎完全忽略了我的ancbufsize。 data, ancdata, msg_flags, address = sock.recvmsg(1, sock
我必须使用 recvfrom() 从多个接口(interface)接收(在编译时未知,并且还需要保留消息的确切顺序,而不是使用单独的系统调用从每个接口(interface)接收反过来),但我还需要访问
我在 Linux 中有一个使用 C 的应用程序,其中我创建了一个套接字来接收 IPv6 UDP 数据包。 为了接收数据包,我使用了 recvmsg(),因为我需要检索 ifindex,我可以使用选项
在使用 recvmsg 时,我使用 MSG_TRUNC 和 MSG_PEEK,如下所示: msgLen = recvmsg(fd, &hdr, MSG_PEEK | MSG_TRUNC) 这给出了为下
我正在使用 UDP 的 Haskell 中编写一个隧道应用程序。为了让它“正确”,我想适本地设置 MTU。但是,我找不到任何简单的方法来做到这一点。 haskell 中是否有一个 recvmsg()
我在 CentOS 6.5 上,内核版本为 kernel-2.6.32-431.el6。 我试图找到 recvmmsg() 的实现,希望我没有看错源代码 ~/rpmbuild/BUILD/kernel
我是一名优秀的程序员,十分优秀!