thrift端口未被占用连接不上_Thrift第四课 连接中断异常处理

场景

Thrift框架采用了异常处理机制,当客户端异常断开连接,服务端这个时候尝试发送数据给客户端,Thrift库会抛出异常,导致进程中断。这种情况是非常正常的,服务器端应该捕获异常的发生,但是不应该异常退出。

在用户调用的线程进行异常捕获,这样子不需要修改代码

catch (const TTransportException& ttx)

{

//Thrift框架抛出的所有异常都会直接返回

std::cout<

return;

}

catch (const TException& ttx)

{

//Thrift框架抛出的所有异常都会直接返回

std::cout<

return;

}

分析一下服务器发送数据的函数

void TSocket::write(const uint8_t* buf, uint32_t len) {

uint32_t sent = 0;

while (sent < len) {

uint32_t b = write_partial(buf + sent, len - sent);

if (b == 0) {

// This should only happen if the timeout set with SO_SNDTIMEO expired.

// Raise an exception.

throw TTransportException(TTransportException::TIMED_OUT,

"send timeout expired");

}

sent += b;

}

}

但b==0抛出异常,代表当前发送超时。while循环是为了循环发送,因为一次不一定发送完用户数据,毕竟MTU的限制。注意sent是一个无符号整型,当b返回-1的时候,sent==0-1意味着将达到32位整数最大值,大于len,从而直接退出循环。因为套接字已经中断,所以发送失败,在调用write_partial函数的时候,返回b ==-1,导致退出循环,从而避免了抛出异常,因此返回-1,是非常合理的值

问题

1)  客户端没有调用close接口,关闭连接,服务器端只有唯一的一次closesocket代码,输出的字符串是\x1,目前暂时不知道在什么地方关闭套接字

2)  线程在空闲的时候是如何进行等待事件请求的

3)  pendingTaskCountMax_ 参数的具体含义是什么

4)isOpen函数其实只是确保了连接是否成功,如果连接成功之后,如果服务器断开或者客户端断开连接,这个时候判断isOpen函数的返回值是没有任何的效果的,这个时候只能够通过thrift自身的断开连接的检测机制,目前尚不了解会在什么时机释放连接

其他的处理细节

1)继承TServerEventHandler类,获取连接用户的基本信息包括IP和端口,从而监控是否保存有没有清除的连接

TServerEventHandler类提供了用户连接和断开的时候,针对套接字的处理方式,其中提供了两个函数

createContext 当一个新的用户连接的时候会被调用

deleteContext 当用户结束请求处理的时候会被调用

详细的流程可以查看TThreadPoolServer::Task,Task作为TThreadPoolServer的内部类,在Task::run函数内部,当有连接进来的时候,会获取TServerEventHandler类的对象,判断是否有实例化,对连接进行处理,详细的代码

boost::shared_ptreventHandler =

server_.getEventHandler();

void* connectionContext = NULL;

if (eventHandler != NULL)

{

connectionContext =eventHandler->createContext(input_, output_);

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值