Linux - статьи



     Купить мдф по низкой стоимости. |          

Реализация сети в операционной - часть 7


/* Identd and reporting IO signals */ struct socket *socket;

/* RPC and TUX layer private data */ void *user_data;

/* Callbacks */ void (*state_change)(struct sock *sk); void (*data_ready)(struct sock *sk,int bytes); void (*write_space)(struct sock *sk); void (*error_report)(struct sock *sk);

int (*backlog_rcv) (struct sock *sk, struct sk_buff *skb); void (*destruct)(struct sock *sk); };

Эта структура очень широко используется и имеет много hacks зависящих от конфигурации как видим для каждого протокола здесь найдется местечко

Сокеты проходят через процесс маршрутизации только один раз для каждого маршрута.Они содержат указатель на маршрут struct sock- >dst_cache* и вызывают ip_route_connect (net/route.h) для нахождения маршрута информация записывается в dst_cache и сокет дальше использует её не повторяя операции поиска маршрута пока не случится что-то необычное в етом и есть смысл connect

Установление соединеиния

Рассмотрим стандартный пример

/* look up host */ server = gethostbyname(SERVER_NAME); /* get socket */ sockfd = socket(AF_INET, SOCK_STREAM, 0); /* set up address */ address.sin_family = AF_INET; address.sin_port = htons(PORT_NUM); memcpy(&address.sin_addr,server->h_addr,server->h_length); /* connect to server */ connect(sockfd, &address, sizeof(address));

socket создаёт обект сокета определенного типа и инициалищирует его также делает дефолтовские очереди (incoming,outgoing,error,backlog) и заголовок TCP

connect определяет маршруты вызывая протокольно зависимые функции (tcp_v4_connect(),udp_connect()) net/socket.c

asmlinkage long sys_connect(int fd, struct sockaddr *uservaddr, int addrlen) { ................................ err = sock->ops->connect(sock, (struct sockaddr *) address, addrlen, sock->file->f_flags); ..........................

}

int sock_create(int family, int type, int protocol, struct socket **res) { .....................................

//cоздаем протокольно зависимый сокет! //-------------------------------------- if ((i = net_families[family]->create(sock, protocol)) < 0) { sock_release(sock); goto out; } ................. }




Содержание  Назад  Вперед