Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/106: Рейтинг темы: голосов - 106, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
1

bad file descriptor

28.02.2010, 09:52. Показов 19394. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помогите пожалста!

работаю с сокетами под убунту
когда вызывается функция
send(sock, get, strlen(get), 0);

perror("errno"); выводит на коноль следующее:
errno: Bad file descriptor
с чем это может быть связано??
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2010, 09:52
Ответы с готовыми решениями:

Системный вызов epoll_ctl: Bad file descriptor
Программа выдает epoll_ctl: Bad file descriptor. Помогите разобраться что не так делаю int fd, epfd; fd = open ("file",...

fopen не читает из URL - Warning: fopen('http://www....','r') - Bad file descriptor in .....gethtml.php on line 16
Как известно с помощью fopen можно прочитать данные не только из файла но и из URL. Проблема в том что обращаясь через прокси я получаю...

bad class file: C:Program FilesJavajre1.5.0_02lib t.jar(java/lang/Object.class) class file has wrong version 49.0, should be 48.0
написал тестовый td_jsp.jsp фаил ->> <html> <head><title>JSP test</title></head> <body> <p>JSP test</p> </body> ...

14
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
28.02.2010, 11:25 2
код покажи
0
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
02.03.2010, 18:11  [ТС] 3
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
 
#define PROXY "172.18.0.1"
#define PORT 3128
#define TARGET_HOST "http://vkontakte.ru"
 
char buf[BUFSIZ];
 
 
char* build_get_query(char* );
char* get_ip(char* );
int create_tcp_socket();
 
int main(int argc, char** argv)
{
    struct sockaddr_in *remote;
    int sock;
    int tmpres;
    char *ip;
    char *get;
    char buf[BUFSIZ+1];
    char *host;
    char *page;
  
    host = "172.18.0.1";
    sock = create_tcp_socket();
    ip = get_ip(host);
    fprintf(stderr, "IP is %s\n", ip); 
    remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));
    remote->sin_family = AF_INET;
    tmpres = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));
    if( tmpres < 0)  
    {
      perror("Can't set remote->sin_addr.s_addr");
      exit(1);
    }else if(tmpres == 0)
    {
      fprintf(stderr, "%s is not a valid IP address\n", ip);
      exit(1);
    }
    remote->sin_port = htons(PORT);
    
    if(connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0)
    {
        perror("Could not connect");
        exit(1);
    }
    else 
    {
        printf("%s \n", "Connected");
    }
    
    get = build_get_query(TARGET_HOST);
    
    //Send the query to the server
    /*int sent = 0;
    while(sent < strlen(get))
    { 
        tmpres = send(sock, get+sent, strlen(get)-sent, 0);
        if(tmpres == -1)
        {
            perror("Can't send query");
            exit(1);
        }
        sent += tmpres;
    }*/
    /*if (send(sock, get, strlen(get), 0) < 0)
    {
        perror("send");
        exit(2);
    }
    else
    {
        printf("%s \n", "Query has been sent.");
    }*/
    int t = send(sock, get, strlen(get), 0);
    printf("t is: %d\n", t);
    perror("errno");
    char* err = strerror(errno);
    memset(buf, 0, sizeof(buf));
    while((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0);
    printf("buf is: %s\n", buf);
    close(sock);
    return 0;
}
 
char* build_get_query(char* uri)
{
    char* tmpl = "GET / HTTP/1.0\r\nHost: %s \r\nUser_Agent: tvolkov";
    //  char *tpl = "GET /%s HTTP/1.0\r\n Host: %s\r\nUser-Agent: %s\r\n\r\n";
    char* query;
    sprintf(query, tmpl, uri);
    printf("The query is: \n%s\n", query);
    return query;
}
char *get_ip(char *host)
{
  struct hostent *hent;
  int iplen = 15; //XXX.XXX.XXX.XXX
  char *ip = (char *)malloc(iplen+1);
  memset(ip, 0, iplen+1);
  if((hent = gethostbyname(host)) == NULL)
  {
    herror("Can't get IP");
    exit(1);
  }
  if(inet_ntop(AF_INET, (void *)hent->h_addr_list[0], ip, iplen) == NULL)
  {
    perror("Can't resolve host");
    exit(1);
  }
  return ip;
}
int create_tcp_socket()
{
  int sock;
  if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
    perror("Can't create TCP socket");
    exit(1);
  }
  return sock;
}
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.03.2010, 19:03 4
Цитата Сообщение от TimoshkaXXX Посмотреть сообщение
perror("errno");
вот скажи, какой тайный смысл в этой строке?

