网络数据包丢失导致客户端代码行为异常

时间:2018-11-06 02:44:07

标签: sockets client-server tcp-ip

我正面临一些问题,需要以最佳方式解决此问题的一些帮助。

问题出在这里-

我正在运行服务器代码,其中有一个套接字正在侦听以接受新的传入连接。

然后,我尝试启动一个客户端,该客户端也有一个正在侦听以接受新传入连接的套接字。

客户端代码首先在侦听套接字文件描述符上接受新的连接,然后为I / O获取新的套接字文件描述符。

服务器执行相同的操作,并为I / O获取新的套接字文件描述符。

注意:客户端尚未完全启动。它需要从服务器接收一些字节并发送一些字节才能启动。

然后,我通过TCP / IP网络连接引入了一些数据包丢失。这会导致某些错误(例如:客户端进程中的recv()系统调用看不到接收到的字节,然后关闭了客户端的套接字连接,并且相关的新套接字文件描述符也被关闭了。)但是,这使客户端进程离开了挂起,因为FD_SET中还有其他描述符,但是它们都没有I / O准备就绪。因此,pselect()始终为I / O返回0个文件描述符。客户端需要先通过连接发送和接收某些字节,然后才能启动。

我的问题更多是我应该在这里做什么?

当我在accept()系统调用期间创建新的套接字连接时,就对SO_KEEPALIVE选项进行了研究。但是我认为这不能解决我的问题,尤其是在网络数据包丢失持续发生的情况下。

如果我意识到没有可用于I / O的文件描述符并且永远不会准备就绪,我应该在这里杀死客户端进程吗?有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了该问题,那么问题的核心是:“当中断了其功能中心的TCP连接时,您的客户端程序应该怎么做?”

该问题的答案实际上是一个优先问题-在这种情况下,您希望客户端程序做什么?或者换一种说法,您的用户会觉得哪种行为最有用?

在我自己的许多客户端程序中,我都包含了逻辑,使得与服务器的TCP连接一旦断开,客户端将自动尝试创建与服务器的新TCP连接,从而恢复其连接性和有用的功能尽快。

另一个明显的选择是在连接断开时让客户端退出。也许带有某种错误指示,以便用户知道客户端为什么离开。 (也许是一个错误对话框,询问用户是否要尝试重新连接?)

顺便说一下,

SO_KEEPALIVE在这种情况下可能对您没有太大帮助-尽管它的名字叫它的目的是帮助程序更及时地发现TCP连接丢失,< em> not ,以更努力地防止TCP连接丢失。 (而且,甚至还没有达到这个目的,因为在许多TCP协议栈中,每小时仅发送一个keepalive数据包左右,这意味着即使启用SO_KEEPALIVE,也可能需要很长时间才能完成程序开始收到反映网络连接中断的错误消息)