我有一个使用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;
};
答案 0 :(得分:0)
EPERM表示没有设置调度策略和参数的权限 在attr。中指定。
此外,我不知道pthreads是否需要sudo(root权限)来打开和采取行动,但似乎如果一个人已经在工作,你就不能打开另一个帖子(你没有你应该写你的申请,以便有权这样做。