择善教育-linux阶段lesson27tcp.通信tcpudp_第1页
择善教育-linux阶段lesson27tcp.通信tcpudp_第2页
择善教育-linux阶段lesson27tcp.通信tcpudp_第3页
择善教育-linux阶段lesson27tcp.通信tcpudp_第4页
择善教育-linux阶段lesson27tcp.通信tcpudp_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP通信网络通信主机---主机主机---服务器主机---服务器---主机网络字节序--使用大字节序htonl(x)long主机序转网络序htons(x)short主机序转网络序TCP通信TCP通信流程TCP通信创建套接字#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol)返回值:套接字domain协议族type套接字类型protocol套接字协议TCP通信套接字SOCKET像操作文件描述符一样操作套接字双向通信接口,起源于管道比管道功能更强,应用更广泛支持read,write等操作用于收发数据TCP通信socket创建套接字---domainPF_UNIX,PF_LOCAL本地通信PF_INETIPV4协议PF_INET6IPV6协议PF_IPXNovell公司的IPC通信协议PF_NETLINK与内核间的接口PF_X25ITU-TX.25/ISO-8208PF_AX25无线AX.25协议PF_ATMPVC访问原始ATM的PVC(永久虚连接)PF_APPLETALK苹果公司的Appletalk协议PF_PACKET底层包接口TCP通信socket创建套接字---typeSOCK_STREAM

提供面向连接的,有序的,可靠数据流TCPSOCK_DGRAM

支持数据报UDPSOCK_SEQPACKET提供基于连接的有序的,可靠数据报通信SOCK_RAW

