Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сокеты и ANSI C


Автор: Dagger 14.12.2002, 09:37
Тут вопрос такой возник по ходу разработки небольшой либы для своей прожки. Короче, есть функции по работе с сетью (типа 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;
}


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


Автор: Fantasist 14.12.2002, 11:29
Скажи где ошибка и какая.

Автор: Dagger 14.12.2002, 11:42
Компиллер 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

Автор: Dagger 15.12.2002, 06:21
Проблема решена. Вот исходный и вполне рабочий код для создания соединения в 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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)