文档介绍:LINUXC编程套接字与网络编程TCP/IP协议简介Socket编程专门用于为用户提供应用服务(ftp,,Smtp..)TCP/IP参考模型应用层传输层互联网层网络接口层管理连接中端到端通信的协议层,定义了TCP(传输控制协议),UDP(用户数据报协议),并提出了port的概念。主要实现将上层传下来的数据包封装成底层物理网络支持的数据格式,并转化成真正的电气信号在物理网络上传输。最重要的概念IP协议,即对IP地址进行了分组。网络协议中一些术语>面向连接(Connection-oriented)的协议有两个端点,在通信之前必须建立连接。>协议提供了顺序性(sequencing),保证数据按照发送的顺序到达目的地。>协议提供了错误控制(errorcontrol),可以自动丢弃损坏的消息,然后安排重新发送数据。>流(stream)协议仅仅识别字节边界,也就是说一个字节的序列可以被分割成片,然后发送出去,但是接收到的数据仍然是原数据。>基于包(Packet-based)协议处理数据包,保持包边界向接收者发送整个包。UDP(数据报协议datagram)协议是基于包协议,TCP协议是基于流协议的,不仅提供顺序性,而且提供了错误控制。Linux中的TCP/IP网络结构用户进程套接字接口网络协议网络设备是进程与网络协议之间的接口中。在Linux中socket属于文件系统的一部分,网络通信可以看成对文件的读取。在一个通信连接中的两端通信程序各自有一个套接字来描述自己那一端。Socket编程套接字与文件描述字相同点:像文件描述字一样,套接字也使用read,write来读写数据。不同点:套接字除了有一个地址以外,还包含3个属性—域、类型和协议。Socket编程相关的数据结构1Structsockaddr:保存着套接字的地址信息Structsockaddr{Unsignedshortsa_family;//地址族Charsa_data[14];//套接字实际的地址数据(目的地址及端口)}每种协议都有自己的网络地址的定义,套接字API必须对这些不同的地址定义进行抽象。通信域套接字地址结构sockaddr_instructsockaddr_in{shortintsin_family;//地址族unsignedshortintsin_port;//端口号structin_addrsin_addr;//IP地址charsin_zero[8];//填充0以保持与structsockaddr同样大小,这样一个指向sockaddr_in数据结构的指针可以强行转换为一个指向数据结构sockaddr的指针。}//地址使用的是网络字节顺序,需要通过特殊函数进行转换Socket编程Socket编程相关的数据结构2Socket编程网络字节顺序TCP/IP网络通常是异构的,它包含大量不同种类的计算机及体系结构。在体系结构上最大的区别就是存储数据的方式。常见的方式有两种,大尾端(把最高位的字节存放在最低的硬件地址上)和小尾端(反之)。TCP/IP协议使用大尾端,而所有的intel和intel兼容的处理器都采用小尾端字节存储顺序。因此在网络上传输多字节数据的顺序被称为网络字节顺序。几个字节顺序转换函数:Htons:”workShort”,主机地址->网络字节顺序Htonl:”workLong”,主机地址->网络字节顺序(长型),此长型非C语言中的long,详见函数原型。ntohs:”NetworkToHostShort”,网络字节顺序->主机地址ntohl:”NetworkToHostlong”,网络字节顺序->主机地址(长型)