我不知道这是否是我处理Android的方式,还是我的 native 代码有问题,或两者兼而有之。
我正在C++中设置udp套接字(由swig生成的包装器):
udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (udpSocket < 0)
{
pthread_mutex_unlock(&csOpenCloseUdp);
throw IOException("Failed to open socket");
}
char bAllowMultiple = true;
setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, &bAllowMultiple, sizeof(bAllowMultiple));
setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&hopLimit, sizeof(hopLimit));
setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localAddr, sizeof(localAddr));
// Set to non-blocking mode
unsigned long bMode = 1;
ioctl( udpSocket, FIONBIO, &bMode );
// Create the local endpoint
sockaddr_in localEndPoint;
localEndPoint.sin_family = AF_INET;
localEndPoint.sin_addr.s_addr = localAddr.s_addr;
localEndPoint.sin_port = groupEndPoint.sin_port;
// Bind the socket to the port
int r = bind(udpSocket, (sockaddr*)&localEndPoint, sizeof(localEndPoint));
if (r == SOCKET_ERROR)
{
//LeaveCriticalSection(&csOpenCloseUdp);
pthread_mutex_unlock(&csOpenCloseUdp);
close();
throw IOException("Failed to bind port");
}
// Join the multicast group
struct ip_mreq imr;
imr.imr_multiaddr = groupEndPoint.sin_addr;
imr.imr_interface.s_addr = localAddr.s_addr;
setsockopt(udpSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&imr, sizeof(imr));
套接字不会引发任何异常,在此之后,它具有一些值,而不是INVALID_SOCKET。
当我尝试发送数据包时,
int r = sendto(udpSocket, (char*)dataToSend, (size_t)length, 0, (sockaddr*)&groupEndPoint, (socklen_t)sizeof(groupEndPoint));
我得到errno 101:网络无法访问。
我是套接字编程的新手,我知道Android中的套接字是一个不好的开始方式,但是事实是我必须完成这项工作,而且时间很少。这里有人知道网络不可达的可能原因吗?有没有人尝试过在Android上使用UDP并可以说明一些问题?
最佳答案
是否有使用C++套接字的要求?如果可能的话,为了节省时间,并且非常
为了所有人的利益,我建议使用Java API。这是一个如何使用它的示例:http://android-er.blogspot.com/2011/01/simple-communication-using.html。我喜欢C,但建议不要在这里使用它。
关于android - android ndk sockets网络不可达,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10408980/