【发布时间】:2019-04-09 10:40:13
【问题描述】:
我面临一些问题,我需要一些帮助才能找到解决此问题的最佳方法。
问题来了——
我有一个正在运行的服务器代码,它有一个正在侦听接受新传入连接的套接字。
然后我尝试启动一个客户端,该客户端也有一个正在侦听接受新传入连接的套接字。
客户端代码首先在侦听套接字文件描述符上接受一个新连接,然后为 I/O 获取一个新的套接字文件描述符。
服务器做同样的事情并为 I/O 获取一个新的套接字文件描述符。
注意:客户端尚未完全启动。它需要从服务器接收一些字节并发送一些字节才能启动。
然后我介绍了 TCP/IP 网络连接上的一些数据包丢失。这会导致某些错误(例如:客户端进程中的 recv() 系统调用没有看到接收到的字节,然后关闭客户端的套接字连接并关闭关联的新套接字文件描述符。)但是,这会离开客户端进程挂起,因为 FD_SET 中有其他描述符,但它们都没有准备好 I/O。所以 pselect() 不断返回 0 个文件描述符,为 I/O 做好准备。客户端在启动之前需要通过连接发送和接收某些字节。
我的问题更多的是我应该在这里做什么?
当我在 accept() 系统调用期间创建新的套接字连接时,我对 SO_KEEPALIVE 选项进行了研究。但我认为这不会解决我的问题,特别是如果网络数据包丢失正在进行的话。
如果我意识到没有准备好 I/O 的文件描述符并且永远不会,我应该在这里终止客户端进程吗?有没有更好的方法来解决这个问题?
【问题讨论】:
-
如果您的客户端和服务器都只接受传入连接,那么是谁或什么发起了这些连接?
-
@JeremyFriesner - 代码创建父套接字以侦听服务器和客户端代码中的任何传入连接。当该套接字上有任何内容时,代码使用 accept() 系统调用来创建新的套接字连接。希望这会有所帮助。
-
通常客户端会连接到服务器。这里会发生这种情况吗? (如果不是,那么我会将这两个程序都描述为“服务器”)
-
是的,你可以这么说。这两个进程也在本地主机上。
标签: sockets client-server tcp-ip