unix网络编程-读书笔记(1)(8页).doc

上传人:1595****071 文档编号:36780949 上传时间:2022-08-28 格式:DOC 页数:8 大小:219KB
返回 下载 相关 举报
unix网络编程-读书笔记(1)(8页).doc_第1页
第1页 / 共8页
unix网络编程-读书笔记(1)(8页).doc_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《unix网络编程-读书笔记(1)(8页).doc》由会员分享,可在线阅读,更多相关《unix网络编程-读书笔记(1)(8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-unix网络编程-读书笔记(1)-第 8 页Socket定义的结构体2值-结果参数:4字节序转换函数:5字节操作函数:5ANSI C函数:6ASCII码与网络字节序二进制转换6Len的值在头文件中有定义:6对字节流套接口的读写:7判断描述字类型:7Socket函数:8TCP通信客户端,服务器端流程:8协议族类型和流类型9connect函数9Bind函数10listen函数10accept函数11Fork和exec函数11并发服务器。12Close函数12getsockname和getpeername函数12Socket定义的结构体#include Struct in_addrIn_addr_

2、t s_addr; 32位PI v4 地址 网络字节序Struct sockaddr_inUint8_t sin_len;/结构长度(16)不管它Sa_family_t sin_family;/协议族 AF_INET 8位或16位无符号整数In_port_t sin_port;/16 位 TCP UDP 端口号/网络字节序Struct in_addr sin_addr;/32位 IP v4 地址/网络字节序Char sin_zero8;/unused从进程到内核传递套接口地址结构4个套接口函数:BindConnectSendtoSendmsg/地址结构长度参数是一个结构成员从内核到进程传递套接

3、口地址结构的5个套接口函数:AcceptRecvfromRecvmsg/地址结构长度参数是一个结构成员GetpeernameGetsockname/均在返回到进程之前设置sin_len成员Posix 只需要这个结构中的三个成员:sin_family sin_addr sin_portInt8_t带符号的8位整数Uint8_t无符号8位整数Int16_t带符号16位整数Uint16_t无符号16位整数Int32_t带符号32位整数Uint32_t无符号32位整数Sa_family_t套接口地址结构的地址族Socklen_t套接口地址结构的长度,一般为uint32_tIn_addr_tIP v4地

4、址,一般为uint32_tIn_port_tTCP或UDP端口,一般为uint16_tSin_zero成员暂时不适用设置为全0套接口地址结构仅在主机上使用:结构本身不参与通信通用套接口地址结构:Struct sockaddrUint8_tsa_len;Sa_family_tsa_family;/address family ; AF_xxx valueChar sa_data14;/protocol-specific address内核根据sa_family 的值确定指针的类型IP v6 套接口地址结构:Struct in6_addrUint8_t s6_addr16;/128位IP v6 地

5、址#define SIN6_LEN /required for compile-time testsStruct sockaddr_in6Uint8_tsin6_len;/结构的长度(24)Sa_family_tsin6_family;/AF_INET6In_port_tsin6_port;/transport layer port #/网络字节序Uint32_tsin6_flowinfo;/priority & flow label/网络字节序Struct in6_addrsin6_addr;/IPv6 地址/网络字节序如果系统支持套接口地址结构长度成员,则SIN6_LEN常值必须定义Sin

6、6_flowinfo成员分三个字段:低24位是流量标号;下4位是优先级;在下4位保留套接口地址结构的比较:IPv4,IPv6,Unix域和数据链路前两个长度固定,后两个长度可变. 可变的话长度通过参数传递进函数值-结果参数:1.从进程到内核传递套接口地址结构3个套接口函数:Bind,Connect,SendtoConnect 第一个参数是socket标志,2套接口地址结构指针3 结构的大小(值传递)套接口地址结构大小数据类型是socklen_t,Posix将其定义为uint32_t2.从内核到进程传递套接口地址结构的4个套接口函数:Accept,Recvfrom,Getpeername,Get

7、sockname套接口地址大小传递的是指针Struct sockaddr_un cli;/unix domainSocklen_tlen;len = sizeof(cli);getpeername(unixfd,(SA *)&cli,&len);字节序转换函数:字节操作函数:ANSI C函数:源与目标重叠时,bcopy能够正确处理,而memcpy是不可预知的,必须用memmove函数。inet_atoninet_addrinet_ntoa函数ASCII码与网络字节序二进制转换inet_pton 和 inet_ntop 对IP v4和IP v6地址都能处理。Len的值在头文件中有定义:#defi

8、ne INET_ADDRSTRLEN 16/IP v4地址 ASCII 码长度#dedine INET6_ADDRSTRLEN 46/IP v6 地址ASCII 码长度如果len太小,则返回空字符,置errno为ENOSPC小结:对字节流套接口的读写:判断描述字类型:fdtype在头文件中定义了大量的S_IFxxx常值Socket函数:TCP通信客户端,服务器端流程:协议族类型和流类型Socket函数成功时返回一个文件描述字。AF_xxx与PF_xxxAF_前缀代表地址族,PF_前缀代表协议族。历史想法:单个协议族支持多个地址族。PF_值用来创建套接口,而AF_值用于套接口地址结构。现实中是A

9、F_值与PF_值相等。connect函数客户端连接服务器时第二个参数:必须含有服务器的IP地址和端口号客户端不必非得调用函数bind 因为内核会选择源IP地址和一个临时的端口每当函数返回失败,都必须关闭套接口描述字,重新调用socket。Bind函数可以指定一个端口号,指定一个IP地址,可以两者都指定,可以都不指定。如果不指定,当调用函数connect 和 listen 时,内核分配临时的端口号。给函数bind 指定用于绑定的IP地址和端口号的结果IPv4 通配地址由常值INADDR_ANY 来指定。其值一般为0IP v4:IP v6:In6addr_any 初始化为常值:IN6ADDR_AN

10、Y_INIT 在头文件: 中 中定义的INADDR_常值都是主机字节序的,应该使用htonl为查看内核绑定的临时端口号可以调用getsockname 来返回协议地址查看listen函数一般的,此函数在调用socket和bind之后,调用accept之前调用。Backlog是已完成连接队列(ESTABLISHED状态)和未完成连接队列(SYN_RCVD状态)之和的最大值accept函数accept函数有TCP服务器调用,从已完成连接队列头返回下一个已完成连接。若已完成连接队列为空,则进程睡眠(假定套接口为缺省的阻塞方式)。函数的最大的返回值是连接套接口描述字,客户进程协议地址 clladdr,协

11、议长度addrlen参数一是 监听套接口描述字Fork和exec函数父进程调用fork之前打开的所有描述字在函数fork返回之后是共享的。六个exec函数之间的区别:A 被执行的程序是由文件名(filename)还是路径名(pathname)指定B 新程序的参数是列出还是有一个指针数组来索引C 调用进程的环境传递给新程序还是指定新环境其中,一般的只有execve 是内核的系统调用,其他函数都是调用execve的库函数一般来说,描述字在exec之前打开的在跨exec过程保持打开。但可以用函数fcntl设置FD_CLOSEXEC描述字来关闭。并发服务器。为什么父进程 close 掉套接口描述字之后

12、子进程共享的套接口描述字还可以使用?答:因为每个文件或套接口都有一个访问计数,该计数在文件表项中维护,它表示当前指向该文件或套接口的打开的描述字个数。从socket返回后,文件表项访问计数值是1,accept返回还是1,fork返回后,两个描述字在父子进程间共享(即复制),所以,与两个套接口相关联的文件表项访问计数值均为2。当父进程关闭描述符,只是将访问计数值从2减为1。描述字只在访问计数达到0时才真正的关闭。如果确实想对TCP连接发一个FIN,可以改用shutdown而不是close.Close函数#include Int close(int sockfd);getsockname和getp

13、eername函数这两个函数返回与套接口关联的本地协议地址,或者返回与套接口关联的远程协议地址。getsockname返回内核分配给此连接的本地IP地址和本地端口号。getsockname可以获得某套接口的地址族。在绑定一个通配IP地址的TCP服务器上,一旦与客户建立了连接,就可以调用getsockname来获取分配给此连接的本地IP地址。在这样的调用中套接口描述字参数必须是已连接的套接口描述字,而不是监听套接口的描述字。当一个服务器由调用accpet进程调用exec启动执行时,它获得客户身份的唯一途径便是调用getpeername。exec执行的程序中获取监听套接字的方法:1. 通过调用exec的进程可以将描述字号格式化为一个字符串,并将它作为一个命令行参数传递给新程序;2. 确立调用 exec 前把某个描述字总是设定成已连接套接口的约定。第5 章 TCP 客户-服务器程序例子111页。Wait和waitpid函数#include pid_t wait(int *statloc)pid_t waitpid(pid_t pid,int *statloc,int options);信号处理自定义函数:Signal

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 单元课程

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