android设置tls版本,关于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, voiddata, 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()的问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值