UDP广播正在发送但未收到(是的,再次)

时间:2016-04-22 17:26:59

标签: sockets tcp udp broadcast

我有一个看似与this one相同的问题,但是检查过这个问题和其他问题我看不出差异。

我有一个接收UDP广播的应用。它可以正常循环回来,可以在同一台机器上从另一个应用程序接收。但是,当我尝试从外部GoPro Hero4 Black接收时,

  • 我可以在同一个应用程序中使用相机发送和接收TCP
  • 同一台机器上的另一个应用程序可以从相机接收UDP广播
  • 此应用程序什么也看不见

我使用INADDR_ANY正确检查了,它正在代码中完成。鉴于机器确实接收到数据包,并且应用程序本身可以使用相机执行TCP,错误必须在UDP接收代码中,但在同一台计算机上的应用程序之间可以正常工作。

问题:可能导致此行为的原因是什么?

我的信念是问题在于我对UDP广播接收的理解,但是,在回应评论时,这里是代码。这初始化了接收器:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    public HomeFragment fragment;

    //...

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new HomeFragment(); //modified
            case 1:
                ...
            default:
                return null;
        }
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
      if (position == 0) {
        fragment = (HomeFragment) createdFragment;
      }
      return createdFragment;
    }
}

这就是接收:

int yudpsocket_server(const char *addr,int port) {
    //create socket
    int socketfd=socket(AF_INET, SOCK_DGRAM, 0);
    int reuseon   = 1;
    int r = -1;
    //bind
    struct sockaddr_in serv_addr;
    serv_addr.sin_len    = sizeof(struct sockaddr_in);
    serv_addr.sin_family = AF_INET;
    if (addr == NULL || strlen(addr) == 0 || strcmp(addr, BROADCAST_IP) == 0) {
        r = setsockopt( socketfd, SOL_SOCKET, SO_BROADCAST, &reuseon, sizeof(reuseon) );
        serv_addr.sin_port        = htons(port);
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    } else {
        r = setsockopt( socketfd, SOL_SOCKET, SO_REUSEADDR, &reuseon, sizeof(reuseon) );
        serv_addr.sin_addr.s_addr = inet_addr(addr);
        serv_addr.sin_port = htons(port);
        memset( &serv_addr, '\0', sizeof(serv_addr));
    }
    if (r == -1) {
        return -1;
    }
    r = bind(socketfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    if (r==0) {
        return socketfd;
    } else {
        return -1;
    }
}

0 个答案:

没有答案