Цитата Сообщение от TimoshkaXXX Посмотреть сообщение
int t = send(sock, get, strlen(get), 0);
чему равен t ?
0
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
04.03.2010, 18:14  [ТС] 5
niXman, а как надо писать?

t = -1

Добавлено через 8 минут
niXman, perror понял как писать
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.03.2010, 19:49 6
Цитата Сообщение от TimoshkaXXX Посмотреть сообщение
t = -1
вот по этому и ошибка.
разбирайся с этим.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.03.2010, 20:01 7
Возможно, автор немного другое имел в виду. Понятно, что выдача ошибки происходит из-за того, что t==-1. У него вопрос, видимо, состоит в том, а почему не отработал send
0
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 49
05.03.2010, 10:21  [ТС] 8
Evg, вот именно. не понятно почему send возвращает -1.
из-за чего это может быть??
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.03.2010, 11:40 9
Цитата Сообщение от TimoshkaXXX Посмотреть сообщение
Evg, вот именно. не понятно почему send возвращает -1.
из-за чего это может быть??
Распечатай значение errno, а потом смотри в документацию по send'у в каких случаях выставляется такой код ошибки
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
14.03.2010, 06:36 10
(я сначала написал ошибочное предположение,поэтому просто исправляю,вот ссылка на ман по send )http://www.opengroup.org/onlin... /send.html
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.03.2010, 06:40 11
вообще-то, должно быть так:
C
1
socket(AF_INET, SOCK_STREAM, 0)
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
14.03.2010, 07:12 12
вот что пишут http://www.wlug.org.nz/EBADF
Цитата Сообщение от niXman Посмотреть сообщение
вообще-то, должно быть так:]
Это было моё предположение,но потом я погуглил,и подумал:ошибся,так как там вместо нуля просто define идёт
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.03.2010, 07:20 13
was out of range, or was not open, or is invalid
естественно.
в мане вот что:
НАЗВАНИЕ
socket - создать оконечную точку коммуникации

КРАТКАЯ СВОДКА
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

ОПИСАНИЕ
socket создает оконечную точку для коммуникации и возвращает её дескриптор.

Параметр domain задает "домен" коммуникации; выбирает набор протоколов, которые будут использоваться для коммуникации. Такие наборы описаны в <sys/socket.h>. В
настоящее время понимаются такие форматы:

Название Назначение Страница
PF_UNIX,PF_LOCAL Локальная коммуникация unix(7)
PF_INET IPv4, протоколы Интернет ip(7)
PF_INET6 IPv6, протоколы Интернет
PF_IPX IPX - протоколы Novell
PF_NETLINK Устройство для общения пользователя с ядром netlink(7)
PF_X25 Протокол ITU-T X.25 / ISO-8208 x25(7)
PF_AX25 Протокол AX.25, любительское радио
PF_ATMPVC ATM -- доступ к низкоуровневым PVC
PF_APPLETALK Appletalk ddp(7)
PF_PACKET Низкоуровневый пакетный интерфейс packet(7)

Сокет имеет указанный тип, type, задающий семантику коммуникации. В настоящее время определены следующие типы:

SOCK_STREAM
Обеспечивает надежные, двунаправленные последовательные потоки байтов, с поддержкой соединений. Может также поддерживаться механизм вне-поточных данных.

