Страница 1 из 2

Сокеты во FreeBSD...

Добавлено: 2007-06-08 14:31:38
SoeR
Приветствуюб уважаемые админы =)

Вот прочитал статью на вашем сайте о написании демона работающего с сокетами
Но почему-то не компилит

Код:

Код: Выделить всё

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <syslog.h>
#include <signal.h>

class tcpdaemon
{
  protected:
    void daemonize();
    void mainloop();
    void operate(int fd);
    static void signalhandler(int signum);
  public:
    void exec();
};

void tcpdaemon::signalhandler(int signum)
{
  waitpid(0, 0, WNOHANG);
}

void tcpdaemon::daemonize()
{
  struct sigaction sa;
  print_f("Welcome to Playback Price Server. Server start OK!\n");
  int pid = fork();
  switch(pid)
  {
    case 0:
    setsid();
    chdir("/");
    close(0);
    close(1);
    close(2);
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = &sighandler;
    sigaction(SIGCHLD, &sa, 0);
    exit(0);
    case -1:
      print_f("Fork error...\n");
      break;
    default
      print_f("OK. PID=%d\n", pid);
      break;
   }
}

void tcpdaemon::mainloop()
{
  int sockfd, fd;
  struct sockaddr_in sa;
  socklen_t n;
  sockfd = socket(PF_INET, SOCK_STREAM, 0);
  if(sockfd != -1)
  {
    memset(&sa, 0, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
    sa.sin_port = htons(21867);
    if(bind(sockfd, (struct sockaddr *)&sa, sizeof sa) != 1)
    {
      while(1)
      {
        if(!listen(sockfd, 50))
        {
          n = sizeof sa;
          if((fd = accept(sockfd, (srtuct sockaddr *)&sa, &n)) != -1)
          {
            print_f("Connection from %s", inet_ntoa(sa.sin_addr));
            if(!fork)
            {
              operate(fd);
            }
          }
        }
      }
    }
  }
}

void tcpdaemon::operate(int fd)
{
  char c;
  bool finished;
  string smd, answer;
  finished = false;
  write(fd, answer.c_str(), answer.size());
  while(!finished)
  {
    cmd = answer = "";
    while(!finished)
      finished = read(fd, &c, 1) != 1;
    if(c == '\n')
      break;
    else if(c != '\r')
      cmd += c;
    if(!finished && !cmd.empty())
    {
      if(cmd == "info")
        answer = "Welcome to PlayBack Price Server...";
      else if(cmd == "quit")
      {
        shutdown(fd, 2);
        close(fd);
        finished = true;
      }
    }
  }
  if(!finished && !answer.empty())
  {
    answer += "\n";
    write(fd, answer.c_str(), answer.size());
  }
  exit(0);
}

void tcpdaemon::exec()
{
  daemonize();
}


int main()
{
  tcpdaemon daemon;
  daemon.exec();
  return 0;
};
Компилю так:
сс -o serv serv.c

Выдаёт следующие ошибки:

Код: Выделить всё

  serv.c:11: error: syntax error before "tcpdaemon"
serv.c:12: error: syntax error before '{' token
serv.c:18: error: syntax error before ':' token
serv.c:20: error: syntax error before '}' token
Вопрос: На что ругается и как исправить?

Добавлено: 2007-06-09 6:29:01
bakake
Как ни странно, но компилятор по расширению файла смотрит (по дефолту) кто у него на входе -- ц или ц++. Попробуйте поменять расширение с .c на .cpp

Добавлено: 2007-06-13 20:48:07
SoeR
Всё нормуль =)) Разобрался... Оказалось, что в файлах с расширением .c нельзя писать классы, т.к. это си... Поменял расширение на .cpp и скомпилел g++ -o serv serv.cpp и всё скомпилелось :) Что поделаешь, только начинаю :)

Re: Сокеты во FreeBSD...

Добавлено: 2007-10-28 20:20:16
100kg
привет! вот подзагрузился я!

пожалуиста поставь коментарии! как бы интуитивно понимаю, но все таки укажи где конструктор, опеши хоть немного заголовки в 2 словах, члены-функции private и аргументы каторые принимает, а то осилил только создания обьекта класса и запуск его в main :)

Re: Сокеты во FreeBSD...

Добавлено: 2007-10-29 23:05:57
Fastman
100kg писал(а):привет! вот подзагрузился я!

пожалуиста поставь коментарии! как бы интуитивно понимаю, но все таки укажи где конструктор, опеши хоть немного заголовки в 2 словах, члены-функции private и аргументы каторые принимает, а то осилил только создания обьекта класса и запуск его в main :)
ага... доберусь до офиса и попробую пояснить )

Re: Сокеты во FreeBSD...

Добавлено: 2008-02-21 15:45:57
Гость
Добрый день.
Может немого не в тему но...
Почему, когда я добавляю в работающий С код строку:
#include <sys/systm.h>
или
#include <sys/kernel.h>
компилер в этих файлах не находит некоторые типы данных, и гдето определенные функции.
Исходные тексты системы установленны. И вообще установлено всё, полная установка. Версия FreeBSD 6.2.
Компилирую я просто:
gcc -a hello.c hello

Re: Сокеты во FreeBSD...

Добавлено: 2008-02-21 19:15:08
Fastman
Гость писал(а):Добрый день.
Может немого не в тему но...
Почему, когда я добавляю в работающий С код строку:
#include <sys/systm.h>
или
#include <sys/kernel.h>
компилер в этих файлах не находит некоторые типы данных, и гдето определенные функции.
Исходные тексты системы установленны. И вообще установлено всё, полная установка. Версия FreeBSD 6.2.
Компилирую я просто:
gcc -a hello.c hello
Телепаты в отпуске :) (Я на самом деле счас с ноутбука пишу так как нахожусь на отдыхе в загородном профилактории :)
А по теме - давай вывод ошибок сюда. разберемся. Ибо то что ты говоришь что что то не находит "некоторые" типы.. лично для меня ни о чем не говорит.

