jni socket 异常的问题
程序第一次运行能正常连接到服务器. 并能进行数据传输 . 发命令到服务器请求断开连接 .并关闭socket 后 . 重新连接服务器 . 运行到这段代码 result = select(sk.socket+1,NULL,&writefds,NULL,&tv); 这段代码. 返回0 . 重启模似器后. 第一次能正常运行 . 请大家指点.
sk.socket = socket(AF_INET,SOCK_STREAM,0);
if(sk.socket == SOCKET_ERROR)
{
return 0;
}
unsigned long ul = 1;
result = ioctl(sk.socket, FIONBIO, &ul); //设置为非阻塞模式
if(result==-1)
{
__android_log_print(ANDROID_LOG_ERROR,"Tag", " ioctl FIONBIO error mark :%d \n", result );
return 0;
}
int error;
result = connect(sk.socket,(struct sockaddr*)&m_DeviceAddr,sizeof(struct sockaddr));
if( result == -1 )
{
if (errno == EINPROGRESS)
{// it is in the connect process
struct timeval tv;
fd_set writefds;
tv.tv_sec = 30;
tv.tv_usec = 0;
FD_ZERO(&writefds);
FD_SET(sk.socket, &writefds);
result = select(sk.socket+1,NULL,&writefds,NULL,&tv);
__android_log_print(ANDROID_LOG_ERROR,"Tag", " select error :%d \n", result );
if(result>0)
{
int len = sizeof(int);
getsockopt(sk.socket, SOL_SOCKET, SO_ERROR, &error, &len);
if(error==0)
{
unsigned long ul = 0;
result = ioctl(sk.socket, FIONBIO, &ul);
if(result==-1)
{
return 0;
}
struct timeval timeout={3,0};//3s
result = setsockopt(sk.socket,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
if(result>0||result<0)
{
return 0;
}
result = setsockopt(sk.socket,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
if(result>0||result<0)
{
return 0;
}
memset(buf,0,200);
result = ReceiveData(sk.socket,m_DeviceTypeInfo,64,20);
if( result == SOCKET_ERROR)
{
sk.socket = NULL;
return 0;
}
netprotrocolver = *((unsigned long*)m_DeviceTypeInfo+3);
return 1;
}
}
else
{
__android_log_print(ANDROID_LOG_ERROR,"Tag", " error :%d \n", errno );
}
}
else
{
return 0;
}
sk.socket = NULL;
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论