socket套接字 尽管使用TCP协议实现进程之间的通信安全可靠,但程序量很大。为了减少用户的工作量,年代由加州大学伯克利分校发展的版本BSDUNIX把此功能实现为一个应用接口(API),这就是大名鼎鼎的socket,一般译为套接字(很奇怪的翻译,叫套接体多好!)。 Socket:应用进程和传输层之间的接口。一个应用进程可以通过socket与另一个应用进程通信。 应用进程在网络通信中由某一个网络地址(比如.44.)的某一个端口来(15)定位。 网上有人问端口(port)与socket的区别。其实这是不同领域的术语。 端口是TCP/IP的网络概念,一般指根据TCP/IP或UDP协议通信的网络端点。 Socket是编程方面的术语,它是应用程序接口。Socket是通过获取端口和主机名,并将它们组合成一个数据结构来生成的。比如,UNIXsocket(在代码中)是一种可以用来收/发数据的数据结构或对象,是一种通信端点的软件实现。 在UNIX术语中,一个socket就是一个文件描述符(一个表示文件的整数)。 Socket类型:互联网sockets(表现形式为4字节的IP地址和2字节的端口号),UNIXsockets,X.25sockets。 Socket示意图 互联网socket类型 。流套接字streamsockets(SOCK_STREAM) 面向连接,使用TCP提供可靠的双向连接通信。 。数据报套接字Datagramsockets(SOCK_DGRAM) 依靠UDP,不可靠连接。 面向连接的协议 在C语言下函数简介 Socket()—获得文件描述符 。intsocket(intdomain,inttype,intprotocol); domain:指定使用何种的地址类型,比较常用的有: PF_INET,AF_INET:Ipv4网络协议; PF_INET6,AF_INET6:Ipv6网络协议 type:SOCK_STREAM或SOCK_DGRAM SOCK_STREAM:提供面向连接的稳定数据传输,即TCP协议。 SOCK_DGRAM:使用不连续不可靠的数据包连接。 protocol:0根据类型自动选择正确的协议。 返回值:返回一个socket描述符供系统后面使用,出错返回-1。 Bind()—我在什么端口(whatportamIon?) 。把一个socket与本地机器的端口绑定起来。 端口号:内核使用端口号将进程与传入的数据包匹配。 。intbind(intsockfd,structsockaddr*my_addr,intaddrlen) sockfd:socket()返回的socket文件描述符。 my_addr:指向结构体sockaddr的指针,结构体包含IP地址和端口的信息。 addrlen:指向sizeof(structsockaddr_in),结构体的长度。 返回值:出错时返回值为-1。 connect()-Hello! 。socket与远程主机连接,相当于打电话时的‘你好’。 。intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen) sockfd:socket()返回的socket文件描述符。 serv_addr:指向结构体sockaddr的指针,结构体包含IP地址和端口的信息 addrlen:指向sizeof(structsockaddr_in),结构体的长度。 返回值:出错时返回值为-1 。使用connect()不一定都要用bind()。 listen()-等待电话 。等待输入连接,就像等待别人的电话‘给我电话啊’。 。intlisten(intsockfd,intbacklog); sockfd:socket()返回的socket文件描述符。 backlog:在输入队列上允许监听的连线数。 返回值:出错时返回值为-1 在使用listen前不一定要调用bind()。 accept()–铃响等到来电! 。获取您正在侦听的端口上挂起的连接()。 。intaccept(intsockfd,void*addr,int*addrlen); sockfd:socket()返回的socket文件描述符。 addr:指向本地结构体sockaddr_in的指针,结构体中装有输入连接的信息。 addrlen:指向sizeof(structsockaddr_in),结构体的长度。 返回值:返回一个新的套接字文件描述符,用于这个接受到的连接。如果出错,返回-1。 send()andrecv()–开始通话! 。通过流套接字或数据报套接字,这两个函数用于的发/收数据。 。intsend(intsockfd,constvoid*msg,intlen,intflags); sockfd:你要发送的数据的套接字文件描述符。 msg:指向你要发送的数据的指针。 len:要发送数据的字节数。 flags:为0表示当下操作。 返回值:实际发送的字节数(可能小于你要发送的字节数),出错返回-1。 。intrecv(intsockfd,void*buf,intlen,intflags); sockfd:你要从中读取数据的套接字文件描述符。 buf:指向要把数据读入的缓冲区。 len:缓冲区最大长度。 flags:0表示当前操作。 返回值:实际读入缓冲区的字节数,出错返回-1。 如果返回0,表明远程端对你关闭了。 sendto()andrecvfrom()–数据报DGRAMstyle 。intsendto(intsockfd,constvoid*msg,intlen,int flags,conststructsockaddr*to,inttolen); to:指向结构体sockaddr的指针,结构体含有目标的IP地址和端口。 tolen:结构体sockaddr的大小。 。intrecvfrom(intsockfd,void*buf,intlen,intflags, structsockaddr*from,int*fromlen); from:指向本地结构体sockaddr的指针,结构体用于装载始发机器的IP地址和端口信息。 fromlen:装在from结构体中的地址长度。 intclose(intsockfd); 关闭并释放连接在线的套接字描述符。 避免多余的收/发。 上面是低层的C语言实现,python在此基础上做了封装,生成了python的socket模块。 白癜风治疗多少钱北京中科医院是假的转载请注明原文网址:http://www.gzdatangtv.com/bcyykf/12748.html |