SOCK_DGRAM
Обеспечивает датаграммы (ненадежные сообщения с ограниченной максимальной длиной, без поддержки соединения).

SOCK_SEQPACKET
Обеспечивает последовательный двунаправленный канал передачи датаграмм с поддержкой соединений; датаграммы имеют ограниченную максимальную длину; от
получателя требуется за один раз прочитать целый пакет.

SOCK_RAW
Обеспечивает доступ к низкоуровневому сетевому протоколу.

SOCK_RDM
Обеспечивает надежную доставку датаграмм без гарантии их последовательности.

SOCK_PACKET
Устарело и не должно использоваться в новых программах; см. packet(7).

Некоторые типы сокетов могут не быть реализованными в некоторых наборах протоколов; например, SOCK_SEQPACKET не реализовано в наборе AF_INET.

Параметр protocol задает конкретный протокол, который используется на сокете. Обычно существует только один протокол, обеспечивающий конкретный тип сокета в
заданном наборе протоколов. Однако, возможно существование нескольких таких протоколов -- тогда и используется этот параметр. Номер протокола зависит от
используемого “домена коммуникации”, см. protocols(5). См. getprotoent(3), где описано, как сопоставлять имена протоколов их номерам.

Сокеты типа SOCK_STREAM являются дуплексными потоками байт, похожими на трубы. Они не сохраняют границы между записями. Потоковый сокет должен быть в соединённом
состоянии перед тем, как по нему можно отсылать и принимать данные. Соединение с другим сокетом создается с помощью системного вызова connect(2). После соединения
данные можно передавать, используя системные вызовы read(2) и write(2), или какой-то из вариантов системных вызовов send(2) и recv(2). Когда сессия закончена,
выполняется close(2). Вне-поточные данные могут передаваться, как описано в send(2), а приниматься, как описано в recv(2).

Коммуникационные протоколы, которые реализуют SOCK_STREAM, следят, чтобы данные не были потеряны или продублированы. Если у корреспондента имеется место в буфере,
но очередная порция данных не может быть передана за разумное время, то соединение считается мертвым. Когда на сокете включен флаг SO_KEEPALIVE, протокол каким-либо
способом проверяет, что другая сторона ещё жива. Сигнал SIGPIPE появляется, если процесс посылает или принимает данные, пользуясь разорванным потоком; это приводит
к тому, что неопытные процессы, не обрабатывающие сигнал, завершаются. Сокеты SOCK_SEQPACKET используют те же самые системные вызовы, что и сокеты SOCK_STREAM.
Единственное отличие в том, что вызовы read(2) вернут только запрошенное количество данных, а остаток прибывшего пакета будет отброшен. Границы между сообщениями во
входящих датаграммах сохраняются.

Сокеты SOCK_DGRAM и SOCK_RAW позволяют посылать датаграммы корреспондентам, заданным при вызове send(2). Датаграммы обычно принимаются с помощью вызова recvfrom(2),
который возвращает следующую датаграмму с соответствующим обратным адресом.

SOCK_PACKET --- это устаревший тип сокета, позволявший получать необработанные пакеты прямо от драйвера устройства. Используйте вместо него packet(7).

Системный вызов fcntl(2) с аргументом F_SETOWN может использоваться, чтобы задать группу процессов, которая будет получать сигнал SIGURG, когда прибывают
вне-поточные данные или сигнал SIGPIPE, когда соединение типа SOCK_STREAM неожиданно обрывается. Этот вызов также можно использовать, чтобы задать процесс или
группу процессов, которые получают асинхронные уведомления о вводе-выводе с помощью SIGIO. Использование F_SETOWN эквивалентно использованию ioctl(2) с аргументом
SIOSETOWN.

Когда сеть сообщает протоколу об ошибке (в случае IP, например, используя ICMP-сообщение), то для сокета устанавливается флаг ожидающей ошибки. Следующая операция с
этим сокетом вернет код ожидающей ошибки. Для некоторых протоколов можно разрешить для конкретного сокета очередь ошибок, чтобы получить детальную информацию об
ошибке; см. IP_RECVERR в ip(7).

