Проблема вот в чем. У меня есть два файла socket_client.c и socket_server.c, это UDP сервер и клиент.
При компиляции выдает ошибку. Помогите пожалуйста разобраться в чем проблема wink
ubuntu@ubuntu:~$ dir
Desktop socket_client.c Видео Картинки Общедоступные
Downloads socket_server.c Документы Музыка Шаблоны
ubuntu@ubuntu:~$ gcc –o socket_server socket_server.c
gcc: –o: No such file or directory
gcc: socket_server: No such file or directory
socket_server.c: In function ‘main’:
socket_server.c:31: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:38: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:54: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:64: warning: incompatible implicit declaration of built-in function ‘exit’
Помогите с компиляцией файла
Ну... для начала, уберите флаг -о
Попробовал, тоже не работает....
ubuntu@ubuntu:~$ dir
Desktop socket_client.c Видео Картинки Общедоступные
Downloads socket_server.c Документы Музыка Шаблоны
ubuntu@ubuntu:~$ gcc socket_server socket_server.c
gcc: socket_server: No such file or directory
socket_server.c: In function ‘main’:
socket_server.c:31: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:38: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:54: warning: incompatible implicit declaration of built-in function ‘exit’
socket_server.c:64: warning: incompatible implicit declaration of built-in function ‘exit’
Может там надо прописать какуе-то команду до компиляции?
содержимое покажите для начала . А то гадать можно сколько угодно .
:~$ gcc --help
Синтаксис: gcc [ключи] файл...
Ключи:
-pass-exit-codes Выход с максимальным кодом возврата от прохода
--help Вывести этот текст
--target-help Показать специфические ключи целевой платформы
--help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]
Показать специфические ключи командной строки
(Задайте '-v --help' для вывода ключей всех проходов компиляции)
--version Display compiler version information
-dumpspecs Показать встроенные спецификации
-dumpversion Показать версию компилятора
-dumpmachine Показать имя целевой платформы
-print-search-dirs Показать каталоги поиска
-print-libgcc-file-name Показать имя run-time библиотеки компилятора
-print-file-name=<биб> Показать полное маршрутное имя библиотеки <биб>
-print-prog-name=<прог> Показать полное имя компоненты компилятора <прог>
-print-multi-directory Показать корневой каталог с версиями libgcc
-print-multi-lib Показать соответствие между ключами и каталогами
поиска библиотек
-print-multi-os-directory Показать относительный маршрут к библиотекам операционной системы
-print-sysroot Display the target libraries directory
-print-sysroot-headers-suffix Вывести суффикс sysroot, используемый для поиска заголовочных файлов
-Wa,<ключи> Передать <ключи>, разделённые запятыми, ассемблеру
-Wp,<ключи> Передать <ключи>, разделённые запятыми, препроцессору
-Wl,<ключи> Передать <ключи>, разделённые запятыми, компоновщику
-Xassembler <арг> Передать <арг> ассемблеру
-Xpreprocessor <арг> Передать <арг> препроцессору
-Xlinker <арг> Передать <арг> компоновщику
-combine Передать компилятору несколько исходных файлов вместе
-save-temps Не удалять промежуточные файлы
-save-temps=<arg> Do not delete intermediate files
-no-canonical-prefixes Do not canonicalize paths when building relative
prefixes to other gcc components
-pipe Передавать промежуточные данные по конвейеру
-time Включить хронометраж проходов
-specs=<файл> Использовать <файл> спецификаций вместо
внутренних спецификаций компилятора
-std=<стандарт> Считать, что исходный код следует <стандарту>
--sysroot=<каталог> Использовать <каталог> как головной каталог для заголовков
и библиотек
-B <каталог> добавить <каталог> к списку поиска программ
компилятора
-b <машина> Генерировать код для указанной <машины>,
если возможно
-V <версия> Использовать <версию> gcc, если она установлена
-v Отображать команды, запускаемые компилятором
-### Как -v, но параметры берутся в кавычки и команды не запускаются
-E Только препроцессирование - без компиляции, ассемблирования, компоновки
-S Только компиляция - без ассемблирования и компоновки
-c Компиляция и ассемблирование, без компоновки
-o <файл> Записать результат в <файл>
-x <язык> Задать язык последующих входных файлов.
<язык> может быть: c c++ assembler none
'none' означает, что далее язык нужно
определять по расширению имени файла
Ключи, начинающиеся с -g, -f, -m, -O, -W, или --param автоматически
передаются процессам, запускаемым gcc. Для передачи ключей этим процессам, используйте ключи -W<буква>.
Вот текст программы из файла socket_server.c
/* Простой пример UDP-сервера для сервиса echo */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int sockfd; /* Дескриптор сокета */
int clilen, n; /* Переменные для различных длин
и количества символов */
char line[1000]; /* Массив для принятой и
отсылаемой строки */
struct sockaddr_in servaddr, cliaddr; /* Структуры
для адресов сервера и клиента */
/* Заполняем структуру для адреса сервера: семейство
протоколов TCP/IP, сетевой интерфейс – любой, номер порта
51000. Поскольку в структуре содержится дополнительное не
нужное нам поле, которое должно быть нулевым, перед
заполнением обнуляем ее всю */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(51000);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Создаем UDP сокет */
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){
perror(NULL); /* Печатаем сообщение об ошибке */
exit(1);
}
/* Настраиваем адрес сокета */
if(bind(sockfd, (struct sockaddr *) &servaddr,
sizeof(servaddr)) < 0){
perror(NULL);
close(sockfd);
exit(1);
}
while(1) {
/* Основной цикл обслуживания*/
/* В переменную clilen заносим максимальную длину
для ожидаемого адреса клиента */
clilen = sizeof(cliaddr);
/* Ожидаем прихода запроса от клиента и читаем его.
Максимальная допустимая длина датаграммы – 999
символов, адрес отправителя помещаем в структуру
cliaddr, его реальная длина будет занесена в
переменную clilen */
if((n = recvfrom(sockfd, line, 999, 0,
(struct sockaddr *) &cliaddr, &clilen)) < 0){
perror(NULL);
close(sockfd);
exit(1);
}
/* Печатаем принятый текст на экране */
printf("%s\n", line);
/* Принятый текст отправляем обратно по адресу
отправителя */
if(sendto(sockfd, line, strlen(line), 0,
(struct sockaddr *) &cliaddr, clilen) < 0){
perror(NULL);
close(sockfd);
exit(1);
} /* Уходим ожидать новую датаграмму*/
}
return 0;
}
Вы используете exit (), но не подключили stdlib.h. Совсем недавно эту ошибку у себя видел, сразу не догадаешься, о чем речь
Вы используете exit (), но не подключили stdlib.h
+1
Все равно нечего не компилируется...
ubuntu@ubuntu:/usr/bin$ gcc -o socket_server /home/ubuntu/socket_server.c
/usr/bin/ld: cannot open output file socket_server: Permission denied
collect2: ld returned 1 exit status
Что это значит?
ubuntu@ubuntu:/usr/bin$ gcc -o socket_server /home/ubuntu/socket_server.c
Ясное дело, у вас нет прав на запись в /usr/bin, сходите к себе в $HOME. У меня ваш исходник скомпилился сразу после того, как я добавил #include <stdlib.h>
Так а как мне быть, я линукс запускаю с dvd диска, там у меня точно ни каких прав на запись не будет :(
и что значит сходить к себе в $HOME?
PS: Извини что я так туплю, я линукс первый раз в жизни запустил, просто мне нужно сделать пару лабораторных))
[console]cd ~
gcc -o socket_server socket_server.c
[/console]
Всем спасибо, у меня все заработало smile
Подскажите еще пожалуйста что такое стандартный UDP-сервис echo, и как его запустить?
Так а как мне быть, я линукс запускаю с dvd диска, там у меня точно ни каких прав на запись не будет
будет. например в $HOME
Подскажите еще пожалуйста что такое стандартный UDP-сервис echo, и как его запустить?
подробнее...