2016-08-15 2 views
1

После отключения сокета в режиме записи я пытаюсь записать дублированный дескриптор. Я получаю сломанную трубку, хотя оба они имеют разные файловые дескрипторы. Что не так с моим кодом? или Это ожидаемое поведение?Программирование на Linux: Ошибка записи на дублированный сокет

int clientDupFD = dup(fileDescriptors[0]); 

shutdown(fileDescriptors[0], SHUT_WR); 

printf ("\n Client: Writing to shutdown(SHUT_WR) socket"); 

writeOk = write(clientDupFD, msgPtr="Writing message after partial shutdown!", 5); 

if(writeOk == -1) { 
    printf("\n ERR-%s: write() failed to write msg to socket", strerror(errno)); 
} 
else { 
    printf("\n Client: Message '%s' successfully written to socket", msgPtr); 
} 

Кроме того, когда я запускаю это через CodeLite, полный выход (последний printfs) не получает казнен, почему?

Только когда я пробую это через отладчик, я вижу, что команда printf «ERR-Broken pipe» выполнялась, и результат был напечатан. Я попытался использовать 'fflush (stdout)', а также 'setbuf (stdout, NULL)'. Оба они не работали. Может ли кто-нибудь помочь?

+1

Можете ли вы объяснить, что вы ожидаете, и почему? –

+0

'shutdown' отправляет пакет TCP/IP, уведомляющий другую сторону об изменениях в сообщении. Основной сетевой сокет изменился. Тот факт, что у вас есть два файловых дескриптора, ссылающихся на один и тот же сетевой сокет, означает, что изменения в соке будут видны через оба дескриптора. – Myst

ответ

1

После того, как направление записи соединения было отключено, записи больше не могут выполняться в соединении, и реализация может свободно сообщать на другом конце, что больше данных не поступит. Неважно, какой дескриптор вы используете для доступа к соединению - это одно и то же соединение.

+0

Я только что узнал, что должен использовать вызов close(), который будет поддерживать другой FD ... Можете ли вы также помочь мне с другим вопросом о том, как сбрасывать printfs? – user691197

+0

Ошибка сломанной трубы происходит до этого 'printf'. Исправьте сломанную трубу, и ваша программа запустится до завершения. (Это очень помогло бы, если бы вы поставили на свой вопрос то, что вы пытаетесь сделать, и что вы ожидаете. Я понятия не имею, почему вы назвали «shutdown» или что вы пытаетесь сделать, что затрудняет вам помощь.) –

+0

Я пытаюсь научиться программированию сокетов в Linux, поэтому попробуйте создать/закрыть/прочитать/записать из сокетов. Я просто тестировал, что произойдет, если я напишу в сокет, который был выключен. Как поймать сломанную трубу и напечатать причину ошибки (что-то похожее на try/catch в java ??) – user691197

1

Вы отключили FD (или, точнее, соединение, подключенное к обоим FD), поэтому запись не удалась.

Если вы пытаетесь создать пару гнезд, используйте socketpair (или pipe).

+0

Он отключил * соединение *, а не FD. У него есть еще один FD. –

+2

Конечно, существует только одно соединение, разделяемое между 'dup()' d FD. – abligh