Операции сокетов контролируются их параметрами. Эти параметры описаны в <sys/socket.h>. setsockopt(2) и getsockopt(2) используются, чтобы установить и получить
параметры, соответственно.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1; в противном случае возвращается дескриптор, ссылающийся на сокет.

ОШИБКИ
EPROTONOSUPPORT
Тип протокола или указанный протокол не поддерживаются в этом домене.

ENFILE Ядру не хватило памяти, чтобы создать новый сокет.

EMFILE Переполнение таблицы файлов процесса.

EACCES Не разрешено создание сокета указанного типа и/или протокола.

ENOBUFS или ENOMEM
Недостаточно памяти. Сокет не может быть создан, пока не освободится память.

EINVAL Неизвестный протокол, или недоступный набор протоколов.

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

СООТВЕТСТВИЕ СТАНДАРТАМ
4.4BSD (системный вызов socket появился в 4.2BSD). Обычно переносимо с/на не-BSD системы, имеющие реализацию сокетов BSD (включая варианты System V).

ЗАМЕЧАНИЕ
Для наборов протоколов под BSD 4.* используются константы PF_UNIX, PF_INET и т. д., тогда как AF_UNIX и т. п. используются для указания семьи адресов. Однако же,
страница руководства из BSD обещает: "Вообще, набор протоколов совпадает с семьей адресов", и в последующих стандартах везде используется AF_*.

СМОТРИ ТАКЖЕ
accept(2), bind(2), connect(2), getprotoent(3), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2),
write(2)
Добавлено через 4 минуты
#pragma, как твой интерпретатор поживает?
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
14.03.2010, 14:50 14
Цитата Сообщение от niXman Посмотреть сообщение
#pragma, как твой интерпретатор поживает?
Ну потихонечку делаю, у меня там была куча багов,которые просто даже понять,в чём они состоят,было сложно,из-за опечаток и т.д.,так как было очень много правок в коде,но сейчас в ревизии 75 уже более не менее стало работать,немного поправил приведение типов при работе с плавающими значениями (особенно это касается встроенных функций (пока только LINE),теперь отображение того,что отображалось некорректно в сравнении с интерпретатором Evg,работает также) .Сделал печать дерева после его создания,можешь поглядеть. Полностью переделал устройство папок,сделал на манер Evg, но там ещё надо многое доделать, например отделение runtime от представления(там кое-где ещё осталось),и сделать освобождение памяти,а также небольшую статистику,плюс стоит задача о рекурсии,как сделать так,чтобы увеличение стеков,связанных с программой на бейсике,не увеличивали (в разумных пределах) стек самого интерпретатора,я имею в виду чтобы он не ломался раньше чем переполнится стек,предназначенный для интерпретируемой программы.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
14.03.2010, 19:21 15
#pragma, если что-то нужно накодить, или в плане с++ - говори. желательно отдельными заданиями. т.к. сейчас, в весь твой проект, я просто умственно не въеду)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2010, 19:21
Помогаю со студенческими работами здесь

Ошибка при линковке "fatal bad object file record in module near module file offset 0x0000032D"
Добрый вечер, форумчане:) Обращаюсь к знающим ассемблер,а именно TASM. Код программы есть. После команды tasm lab создается obj -файл....

553 bad file name
553 bad file name такую вот ошибку выдает при закачке фотографии в одну из деректорий сайта. хостер narod.ru, место вроде есть. Что не так?...

Bad class file
При компиляции ругается на Note. import polymorphism.music.Note; пишет вот это

Ошибка Bad object file
Доброго времени суток, уважаемые форумчане. Возникла такая проблема: ...имеется листинг программы (приводится ниже; файл lw4_1 в...

ошибка 52 Bad file name or number
Доброго времени суток! Помогите разобраться, почему возникает ошибка? Sub proba() Dim FName1 As String Dim FName2 As String ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru