我有一个使用pthreads和c套接字的Android应用程序。
一个线程一直在接收-在while循环中等待来自服务器的数据。
当用户按下按钮时,应用程序会将数据发送到服务器(JNI调用),并且该应用程序“知道”根据答案进行的操作。
到目前为止,一切都很好。
当我添加另一个将每分钟发送一些数据的线程时,用户按下按钮时发送失败,并显示errno EPERM(不是所有者)。
我已经做过一些测试,它仅在某些设备上发生,大约40秒钟后,套接字被“释放”,当用户按下时,它发送数据。
有什么建议吗?
谢谢,
尼尔
编辑:
奇怪的是,此错误会在某些设备上出现(例如Nexus 4,Galaxy 2)。
另一个奇怪的是,其他进程发送的消息正在运行(用户按下按钮是另一个进程)。仅此带计时器的线程会引起问题。
编辑:源代码:
正在发送:
int send_to_server (char * buff, int len)
{
memset(&server_sockaddr_in, 0, sizeof server_sockaddr_in);
server_sockaddr_in.sin_family = AF_INET;
server_sockaddr_in.sin_addr.s_addr = inet_addr(get_server_ip());
server_sockaddr_in.sin_port = htons( REMOTE_SIP_PORT );
int ret = sendto(server_sock, buff, len, 0, (SOCKADDR*) &server_sockaddr_in, sizeof(server_sockaddr_in));
return ret;
}
线程功能:
void * timer_thread_func(void * nothing)
{
while ((main_run!=NULL))
{
sleep(60);
//prepare the request
send_to_server (i_buf, strlen(i_buf));
}
return NULL;
};
最佳答案
如果我错了,不要怪我,但我可以回想一下:
EPERM表示无权设置计划策略和参数
在attr中指定。
我也不知道pthreads是否需要sudo(root权限)才能打开和执行操作,但是如果一个线程已经在工作(您没有权限),您似乎无法打开另一个线程,应该将应用程序编写为有权这样做。