UDP当recvfrom时,有没有办法知道数据是发到本地的哪个IP,该如何处理

UDP当recvfrom时,有没有办法知道数据是发到本地的哪个IP
UDP当recvfrom时,只有对方的IP,本地多网卡时不知道是发到哪个IP的.

***注:只能就Listen(INADDR_ANY)来讨论


------解决方案--------------------
UDP层没办法,
问题是你需要知道这个来做什么,也许改变一下思路问题很容易就解决了
------解决方案--------------------
在IP层处理,网卡驱动过滤扽
------解决方案--------------------
有办法的,而且很简单,而且有好几种方法.
int ret = recvfrom(udp_sock, .................);
sockaddr_in addr;
int len = sizeof(addr);
getpeername(udp_sock, (sockaddr*)&addr, &len);
然后addr里,就知道本地的IP和端口.

还有一个办法,在recvfrom之前,对udp_sock调用bind,绑定到一个IP,把IP和SOCK的结构体指针存到list里面.以后有数据来也,查一下就知道.

探讨
UDP层没办法,
问题是你需要知道这个来做什么,也许改变一下思路问题很容易就解决了

------解决方案--------------------
简单问题,复杂处理了..
探讨
在IP层处理,网卡驱动过滤扽

------解决方案--------------------
如果是linux系统的话,可以使用recvmsg接口,ssize_t recvmsg(int s, struct msghdr *msg, int flags);先设置IP_RECVDSTADDR套接口选项,然后读取结构体struct msghdr {
caddr_t msg_name; /* optional address */
u_int msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
u_int msg_iovlen; /* # elements in msg_iov */
caddr_t msg_control; /* ancillary data, see below */
u_int msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
其中msg_name包含了源地址,目的地址去msg_control指向cmsghdr结构体找,
struct cmsghdr {
  u_int cmsg_len;
  int cmsg_level; 
  int cmsg_type; 
  //接着是4字节的目的地址;
  }
------解决方案--------------------
int ret = recvfrom(udp_sock, .................);
sockaddr_in addr;
int len = sizeof(addr);
getsockname(udp_sock, (sockaddr*)&addr, &len);

------解决方案--------------------
看Windows下解决方法
------解决方案--------------------
这个问题 值得探讨。
------解决方案--------------------
关注一下,等待真解出现
------解决方案--------------------
struct sockaddr_in sAddr;
int iNameLen = sizeof(sAddr);
getsockname(socket, (sockaddr *)&sAddr, &iNameLen);
char *pIP = our_inet_ntoa(sAddr.sin_addr);