博观而约取,厚积而薄发。这篇文章主要讲述关于android版本spice协议tls端口链接方式的bug问题相关的知识,希望能为你提供帮助。
【关于android版本spice协议tls端口链接方式的bug问题】最近在搞了搞android版本的spice协议.在andorid-spice官方github代码下载下来之后,编译成功并且顺利的运行在android系统上链接云桌面的时候,在非安全端口的情况下可以成功的链接到虚拟云桌面,但是非常非常让人头疼的是在tls端口下链接的时候总是链接不到云桌面,并且后台报了一堆ssl问题的错误.经过反复查找问题,原来这个问题是一个本来就存在的bug,是在ssl_read()函数执行的时候由于系统自身的某些原因导致有时候协议的数据是读取不成功的,如果在这时候让ssl_read()函数在读取异常情况下等待后台处理完之后再读几次就可以读取正确的业务数据.具体修改方法如下:
1.找到spice-channel.c文件.
2.找到spice_channel_read_wire函数.
3.修改逻辑如下
static int spice_channel_read_wire(SpiceChannel channel, void data, size_t len)
{
SpiceChannelPrivate *c = channel->
priv;
gssize ret;
GIOCondition cond;
int tmp_value_01;
cond = 0;
while (1) {
reread:
if (c-> has_error) {
return 0; / has_error is set by disconnect(), return no error /
}
if (c-> tls) {
ret = SSL_read(c-> ssl, data, len);
if (ret < 0) {
ret = SSL_get_error(c-> ssl, ret);
if (ret == SSL_ERROR_WANT_READ)
cond |= G_IO_IN;
if (ret == SSL_ERROR_WANT_WRITE)
cond |= G_IO_OUT;
if(ret == SSL_ERROR_SYSCALL){
g_socket_condition_wait(c-> sock, G_IO_OUT | G_IO_ERROR | G_IO_HUP, NULL, NULL);
continue; //goto reread; //
}
ret = -1;
}else{
//MC_DEBUG(" 66666666666666666666666666666 ret == %d::%x" ,ret,c-> ssl);
}
}
if (ret == -1) {
if (cond != 0) {
g_socket_condition_wait(c->
sock, G_IO_OUT | G_IO_ERROR | G_IO_HUP, NULL, NULL);
continue;
//goto reread;
//
} else {
c->
has_error = TRUE;
return -errno;
}
}
break;
}if (ret == 0) {
CHANNEL_DEBUG(channel, "Closing the connection: spice_channel_read() - ret=0");
c->
has_error = TRUE;
return 0;
}//MC_DEBUG("[123456] read_wire: ret = [%d] [%d]", ret, len);
return ret;
}
这是一个很全身疼的问题,在x86版本的spice-gtk代码中就没有这个ssl_read()的问题.
推荐阅读
- whatsapp怎么注册 whatsapp注册教程
- 让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
- mapper文件中“添加一条新数据并返回此数据的ID(主键)”的方法
- appium常用api
- Struts 2模型驱动拦截器示例图解
- Struts 2异常处理-异常拦截器
- Struts 2 execAndWait拦截器示例图解
- Struts 2准备拦截器用法示例
- Struts 2 Params拦截器示例