Что такое простой C или C++ сервер TCP и клиентский пример? [закрытый]

scanf() зло - используйте fgets(), а затем анализируйте.


Деталь не в том, что scanf() совершенно плох.

1) Спецификаторы формата часто используются слабым образом

char buf[100];
scanf("%s", buf); // bad - no width limit

2) Возвращаемое значение ошибочно не проверяется

scanf("%99[\n]", buf); // what if use entered `"\n"`?
puts(buf); 

3) Когда ввод не такой, как ожидалось , не ясно, что остается в stdin.

if (scanf("%d %d %d", &i, &j, &k) != 3) {
  // OK, not what is in `stdin`?
}

у вас могут возникнуть проблемы, если вы попытаетесь смешать вызовы scanf с вызовами getchar или getline.

blockquote>

Да. Многие scanf() вызовы оставляют завершающий '\n' в stdin, которые затем читаются как пустая строка getline(), fgets(). scanf() не не для чтения строк . getline() и fgets() гораздо лучше подходят для чтения строки .


Сильно ли изменился scanf с тех пор, как были написаны приведенные выше цитаты?

blockquote>

Только так много изменений может произойти без путаницы в кодовой базе. @Джонатан Леффлер

scanf() остается проблематичным. scanf() не может принять аргумент (после формата), чтобы указать, сколько символов нужно принять в пункт назначения char *.

Некоторые системы добавили дополнительные опции формата, чтобы помочь.

Фундаментальная проблема заключается в следующем:

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


Безопасность

Слабость scanf() и плохая тенденция кодера scanf() были золотым прииском для хакеров.

IMO, C не имеет надежного набора функций пользовательского ввода.

41
задан Nick Bolton 19 February 2017 в 18:31
поделиться

3 ответа

Я использовал Руководство Beej по Сетевому программированию в прошлом. Это находится в C, не, C++, но примеры хорош. Перейдите непосредственно в раздел 6 для простых примеров программы клиента и сервера.

42
ответ дан Bill the Lizard 27 November 2019 в 00:46
поделиться

Если код должен быть простым, то Вы, вероятно, прося пример C на основе традиционных сокетов BSD. Решения как boost::asio являются, по моему скромному мнению, вполне сложными когда дело доходит до короткого и простого "привет мировой" пример.

Для компиляции примеров Вы упомянули, что необходимо сделать простые меры, потому что Вы компилируете в соответствии с компилятором C++. Я обращаюсь к следующим файлам:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
от: http://www.linuxhowtos.org/C_C++/socket.htm

  1. Добавляет, что следующее включает в оба файла:

    #include <cstdlib>
    #include <cstring>
    #include <unistd.h>
    
  2. В client.c, измените строку:

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
    { ... }
    

    к:

    if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
    { ... }
    

, Как Вы видите в C++, необходим, явный бросок.

13
ответ дан Andre Kampling 27 November 2019 в 00:46
поделиться

повышение попытки:: lib asio ( http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html ) это имеет примеры партии.

6
ответ дан bayda 27 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: