# if defined (CONFIG_WAN_ROUTER) | | defined (CONFIG_WAN_ROUTER_MODULE)
struct wanpipe_opt * af_wanpipe;
# endif
} protinfo;
/* This part is used for the timeout functions. */p> struct timer_list timer;/* This is the sock cleanup timer. */p> struct timeval stamp;
/* Identd and reporting IO signals */p> 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;
}
.................
}
Функції p> Socket
Перевіряємо помилки
Виділяємо пам'ять
Ложим сокет до списку inode
Встановлюємо покажчи...