我有一个看似与this one相同的问题,但是检查过这个问题和其他问题我看不出差异。
我有一个接收UDP广播的应用。它可以正常循环回来,可以在同一台机器上从另一个应用程序接收。但是,当我尝试从外部GoPro Hero4 Black接收时,
我使用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;
}
}