jni socket 异常的问题

发布于 2022-09-30 11:58:59 字数 2299 浏览 13 评论 0

程序第一次运行能正常连接到服务器. 并能进行数据传输 . 发命令到服务器请求断开连接 .并关闭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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文