Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Модератор: Модераторы разделов

StarReider
Сообщения: 6
ОС: Mandriva 2008.0

Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение StarReider »

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

Приложение snooper (описанное в главе 3).
Фрагмент листинга:

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

void DumpPacket(char* buffer, int len)
{
  ...
  dump(buffer, len);
  ...
}

void dump(void* b, int len)
{
  unsigned char *buf = b;
  ...
}

int main()
{
   int sd, bytes_read;
   char data[1024];
   ...
   DumpPacket(data, bytes_read);
   ...
}


1) Компилятор ругается на присваивание

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

unsigned char *buf = b;

Насколько я знаю указатель (указатель на неопределённый тип) типа void* нельзя присвоить указателю на любой другой тип данных или нет?
2) Непонятно почему функция dump принимает 1-м аргументом void* b, а не char* b. :huh:
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение un-defined »

А что мешает написать
unsigned char *buf = (unsigned char*)b;
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение deninok »

(StarReider) писал(а):Насколько я знаю указатель типа void* нельзя присвоить указателю на любой другой тип данных или нет?

В С можно.
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение _GV »

Также будет ворнинг на dump(buffer, len);
Нужно делать dump((void*)buffer, len);
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение sergio »

_GV писал(а):
07.05.2008 07:32
Также будет ворнинг на dump(buffer, len);
Нужно делать dump((void*)buffer, len);


Ну вот к указателю на войд любой простой поинтер неявно приводился вроде как. С утра так было. :) Или это опять лабиринты си, которых я не знаю?
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
_GV
Сообщения: 107
Статус: секта красных утюгов
ОС: Gentoo linux

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение _GV »

Приводится, не спорю. Но у меня на gcc-4.1.1 ворнингает. А мне эти ворнинги уж дюже глаз мылят.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение sergio »

_GV писал(а):
07.05.2008 12:40
Приводится, не спорю. Но у меня на gcc-4.1.1 ворнингает. А мне эти ворнинги уж дюже глаз мылят.

Понятно. Но едва ли это правильные ворнинги.

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

sergio@mirkwood:~/tests$ cat t.c



void dump(void* b, int len);
void DumpPacket(char* buffer, int len);

void DumpPacket(char* buffer, int len)
{
  dump(buffer, len);
}

void dump(void* b, int len)
{
  unsigned char *buf = b;
}

int main()
{
   int sd, bytes_read;
   char data[1024];
   DumpPacket(data, bytes_read);
   return  0;
}

sergio@mirkwood:~/tests$ gcc -Wall t.c
t.c: In function ‘dump’:
t.c:14: warning: unused variable ‘buf’
t.c: In function ‘main’:
t.c:19: warning: unused variable ‘sd’
sergio@mirkwood:~/tests$ gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

sergio@mirkwood:~/tests$


С -анси и -стд=с99 тоже ничего кроме...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
StarReider
Сообщения: 6
ОС: Mandriva 2008.0

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение StarReider »

un-defined писал(а):
05.05.2008 23:27
А что мешает написать
unsigned char *buf = (unsigned char*)b;

Да, именно так и надо было сделать. Благодарствую.

_GV писал(а):
07.05.2008 07:32
Также будет ворнинг на dump(buffer, len);
Нужно делать dump((void*)buffer, len);

Моя IDE не выдает никаких предупреждений по этому вызову, хотя это может быть связано с настройками уровня оповещения.
Спасибо сказали:
StarReider
Сообщения: 6
ОС: Mandriva 2008.0

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение StarReider »

Вот еще одна программа, которая вызвала у компилятора недопонимание.
echo-thread

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

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>
#include <pthread.h>

using namespace std;

void PANIC(char* msg);
#define PANIC(msg)  { perror(msg); exit(-1); }

/*--- Child - echo servlet                                         ---*/
void* Child(void* arg)
{   char line[100];
    int bytes_read;
    int client = *(int *)arg;

    do
    {
        bytes_read = recv(client, line, sizeof(line), 0);
        send(client, line, bytes_read, 0);
    }
    while (strncmp(line, "bye\r", 4) != 0);
    close(client);
    return arg;
}

/*--- main - setup server and await connections (no need to clean  ---*/
/*--- up after terminated children.                                ---*/
int main(void)
{   int sd;
    struct sockaddr_in addr;

    if ( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
        PANIC("Socket");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    addr.sin_addr.s_addr = INADDR_ANY;
    if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 )
        PANIC("Bind");
    if ( listen(sd, 20) != 0 )
        PANIC("Listen");
    while (1)
    {   int client, addr_size = sizeof(addr);
        pthread_t child;

        client = accept(sd, (struct sockaddr*)&addr, (socklen_t*)&addr_size);
        printf("Connected: %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
        if ( pthread_create(&child, NULL, Child, &client) != 0 )
            perror("Thread creation");
        else
            pthread_detach(child);  /* disassociate from parent */
    }
    return 0;
}


Компилятор пишет следующее:

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

undefined reference to `pthread_create'
undefined reference to `pthread_detach'


Подскажите, пожайлуста, где ошибка.
Спасибо сказали:
Аватара пользователя
dey
Сообщения: 335
ОС: OpenSuse 11.1

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение dey »

StarReider писал(а):
04.06.2008 21:23
Компилятор пишет следующее:

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

undefined reference to `pthread_create'
undefined reference to `pthread_detach'


Подскажите, пожайлуста, где ошибка.

Скорее всего слинковал без требуемых библиотек
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Спасибо сказали:
gmorgunov
Сообщения: 27
ОС: linux mandriva2007

Re: Ошибки компиляции программ книги "Создание сетевых приложений в среде Linux"

Сообщение gmorgunov »

g++ programm.cc -o programm -lpthread
Спасибо сказали: