Я работаю над клиент-серверным приложением на C и на платформе Linux. Я пытаюсь добиться изменения идентификатора сокета через TCP-соединение как на клиенте, так и на сервере без потери данных, когда клиент отправляет данные из файла на сервер в главном потоке. Приложение является многопоточным, где другие потоки изменяют идентификатор сокета на основе некоторых глобальных установленных флагов.
Проблема: В приложении установлено два соединения с сокетом TCP по обоим путям: IPv4 и IPv6. Сначала я передаю файл через соединение TCP-IPv4 в основном потоке. Другой поток проверяет некоторые глобальные флаги и имеет доступ к идентификаторам сокетов, созданным для каждого протокола в основном потоке. Send и recv используют переменную указателя в своем вызове для указания идентификатора сокета, который будет использоваться для передачи данных. Данные передаются изначально через TCP-Ipv4. Как только глобальные флаги установлены и несколько других проверок сделаны, другой поток изменяет идентификатор сокета, используемый в вызове отправки, чтобы указать на сокет IPv6. Этот поток также заботится о передаче изменений между двумя хостами. Я получаю все данные по IPv4, переданные полностью перед переключением. Также я получаю данные, отправленные через Ipv6 после переключения идентификатора сокета. Но при передаче происходит потеря данных по соединению IPv6 (я использую переменную-указатель в функции отправки на стороне сервера send(*p_dataSocket.socket_id,sentence,p_size,0);
, чтобы на лету изменить указатель на идентификатор сокета IPv6)
Ошибка после вызова recv и send на обеих сторонах соответственно говорит ESPIPE:Illegal seek
, но эта ошибка существует даже до переключения. Так что я почти уверен, что это никак не связано с потерей данных
Я использую pselect()
для проверки доступных данных для каждого сокета. Я могу как-то понять потерю данных при переключении (если не обрабатывается должным образом), но я не могу понять, почему потеря данных происходит при передаче после переключения. Я надеюсь, что мне ясно, в чем проблема. Я также проверил отправку данных индивидуально по каждому протоколу без переключения, и нет потери данных. Сначала я передаю данные по Ipv6, а затем переключаюсь на IPv4, потери не происходит. Также было бы очень полезно узнать, как исследовать эту проблему, кроме использования errno
или netstat
.