Ваша программа делает то, что ожидается, dup2(sockfd,0);
закроет стандартный ввод вашей клиентской программы (т. Е. Текст, введенный с клавиатуры в терминале, в котором вы запустили программу), и используйте sockfd
в качестве вашегоновый стандартный ввод.Цитируется здесь :
dup2 () делает newfd копией oldfd, сначала закрывая newfd, если необходимо
Чтобы доказать это,попробуйте запустить программу прослушивания сокетов следующим образом:
cat | nc -v -l 1337
в терминале 1 - оберните свою клиентскую программу сокета с помощью
strace
(например, strace a.out
) в терминале 2
Текст, набранный в терминале 1 (где вы запустили сервер, прослушивающий порт 1337), будет отправлен через сокет, полученный в терминале 2 через fd 0
(который теперь является копией sockfd
) и отправлено обратно через сокет из-за перенаправления стандартного вывода (fd 1) на sockfd
.
Вы можете закомментировать dup2(sockfd,1);
, если не хотите отправлять текст обратносервер, но вместо этого он отображается в терминале 2.В качестве альтернативы вы можете закомментировать dup2(sockfd,0);
, чтобы сохранить стандартный ввод вашей клиентской программы на клавиатуре, и отправить текст, введенный из терминала 2, через сокет.
Не уверен, что отвечает на ваш вопрос, но ядумаю, strace
+ cat
поможет вам понять, как вы можете управлять различными дескрипторами файлов на месте.
Надеюсь, это поможет!