Re: Сокеты во FreeBSD...

Добавлено: 2008-02-22 0:19:21
Alex Keda
как там эппл?
========
хороший профилакторий - с инетом..

Re: Сокеты во FreeBSD...

Добавлено: 2008-02-22 1:00:52
Fastman
lissyara писал(а):как там эппл?
========
хороший профилакторий - с инетом..
Эппл на офисе остался я подумал неразумно брать 2 ноута на отдых :)))
А профилакторий построили наши банкиры для себя, отдых заказывали за 2 месяца, потому что тут аншлаг обычно ))))
на 12 дней брали путевки - потому как если на 12 и более дней берешь путевку в стоимость входит прием врачей процедуры питание 4 раза в день итд итп...
Так что я утром иду на массаж, потом мне спину греют потом ультразвук и ингаляции для горла..фитобар с травками вкучными и полезными...аквапарк... вечером бильярд и бар...есть корт спортзалы итд итп )))) И все это удовольстви всего 500 баксов за 12 дней ))))
Плюс стоянка для машины и возможность ухаживать за ней мыть полировать итд итп ))))

Re: Сокеты во FreeBSD...

Добавлено: 2008-02-22 1:06:55
Alex Keda
я бы не смог.
мне постоянно надо что-делать.
немогу иначе

Re: Сокеты во FreeBSD...

Добавлено: 2008-03-02 1:22:32
zingel
Используй вот так:

#include <systm.h>


p.s. и GCC обнови.

Re: Сокеты во FreeBSD...

Добавлено: 2008-03-13 23:56:22
fr33man
lissyara писал(а):я бы не смог.
мне постоянно надо что-делать.
немогу иначе
слава богу, я не один такой.... Мне всегда погано, когда ничего не делаю. ))

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-13 18:15:50
ark
такая же фигня... не могу на месте сидеть...

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

дак вот... нужно написать сервер на фре, но с возможностью работы с TCP пакетами а не только с текстовой информацией
то есть передавать данные в пакетах в побайтно а не в тексотовом формате
кто нибудь занимался чем то подобным на фре?

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-13 20:21:43
Fastman
ark писал(а):такая же фигня... не могу на месте сидеть...

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

дак вот... нужно написать сервер на фре, но с возможностью работы с TCP пакетами а не только с текстовой информацией
то есть передавать данные в пакетах в побайтно а не в тексотовом формате
кто нибудь занимался чем то подобным на фре?
RAW Socket - гугли и будет тебе счастье.

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-14 8:39:49
ark
ну зачем же сразу на гугль отправлять))) про существование гугля я итак знал))
а сюда написал с целью получить примеры реализации - делал подобное кто нибудь?

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-14 20:54:02
Fastman
ark писал(а):ну зачем же сразу на гугль отправлять))) про существование гугля я итак знал))
а сюда написал с целью получить примеры реализации - делал подобное кто нибудь?
Поточнее опиши задачу, попробуем разобраться.
Я работал с RAW но к сожалению показать реализацию не могу - коммерческая разработка :)
А вообще инфы куча по этому делу, вопросы по ходу конечно возникают но ничего сверхъестественного нет :)

Могу еще сказать что при написании я глядел в исходники tcpdump-а очень помогло :)

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-14 21:40:18
Alex Keda
Fastman писал(а):Могу еще сказать что при написании я глядел в исходники tcpdump-а очень помогло :)
однако, в этом случае исходники ты вывалить обязан =)))

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-15 10:24:36
Fastman
lissyara писал(а):
Fastman писал(а):Могу еще сказать что при написании я глядел в исходники tcpdump-а очень помогло :)
однако, в этом случае исходники ты вывалить обязан =)))
Я ж смотрел как правильно делать а не тупо копи-паст )))

Re: Сокеты во FreeBSD...

Добавлено: 2008-04-15 11:01:11
ark
ну тогда ты тем более обязан поделится исходниками! :D

Re: Сокеты во FreeBSD...

Добавлено: 2008-05-03 14:38:19
zingel
по raw-сокетам инфорация (c примерами) настолько скудна, что я видел её только в "UNIX-Разработка сетевый приложений" (Стивенс, Рудофф)

выкладывайте, действительно....

Re: Сокеты во FreeBSD...

Добавлено: 2008-11-20 20:29:33
red
Кто-то смог это скопилиить gcc4 ?
tsrmad.cpp: In member function 'void tcpdaemon::daemonize()':
tsrmad.cpp:50: error: 'sighandler' was not declared in this scope
tsrmad.cpp:57: error: expected `:' before 'printf'
tsrmad.cpp: In member function 'void tcpdaemon::operate(int)':
tsrmad.cpp:99: error: 'string' was not declared in this scope
tsrmad.cpp:99: error: expected `;' before 'cmd'
tsrmad.cpp:100: error: expected `;' before 'answer'
tsrmad.cpp:102: error: 'answer' was not declared in this scope
tsrmad.cpp:105: error: 'cmd' was not declared in this scope

Re: Сокеты во FreeBSD...

Добавлено: 2008-11-20 21:07:07
paradox
если нужно могу скомпилить

Re: Сокеты во FreeBSD...

Добавлено: 2008-11-20 21:28:23
red
очень нужно - попробуй если получится расскажи как получилось

Re: Сокеты во FreeBSD...

Добавлено: 2008-11-20 21:33:06
paradox
получиться однозначно

можно вашу

Код: Выделить всё

uname -a
?

Re: Сокеты во FreeBSD...

Добавлено: 2008-11-20 21:38:17
red
FreeBSD 7.0