С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 574
1

Как реализовать вызов функции write для каждого байта строки

07.10.2014, 20:25. Показов 940. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Делаю упражнение 5 главы 1 по книге "Стивенс Р. UNIX Разработка сетевых приложений":
Изменить листинг 1.5 следующим образом. Сначала поменяйте номер порта, заданный функции sin_port, с 13 на 9999. Затем измените один вызов функции write на циклический, при котором функция write вызывается для каждого байта результирующей строки. Откомпилируйте полученный сервер и запустите его в фоновом режиме. Затем измените клиент из предыдущего упражнения (в котором выводится счетчик перед завершением программы), изменив номер порта, заданный функции sin_port, с 13 на 9999. Запустите этот клиент, задав в качестве аргумента командной строки IP-адрес узла, на котором работает измененный сервер. Какое значение клиентского счетчика будет напечатано? Если это возможно, попробуйте также запустить клиент и сервер на разных узлах.

Вот код сервера:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include    "unp.h"
#include    <time.h>
 
int main(int argc, char **argv) {
  struct sockaddr_in    servaddr;
  char              buff[MAXLINE];
 
  // Создаем TCP сокет
  int listenfd = Socket(AF_INET, SOCK_STREAM, 0);
 
  /**
   * Заранее известный порт сервера (13 в случае сервера времени и даты) связывается с сокетом путем заполнения структуры адреса интернет-сокета
   * и вызова функции bind
   */
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family      = AF_INET;
 
  // сервер принимает соединение клиента на любом интерфейсе в том случае, если узел сервера имеет несколько интерфейсов
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
  servaddr.sin_port        = htons(13); /* daytime server */
 
  Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
 
  // Преобразовываем сокет в прослушивающий сокет
  Listen(listenfd, LISTENQ);
 
  // Прием клиентского соединения, отправка ответа
  for ( ; ; ) {
    // Блокируем процесс сервера, ожидая принятия подключения клиента
    int connfd = Accept(listenfd, (SA *) NULL, NULL);
 
    time_t ticks = time(NULL);
 
    // добавляем возврат каретки и пустую строку к строке
    /*snprintf(buff, sizeof(buff), "%.24s ; sizeof buff: %ld\r\n", ctime(&ticks), sizeof(buff));*/
    int bytes = snprintf(buff, sizeof(buff), "%.24s ; sizeof buff: %ld\r\n", ctime(&ticks), sizeof(buff));
 
    // передаем результат клиенту
    /*Write(connfd, buff, strlen(buff));*/
 
    int i;
    for (i = 0; i < bytes; ++i)
      Write(connfd, &buff[i], 1); // пересылаем по 1 байту в цикле
 
    // Закрываем соединение с клиентом
    Close(connfd);
  }
}
Закомментированная функция write - это исходный вариант, а с циклом - то, что я пытался зделать, но не уверен, что все правильно. Подскажите пожалуйста, правильно ли я реализовал циклицеский вызов функции write и если нет, то как исправить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
07.10.2014, 20:25
Ответы с готовыми решениями:

Удалить из каждого байта строки первый (старший) бит.
Здравствуйте. Суть задачи в общем-то и отображена в названии задачи. Есть строка: unsigned...

Как реализовать левосторонний вызов функции?
Нужно реализовать левосторонний вызов функции. Мне нужно что бы функция возвращала ссылку на...

как взять значение определенного бита из байта? и как организовать такое в цикля для каждого бита?
FASM моя первая задача - вычислить n-e число фибоначчи бинарное возведение в степень допустим...

Open For Binary Access Write - непонятные 4 байта
Добрый день. Может кто-то сможет помочь. Задача вот какая: принимаю с web сервера некие данные,...

1
14 / 14 / 2
Регистрация: 26.04.2013
Сообщений: 191
13.11.2014, 13:03 2
Вроде правильно, надо запустить и проверить, если не будет работать то тогда уже искать ошибку.
0
13.11.2014, 13:03
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
13.11.2014, 13:03
Помогаю со студенческими работами здесь

Переставить биты в обратном порядке для каждого байта
Переставить биты в обратном порядке для каждого байта. Решите пожалуйста

Как сделать перебор файла по байтам, нужна статистика каждого байта, в делфи.
нашел тут на форуме паскалевский вариант, но незнаю как его переделать в делфи, с формами, я...

Свои настройки для каждого экземпляра - как реализовать?
Есть вот такой плагин для выора цвета: (function ($){ var defaults = {colors: new Array...

Как реализовать для каждого объекта свой поток
Господа помогите плиииЗ ... как сделать для каждого объекта свой поток??? тут я сделал так...

Как реализовать вызов "переменной" функции?
Столкнулся с задачей в которой имя исполняемой функции назначается в процессе выполнения...как...

Как реализовать вывод сообщения в QMessage, используя вызов функции при нажатии кнопки QMessage
Вечер добрый. Столкнулся с изложенным ниже заданием на собеседовании: В этой задаче вам нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru