您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > unix网络编程-读书笔记(1)
Socket定义的结构体......................................................................................................2值-结果参数:.................................................................................................................4字节序转换函数:...........................................................................................................5字节操作函数:...............................................................................................................5ANSIC函数:................................................................................................................6ASCII码与网络字节序二进制转换...............................................................................6Len的值在头文件netinet/in.h中有定义:...............................................................6对字节流套接口的读写:...............................................................................................7判断描述字类型:...........................................................................................................7Socket函数:..................................................................................................................8TCP通信客户端,服务器端流程:..............................................................................8协议族类型和流类型.......................................................................................................9connect函数.....................................................................................................................9Bind函数.......................................................................................................................10listen函数......................................................................................................................10accept函数.....................................................................................................................11Fork和exec函数..........................................................................................................11并发服务器。.................................................................................................................12Close函数......................................................................................................................12getsockname和getpeername函数..............................................................................12Socket定义的结构体#includenetinet/in.hStructin_addr{In_addr_ts_addr;32位PIv4地址网络字节序}Structsockaddr_in{Uint8_tsin_len;//结构长度(16)不管它Sa_family_tsin_family;//协议族AF_INET8位或16位无符号整数In_port_tsin_port;//16位TCPUDP端口号//网络字节序Structin_addrsin_addr;//32位IPv4地址//网络字节序Charsin_zero[8];//unused}从进程到内核传递套接口地址结构4个套接口函数:BindConnectSendtoSendmsg//地址结构长度参数是一个结构成员从内核到进程传递套接口地址结构的5个套接口函数:AcceptRecvfromRecvmsg//地址结构长度参数是一个结构成员GetpeernameGetsockname//均在返回到进程之前设置sin_len成员Posix只需要这个结构中的三个成员:sin_familysin_addrsin_portsys/types.hInt8_t带符号的8位整数·Uint8_t无符号8位整数·Int16_t带符号16位整数·Uint16_t无符号16位整数·Int32_t带符号32位整数·Uint32_t无符号32位整数sys/socket.hSa_family_t套接口地址结构的地址族·Socklen_t套接口地址结构的长度,一般为uint32_tnetinet/in.hIn_addr_tIPv4地址,一般为uint32_tIn_port_tTCP或UDP端口,一般为uint16_tSin_zero成员暂时不适用设置为全0套接口地址结构仅在主机上使用:结构本身不参与通信通用套接口地址结构:sys/socket.hStructsockaddr{Uint8_tsa_len;Sa_family_tsa_family;//addressfamily;AF_xxxvalueCharsa_data[14];//protocol-specificaddress}内核根据sa_family的值确定指针的类型netinet/in.hIPv6套接口地址结构:Structin6_addr{Uint8_ts6_addr[16];//128位IPv6地址}#defineSIN6_LEN//requiredforcompile-timetestsStructsockaddr_in6{Uint8_tsin6_len;//结构的长度(24)Sa_family_tsin6_family;//AF_INET6In_port_tsin6_port;//transportlayerport#//网络字节序Uint32_tsin6_flowinfo;//priority&flowlabel//网络字节序Structin6_addrsin6_addr;//IPv6地址//网络字节序}如果系统支持套接口地址结构长度成员,则SIN6_LEN常值必须定义Sin6_flowinfo成员分三个字段:低24位是流量标号;下4位是优先级;在下4位保留套接口地址结构的比较:IPv4,IPv6,Unix域和数据链路前两个长度固定,后两个长度可变.可变的话长度通过参数传递进函数值-结果参数:1.从进程到内核传递套接口地址结构3个套接口函数:Bind,Connect,SendtoConnect第一个参数是socket标志,2套接口地址结构指针3结构的大小(值传递)套接口地址结构大小数据类型是socklen_t,Posix将其定义为uint32_t2.从内核到进程传递套接口地址结构的4个套接口函数:Accept,Recvfrom,Getpeername,Getsockname套接口地址大小传递的是指针Structsockaddr_uncli;//unixdomainSocklen_tlen;len=sizeof(cli);getpeername(unixfd,(SA*)&cli,&len);字节序转换函数:字节操作函数:ANSIC函数:源与目标重叠时,bcopy能够正确处理,而memcpy是不可预知的,必须用memmove函数。inet_atoninet_addrinet_ntoa函数ASCII码与网络字节序二进制转换inet_pton和inet_ntop对IPv4和IPv6地址都能处理。Len的值在头文件netinet/in.h中有定义:#defineINET_ADDRSTRLEN16//IPv4地址ASCII码长度#dedineINET6_ADDRSTRLEN46//IPv6地址ASCII码长度如果len太小,则返回空字符,置errno为ENOSPC小结:对字节流套接口的读写:判断描述字类型:fdtype在头文件sys/stat.h中定义了大量的S_IFxxx常值Socket函数:TCP通信客户端,服务器端流程:协议族类型和流类型Socket函数成功时返回一个文件描述字。AF_xxx与PF_xxxAF_前缀代表地址族,PF_前缀代表协议族。历史想法:单个协议族支持多个地址族。PF_值用来创建套接口,而AF_值用于套接口地址结构。现实中是AF_值与PF_值相等。connect函数客户端连接服务器时第二个参数:必须含有服务器的IP地址和端口号客户端不必非得调用函数bind因为内核会选择源IP地址和一个临时的端口每当函数返回失败,都必须关闭套接口描述字,重新调用socket。Bind函数可以指定一个端口号,指定一个IP地址,可以两者都指定,可以都不指定。如果不指定,当调用函数connect和listen时,内核分配临时的端口号。给函数bind指定用于绑定的IP地址和端口号的结果IPv4通配地址由常值INADDR_ANY来指定。其值一般为0IPv4:IPv6:In6addr_any初始化为常值:IN6ADDR_ANY_INIT在头文件:netinet/in.h中netinet/in.h中定义的INADDR_常值都是主机字节序的,应该使用htonl为查看内核绑定的临时端口号可以调用getsockname来返回协议地址查看listen函数一般的,此函数在调用socket和bind之后,调用accept之前调用。Backlog是已完成连接队列(ESTAB
本文标题:unix网络编程-读书笔记(1)
链接地址:https://www.777doc.com/doc-4013160 .html