Code Monkey home page Code Monkey logo

Comments (13)

qinzuoyan avatar qinzuoyan commented on June 7, 2024

关闭服务端是指结束server进程吗?如果server端进程结束了,client端和server端的连接不应当还处于ESTABLISHED状态。所以我没有太理解你的意思,你能说得更明白些吗?

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

是的,是直接结束server端进程后,发现client端和服务端的连接还处于ESTABLISHED状态,导致服务端再重启的时候提示 Address already in use

from sofa-pbrpc.

qinzuoyan avatar qinzuoyan commented on June 7, 2024

我自己测试:首先让client和server端正常通信,然后直接结束server端进程,发现client端进程中其与server端的连接会立即关闭并打印日志,同时通过netstat查看会发现连接由ESTABLISHED状态变为了TIME_WAIT状态。
请问你是用的最新版本测试的吗?

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

不是最新版的,我试试最新版的看看

from sofa-pbrpc.

qinzuoyan avatar qinzuoyan commented on June 7, 2024

@panshiming 好的,你去试试,我记得有修复过这个问题的,在RpcByteStream::close()里面有这样一行:

_socket.shutdown(tcp::socket::shutdown_both, ec);

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

@qinzuoyan 刚才下最小版本 用sample里的echo测试 client_sync改成死循环发送 关掉server进程->开启server进程 多试几次 client还是会出现当server关掉后仍然处于 ESTABLISHED状态

from sofa-pbrpc.

qinzuoyan avatar qinzuoyan commented on June 7, 2024

很奇怪,我这里没法重现,你的系统环境是?

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

Linux SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux ,感觉服务端关掉后客户端不能立即感应到,不知道是不是和asio机制有关系

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

[rd@idc01-solr-test-01 echo]$ ./server
libsofa_pbrpc INFO src/sofa/pbrpc/rpc_server_impl.cc:64] RpcServerImpl(): quota_in=-1MB/s, quota_out=-1MB/s, max_pending_buffer_size=100MB, keep_alive_time=-1seconds
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:104] start(): starting thread group [sofa_pbrpc_server_maintain_thread_group], thread_num=1
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:167] start(): thread group [sofa_pbrpc_server_maintain_thread_group] started, thread_num=1
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:104] start(): starting thread group [io_service worker thread], thread_num=8
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO server.cc:35] Init work thread succeed
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:167] start(): thread group [io_service worker thread] started, thread_num=8
libsofa_pbrpc ERROR src/sofa/pbrpc/rpc_listener.h:146] start_listen(): bind acceptor failed: 0.0.0.0:12321: Address already in use
libsofa_pbrpc ERROR src/sofa/pbrpc/rpc_server_impl.cc:141] Start(): listen failed: 0.0.0.0:12321
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO server.cc:41] Destroy work thread succeed
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:201] stop(): thread group [io_service worker thread] stopped
libsofa_pbrpc INFO src/sofa/pbrpc/thread_group_impl.h:201] stop(): thread group [sofa_pbrpc_server_maintain_thread_group] stopped

我机器上有一个客户端不停往12321端口发数据 这个时候按道理不应该影响server的启动的

from sofa-pbrpc.

qinzuoyan avatar qinzuoyan commented on June 7, 2024

你确定原来的server进程已经退出了?

from sofa-pbrpc.

panshiming avatar panshiming commented on June 7, 2024

嗯 确定 因为我是在前台运行的

from sofa-pbrpc.

qinzuoyan avatar qinzuoyan commented on June 7, 2024

真的奇怪了,你找一台不一样的机器试试,看是否也有这个问题呢?

from sofa-pbrpc.

cyshi avatar cyshi commented on June 7, 2024

@panshiming 应该是和boost版本有关系,你可以检查下你是不是用的boost 1.54.0
boost bug 8795

如果是这个版本的话,connect会一直返回成功,即使对端并不存在的情况下。

所以在你用死循环去大量发送请求到本地server的时候,极有可能client会使用12321端口去尝试连接server,而这时即使没启动server,rpc由于asio的bug也会导致判定连接成功,进而client在这个连接上尝试读写,这时在client这边看连接状态就是ESTABLISTHED,server因为端口被占用,所以无法启动

复现的话,你可以只启动一个死循环的client,不必启server,然后观察连接状态

可以通过升级boost解决,我本地用的boost版本1.56.0

补充个Simultaneous TCP

from sofa-pbrpc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.