Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты и ANSI C, Синтаксис описания 
:(
    Опции темы
Dagger
Дата 14.12.2002, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



Тут вопрос такой возник по ходу разработки небольшой либы для своей прожки. Короче, есть функции по работе с сетью (типа TSocket B BCB), надо бы их в ANSI-C перевести (они написаны на С++). Все, вроде-бы, в поряде, да только создание сокета хромает. Вот этот код никак не хочет компилится под сишным компиллером:
Код
SOCKET create_out_socket(char *hostname, long int port){
  int res,err;
  SOCKET s;
  struct sockaddr_in Saddr;
  err = WSAStartup( 0x101, &W );
  if(err!=0)return -2;
  s=socket(AF_INET,SOCK_STREAM,0);
  Saddr.sin_family=AF_INET;
  Saddr.sin_port=htons(port);
  hostent *H=gethostbyname(hostname);
  if (H == NULL)return 0;
  Saddr.sin_addr.s_addr=/*0x291743c2;*/ *((unsigned long *) H->h_addr);
  res=connect(s,(sockaddr*)&Saddr,sizeof(Saddr));
  if(res!=0)return -1;
 return s;
}


Что здесь не так?


PM MAIL WWW Skype   Вверх
Fantasist
Дата 14.12.2002, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Скажи где ошибка и какая.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Dagger
  Дата 14.12.2002, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



Компиллер lcc win32.
Код

Wedit output window build: Sat Dec 14 02:40:26 2002
Error e:\lcc\projects\misq\pc\pc.c: 45  undeclared identifier `hostent'
Error e:\lcc\projects\misq\pc\pc.c: 45  undeclared identifier `H'
Error e:\lcc\projects\misq\pc\pc.c: 45  operands of = have illegal types `int' and `pointer to struct hostent'
Error e:\lcc\projects\misq\pc\pc.c: 45  the left hand side of the assignment can't be assigned to
Error e:\lcc\projects\misq\pc\pc.c: 46  operands of == have illegal types `int' and `pointer to void'
Error e:\lcc\projects\misq\pc\pc.c: 47  left operand of -> has incompatible type `int'
Error e:\lcc\projects\misq\pc\pc.c: 47  type error: pointer expected
Error e:\lcc\projects\misq\pc\pc.c: 48  undeclared identifier `sockaddr'
Error e:\lcc\projects\misq\pc\pc.c: 48  illegal expression
Error e:\lcc\projects\misq\pc\pc.c: 48  operands of & have illegal types `int' and `struct sockaddr_in'
Error e:\lcc\projects\misq\pc\pc.c: 48  type error in argument 2 to `connect'; found `unsigned int' expected `pointer to const struct sockaddr'
Error e:\lcc\projects\misq\pc\pc.c: 48  syntax error; found `;' expecting `)'
Error e:\lcc\projects\misq\pc\pc.c: 48  insufficient number of arguments to `connect'
Warning e:\lcc\projects\misq\pc\pc.c: 48  possible usage of sockaddr before definition
Warning e:\lcc\projects\misq\pc\pc.c: 45  possible usage of H before definition
Warning e:\lcc\projects\misq\pc\pc.c: 45  possible usage of hostent before definition
Compilation + link time:0.9 sec, Return code: 1

PM MAIL WWW Skype   Вверх
Dagger
Дата 15.12.2002, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

Репутация: нет
Всего: 8



Проблема решена. Вот исходный и вполне рабочий код для создания соединения в ANSI C. Но одна проблема - код не возвращает ошибок. Т.е. если хост существует, то оно возвращает соединение. А если нет соединения, то ошибки не возвращает (или я не знаю, как ее выудить).
Код:

Код

SOCKET create_out_socket(char *hostname, long int port){
  int res,err;
  SOCKET s;
  struct hostent *H;
  struct sockaddr_in Saddr;
  err = WSAStartup( 0x101, &W );
  if(err!=0)return -2;
  s=socket(AF_INET,SOCK_STREAM,0);
  Saddr.sin_family=AF_INET;
  Saddr.sin_port=htons(port);
  H=gethostbyname(hostname);
  if (!H)return -1;
  Saddr.sin_addr.s_addr=/*0x291743c2;*/ *((unsigned long *) H->h_addr);
  res=connect(s,(struct sockaddr*)&Saddr,sizeof(Saddr));
  if(res!=0)return -1;
 return s;
}

PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0845 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.