对原始网络协议访问SOCK_RDM提供可靠的数据报层,不保证有序性SOCK_PATET已废弃TCP通信套接字SOCKET类型SOCK_STREAM流套接字:使用TCP协议。提供面向连接的,有序的,可靠的数据通信流。如telnet,http等SOCK_DGRAM数据报套接字:使用UDP协议。提供无连接的,无序的,不保证可靠性的数据通信流。如tftp,bootp等SOCK_RAW原始流套接字:收发原始数据包,应用于底层协议开发,进行底层操作只有root用户才有权限创建这个socketTCP通信socket创建套接字---protocol<netinet/in.h>IPPROTO_IP(0):接受所有IP数据包IPPROTO_ICMP:ICMP协议(ping)IPPROTO_TCP:TCP协议IPPROTO_UDP:UDP协议IPPROTO_RAW:RAW只能发送包,且需要自己填写IP头,计算校验和TCP通信绑定套接字intbind(intsockfd,structsockaddr*myAddr,socklen_taddrLen)sockfd套接字描述符myAddr主机地址addrLensockaddr结构体大小实现本机地址(协议族+IP+端口)与套接字绑定,收发消息即读写套接字文件描述符TCP通信套接字地址structsockaddr{u_shortsa_family;//协议族charsa_data[14];//协议地址}对于不同的协议族,协议地址sa_data[14]有不同的描述方式TCP通信套接字地址AF_INET协议族的协议地址structsockaddr_in{shortsin_family;/*地址族AF_INET*/u_shortsin_port;/*端口号*/structin_addrsin_addr;/*32位IP地址*/charsin_zero[8];/*预留*/}structin_addr{u_longs_addr;}TCP通信IP地址转换#include<arpa/inet.h>ulonginet_addr(char*pAddr)字符串IP转整数IPintinet_aton(char*pAddr,structin_addr*pInAddr)字符串IP转整数IPchar*inet_ntoa(structin_addrinAddr)整数IP转字符串IPTCP通信字节序转换网络字节序:大字节序主机字节序:x86:小字节序ppc:大字节序主机序转网络序ulonghtonl(ulonghost)ushorthtons(ushorthost)网络序转主机序ulongntohl(ulongnet)ushortntohs(ushortnet)TCP通信监听端口intlisten(intsockfd,intbacklog)sockfd监听的套接字backlog套接字接收的最大连接数,超出则向客户端发出ECONNEREFUSED错误TCP通信连接处理intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen)阻塞,等待接收客户端连接申请接收成功,则创建套接字,用于发送消息给客户端addr获取到客户端地址addrlen获取到客户端地址大小sockfd设置为非阻塞的情况,未接收到连接申请,则返回错误TCP通信关闭套接字1:close(sockfd)同文件操作关闭时,只是将套接字访问计数器-1,计数器为0时真正关闭用于创建子进程进行并发管理2:shutdown(sockfd,how)按需关闭套接字SHUT_RD(0):关闭读功能,丢弃接收到的数据SHUT_WR(1):关闭写功能,不能发送数据SHUT_RDWR(2):彻底关闭套接字连接TCP通信客户端通信连接intconnect(intsockfd,structsockaddr*srvaddr,intaddrlen)sockfd创建的用于通信套接字srvaddr接收端地址addrlen地址结构体大小TCP通信发送数据write(intsockfd,void*buf,size_tlen)send(intsockfd,void*msg,intlen,intflags)flags标志一般填0,特殊情况下用法如下TCP通信发送数据的发送标志flagsMSG_CONFIRM通知链路层,即将收到回应,链路层未收到回应,则会定期探测邻居消息(只能用于SOCK_DGRAM和SOCK_RAW)MSG_DONTROUTE不通过网关发送数据,只发送到同一子网计算机MSG_DONTWAIT使用非阻塞操作,阻塞则返回EAGAIN错误TCP通信发送数据的发送标志flagsMSG_EOR结束记录(SOCK_SEQPACKET时使用)MSG_MORE还有后续数据要发送,效果相当于套接字使用了TCP_CORK属性。通知内核,这个帧的数据还没发完,后续数据发送后,这个数据才能发送出去。MSG_OOB

发送带外数据。提高优先级,先于其他数据进行发送TCP通信接收消息read(intsockfd,void*buf,size_tlen)recv(intsockfd,void*buf,size_tlen,intflags)flags标志一般填0,特殊情况下用法如下TCP通信接收消息的接收标志flagsMSG_DONTWAIT非阻塞操作,阻塞则返回EAGAIN错误MSG_OOB接收带外数据MSG_PEEK只查看消息,不从缓冲区删除数据MSG_TRUNC返回包的真实长度(只用于流套接字)MSG_WAITALL等待接收到的数据长度为len后才返回TCP通信服务端例程:等待(被动)接收发送1:创建socket:socket()2:绑定端口:bind()3:监听端口:listen()4:接受连接:accept()5:读取消息:read()6:发送消息:write()7:关闭套接字:close()TCP通信客户端例程:主动发送接收1:创建socket:socket()2:连接服务端:connect()3:发送数据:write()4:接受结果:read()5:关闭套接字:close()TCP通信UDP通信UDP通信流程TCP通信UDP通信没有固定连接客户端发完包,就不管了,也不知道服务端是不是收到了UDP通信发送消息sendto(intsockfd,void*buf,size_tlen,intflags,structsockaddr*to,socklen_ttolen);UDP没有accept创建新的通信fd,需要指定目标地址函数可以用于TCP通信,后面两个参数会忽略UDP通信接收消息recvfrom(intsockfd,void*buf,size_tlen,intflags,sturctsockaddr*from,socklen_t*fromlen)UDP没有accept函数来获取对端地址,这里增加了2个参数函数可以用于TCP通信TCP通信TCP通信raw底层数据报TCP通信TCP通信TCP通信套接字选项intgetsockopt(intfd,intlevel,intoptname,void*optVal,int*optLen)获取套接字intsetsockopt(intfd,intlevel,intoptname,void*optVal,intoptLen)fd:套接字idlevel:选项作用的套接字层级optname:选项名optVal:选项值optLen:选项值长度TCP通信套接字层级levelSOL_SOCKETsocket层次IPPROTO_IPIP协议层次IPPROTO_TCPTCP协议层次TCP通信SOL_SOCKET层的选项(默认都是int值)SO_DEBUG:调试追踪SO_REUSEADDR:重用本地地址SO_RESUEPORT:重用本地端口SO_KEEPALIVE:周期性测试线路连接情况(心跳包)SO_DONTROUTE:不经过路由机制发送数据SO_LINGER:有数据发送则关闭延时(structlinger)SO_BROADCAST:支持发送数据报广播SO_OOBINLINE:带外数据和正常数据放在同一个队列SO_SNDBUF:发送数据缓冲区大小TCP通信SOL_SOCKET层的选项SO_RCVBUF:接收数据缓冲

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论