我遇到了客户端/服务器应用程序的问题,这是一个更大的分布式计算系统的一部分。客户端是运行用C编写的本机Android NDK应用程序的Android设备。在某些时候,客户端将注册消息发送到服务器应用程序,该应用程序也用C编写并在Windows机器上运行。
奇怪的是,在设备上安装Android应用程序后,一切正常。但是,一段时间后Socket问题就开始了。所有connect()
函数调用都以客户端的超时结束。该错误不是确定性的,并且发生在不同的时间点。为了使其再次工作,我必须手动卸载Android中的应用程序并重新安装它。之后,我工作了一段时间,然后错误再次开始。在普通Windows PC上运行的客户端上使用相同的C代码,并且不会出现问题。
网络连接很好,如果服务器端口是打开的,并且可以通过客户端设备使用Simple Socket Tester应用程序访问,我检查了网络连接。我还给了Android使用Internet的权限,connect()
调用的参数是正确的。
编辑:
很抱歉找不到代码。我认为错误是显而易见的,并且基于不同的平台,因为它适用于Windows并且我在Android NDK中没有经验。这是代码:
int pi_connect(SOCKET s, const SOCKADDR *name, int namelen)
{
int result = connect(s, name, namelen);
if (result < 0) {
ALOG("Socket connecting error!");
return -1;
}
return result;
}
SOCKET pi_socket(int af, int type, int protocol) {
SOCKET returnSocket = socket(af, type, protocol);
int yes = 1;
if (setsockopt(returnSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
{
perror("Server-setsockopt() error!");
exit(1);
}
if (returnSocket < 0) {
ALOG("Socket creation error!");
return -1;
}
return returnSocket;
}
SOCKET setupSendSocket(u_long host, int hostPort) {
SOCKET sendingSocket;
SOCKADDR_IN addr;
sendingSocket = pi_socket(AF_INET, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons(hostPort);
addr.sin_addr.s_addr = host;
long rc = pi_connect(sendingSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR));
if (rc < 0) {
return 0;
}
return sendingSocket;
}
void requestOwnIP() {
SOCKET connectedIPSocket = setupSendSocket(inet_addr(brokerIP), 34123);
if(connectedIPSocket==0)
return;
sendBHeartbeatMessage(connectedIPSocket);
myIP = receiveBIPMessage(connectedIPSocket);
pi_closesocket(connectedIPSocket);
}
在NDK应用程序的main函数中调用requestOwnIP()
函数。
EDIT 2(一些新评论):重启设备后,connect()
再次成功,系统工作一段时间。操作系统的进程表中是否存在可能导致此问题的内容?我首先虽然可能是大量的套接字处于time_wait
状态,但我添加了SO_REUSEADDR并且问题仍然存在。
我真的很感激一些帮助。提前谢谢!
此致 多米尼克