在这一章里主要讲述了用多种方法获取和设置套接口选项。
l getsockopt/setsockopt
l fcntl
l ioctl
<sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) |
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t *optlen) |
sockfd只想一个打开的套接口描述字,level(级别)指定系统中解释选项的代码,普通套接口代码或特定协议的代码。
optval是一个指向变量的指针,通过它可由上面两个函数获取或者存储当前值。此变量大小由最后一个参数指定。
level和optname可以从《unix网络编程》第七章获取,太多不写了,也没怎么看,以后的章节据说还会接触到,一下子全看了也是忘了。
相对于tcp套接口编程,udp相对简单。因为tcp是可靠连接,而UDP是非可靠的。他们本质上有所不同。前面提到的函数可以用到。这里还有一些
<sys/socket.h>
ssize_t recvfrom( int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); |
ssize_t sendto( int sockfd,const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen); |
成功-返回读写字节数, 失败返回-1
UDP的connect函数,结果与tcp调用它毫不相同,没有三次握手过程。内核只是记录对方的ip和端口号,他们包含在传递给connect的套接口地址结构中,并立即返回给调用进程。
此时不能再用sendto而使用write或send;接受不使用recvfrom而使用read或recv。
UDP取法流量控制,可以根据第七章设置UDP缓冲区大小,SO_RCVBUF
UDP外出接口确定,可以调用getsockname函数获得本地ip地址和端口号
可以使用select函数控制tcp和udp服务器