The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"программирование сокета"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"программирование сокета"
Сообщение от quadr Искать по авторуВ закладки on 14-Дек-01, 19:58  (MSK)
Помогите новичку, если не трудно...
Пытаюсь создать сокет

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <strings.h>

int main()
{
int sd, close_success = 0, bind_success = 0;
struct sockaddr_in sockaddr;
sd = socket(PF_INET, SOCK_STREAM, 6);
bind_success = bind(sd, &sockaddr, sizeof(sockaddr));


close_success = close(sd);
return EXIT_SUCCESS;
}

компилирую cc -x c++ test
так он мне говорит, мол type `const sockaddr' is not a base type for type `sockaddr_in'.
Не могу понять в чём дело, ip(7) говорит, что sockaddr_in должен быть и точка, а bind(2) указывает, что функция должна вызыватся с параметром типа sockaddr.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: программирование сокета"
Сообщение от ultramarine997 Искать по авторуВ закладки on 15-Дек-01, 02:08  (MSK)
>struct sockaddr_in sockaddr;
                        ^
имя ты нашел какое выбрать :)
пусть будет:
  struct sockaddr_in saddr;

>sd = socket(PF_INET, SOCK_STREAM, 6);
                                   ^
тут можно 0 - для SOCK_STREAM по умолчанию TCP

>bind_success = bind(sd, &sockaddr, sizeof (sockaddr));

а тут непонятные мне C++'ные заморочки
вот так работает:
bind(sd,(struct sockaddr *)&saddr,sizeof(saddr));


>Не могу понять в чём дело,
>ip(7) говорит, что sockaddr_in должен
>быть и точка, а bind(2)
>указывает, что функция должна вызыватся
>с параметром типа sockaddr.

struct sockaddr - для домена PF_UNIX/PF_LOCAL - межпроцессное взаимодействие через сокеты

struct sockaddr_in - для PF_INET (и наверно всех остальных типа PF_IPX, etc)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: программирование сокета"
Сообщение от romanSA Искать по авторуВ закладки on 17-Дек-01, 12:02  (MSK)
>
>struct sockaddr - для домена PF_UNIX/PF_LOCAL
>- межпроцессное взаимодействие через сокеты
>
>
>struct sockaddr_in - для PF_INET (и
>наверно всех остальных типа PF_IPX,
>etc)

Не совсем верно: для домена PF_UNIX/PF_LOCAL _нужно_ использовать struct sockaddr_un.

Структура struct sockaddr_in - только для IP!
struct sockaddr введена исключительно для _обобщения_ работы с сокетами разных доменов.

Замечу, что все эти структуры - никак не связаны друг сдругом с точки зрения языка программирования (со всеми вытекающими последствиями).

Именно по-этому все функции работающие с адресами сокетов используют (struct sockaddr *) в виде параметра. Но так как "похожие" на sockaddr структуры имеют _разную_ длину - передаётся ещё и длина используемой структуры.

Кстати, сейчас рекомендуется пользоваться константами AF_xxx вместо PF_xxx, хотя _изначально_ и подразумевалось, что они могли иметь несовпадающие значения (т.е. идентификатор Address Family (AF_xxx) м.б. не равен идентификатору Protocol Family (PF_xxx))

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: программирование сокета"
Сообщение от mar emailИскать по авторуВ закладки on 15-Дек-01, 02:51  (MSK)
Кусок из Робачевского, кажется с переделками. Точно не помню, разбирались год назад :))
/* Cоздаем сокет, использующий протокол TCP */
if( (s=socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
  perror("Error calling socket socket()"); exit(1);
}

/* Зададим адрес коммуникационного узла */
  bzero(&serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = nport;

/* Свяжем сокет с этим адресом */
  if( bind(s, (struct sockaddr *) &serv_addr,
           sizeof(serv_addr)) ==-1 )
  {
    perror("Error calling bind()"); exit(1);
  }

/* Выведем сообщение с указанием адреса сервера */
   fprintf(stderr, "Server is ready: %s\n",
      inet_ntoa(serv_addr.sin_addr));
  if( listen(s,5)==-1 )
  {
    perror("Error calling listen()"); exit(1);
  }qq=1;
/* Бесконечный цикл получения запросов и их обработки*/
  while( qq)
  {

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру