第三章:套接口编程简介
1、协议相关套接口地址和通用套接口地址
有四种协议相关的套接口类型:IPV4,IPV6,Unix域和数据链路。每种协议都有自己的地址结构类型。
当套接口地址作为参数传递给任一socket API函数时,是作为指针来传递的,但socket API函数必须能够处理来自所支持的任何协议族的套接口地址结构。
那这个参数的类型申明成什么呢?
ANSI C可以通过指针类型void* 来解决这个问题,但是socketAPI是在ANSI C之前定义的,所以当时就想出了一个通用套接口地址结构。
四种协议相关套接口地址结构如下:
2、值-结果参数
(1)从进程到内核
有三个函数:bind、connect和sendto,一个参数是通用套接口地址结构指针,另一个参数是结构的整数大小。
Struct sockaddr_in serv;
Connect( sockfd, (SA *)&serv,sizeof(serv) );
由于指针和指针所指结构的大小都传递给内核,所以从进程到内核要确切拷贝多少数据是知道的。
(2)从内核到进程
从内核到进程传递套接口地址结构有4个函数:
Accept、recvfrom、getsockname和getpeername这个四个函数的两个参数是:指向套接口地址结构的指针和指向标示结构大小的整数的指针。
Struct sockaddr_un cli;
Socklen_t len;
Len = sizeof(cli);
Getpeername(unixfd, (SA *)&cli,&len);
为何将结构大小由整数改为指向整数的指针呢?这是因为:当函数被调用时,结构大小是一个值(此值告诉内核该结构的大小,使内核在写此结构时不至于越界),当函数返回时,结构大小又是一个结果(它告诉进程内核在此结构中确切存储了多少信息)(通过套接口结构最后一个参数是协议相关地址char sa_data[14],不同的协议返回不同的地址),这种参数类型叫值-结构参数。