【发布时间】:2012-01-27 18:47:26
【问题描述】:
我正在使用 C 语言和 Linux 平台开发客户端-服务器应用程序。我想要实现的是在客户端和服务器上通过 TCP 连接更改套接字 ID,而不会丢失数据,其中客户端将数据从文件发送到主线程中的服务器。该应用程序是多线程的,其他线程根据设置的一些全局标志更改套接字 ID。
问题:应用程序通过 IPv4 和 IPv6 路径建立了两个 TCP 套接字连接。我首先在主线程中通过 TCP-IPv4 连接传输文件。另一个线程正在检查一些全局标志,并且可以访问/共享为主线程中的每个协议创建的套接字 ID。 send 和 recv 在其调用中使用指针变量来指向要用于数据传输的套接字 ID。数据最初通过 TCP-Ipv4 传输。一旦设置了全局标志并且进行了很少的其他检查,其他线程将更改用于发送调用的套接字 ID 以指向 IPv6 套接字。该线程还负责在两个主机之间传达更改。在切换之前,我将通过 IPv4 完全发送所有数据。此外,在刚刚切换套接字 ID 后,我正在通过 Ipv6 发送数据。但是在传输过程中,通过 IPv6 连接会丢失数据。(我在服务器端 send(*p_dataSocket.socket_id,sentence,p_size,0); 的发送函数中使用指针变量来动态更改指向 IPv6 套接字 ID 的指针)
两边recv和send调用后的错误分别是ESPIPE:Illegal seek,但是这个错误在切换之前就已经存在了。所以我很确定这与数据丢失无关
我正在使用pselect() 检查每个套接字的可用数据。我可以以某种方式理解切换时的数据丢失(如果处理不当),但我无法弄清楚为什么在切换后的传输过程中会发生数据丢失。我希望我清楚问题是什么。我还检查了通过每个协议单独发送数据而不进行切换,并且没有数据丢失。我最初通过 IPv6 传输数据,然后切换到 IPv4,没有数据丢失。除了使用errno 或netstat 之外,还希望知道如何调查此问题。
【问题讨论】:
-
我怀疑你需要做更多的解释。您是在处理客户端还是服务器或两者都处理?当然,一旦在套接字上建立了连接,它要么是 IPv4 要么是 IPv6 连接;如果不建立新的套接字连接,您将无法切换到其他协议,对吗?
-
@user369823,让我看看我是否明白,你在客户端和服务器之间同时建立两个 TCP套接字(
tcp和tcp6),然后开始数据传输通过tcp套接字。在中间的某个地方,您尝试通过tcp6套接字完成上述数据传输?这样做有什么可取的?如果您对切换套接字是认真的,为什么不在准备切换时关闭tcp套接字? -
@Mike,感谢您的回复-是的,您是对的。我在主线程中已经建立了两个连接。另一个线程基于一些标志和条件将发送函数中使用的指针切换到 IPv6 套接字。然后通过 IPv6 连接传输数据。我不确定关闭以前的连接会有什么帮助。当我通过 Ipv6 发送数据然后切换到 Ipv4 时,没有数据丢失。我不知道为什么反之亦然时会丢失数据。
标签: c tcp network-programming client-server ipv6