如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Linux网络编程基础内容提要网络基础知识TCP/IP参考模型TCP/IP协议族IP地址和端口TCP/IPTCP/UDP字段含义(1)字段含义(2)字段含义(3)Socket编程从网络整体来看,socket是不同主机上应用程序之间的一个虚拟的接口,具有跨平台特性。从程序员角度来看,它是应用程序和网络设备的一个接口,特殊的I/O从操作系统看,它是一种资源。如同handle用来描述windows中的窗口等资源,socket用socketdescriptor来标识。什么是socket?先看文件操作的例子:通过open函数得到一个文件的文件描述符;然后对这个描述符进行读写socket字节流套接口(StreamSockets)面向连接的,位于TCP之上数据报套接口(DatagramSockets)无连接的,位于UDP之上原始套接口(RawSockets)直接发送和处理IP包:例如pingSocket用下面的结构体来描述一个IP地址socket.h结构中sa_family为套接口的协议族地址类型,例如对于通常的TCP/IP协议(IPv4),它的值是AF_INET;sa_data中存储着具体的协议地址,不同的协议族有不同的地址格式。sa_data的存储内容往往是包含地址和端口信息,而仅使用一个变量,所以使用起来不太方便。最后的那个元素是填充的空白信息,这样就保持整个结构与sockaddr结构的长度相同sockaddr只是一个抽象的概况形式,并不实用sockaddr_in更加结合了TCP/IP协议族的特点,易于使用,所以编程中常使用这个结构。但是:socket本身所封装的API都是支持sockaddr结构的,所以填充sockaddr_in结构需要强制转换成sockaddr结构,方可作为参数被socket的标准函数所使用。例如:intconnect(intsockfd,structsockaddr*servaddr,unsignedintaddrlen)字节顺序主机字节顺序(HostByteOrder)低位在前,高位在后(little-endian)基于Intel芯片的机器采取这种存储方式网络字节顺序(NetworkByteOrder)高位在前,低位在后(big-endian)Sockaddr_in的变量成员(端口和地址)都必须使用网络字节顺序例如端口34567的16进制表示是0x8707。如果定义变量unsignedshortsin_port=34567前面提到的几个函数对于IP地址的转换仍然不方便,因为首先得得到ip地址的数值表示,而我们习惯于用带点的字符串来表示,如“202.38.75.11”因此希望有函数能处理这样的请求:给一个字符串如“202.38.75.11”能返回相应的网络字节序的unsignedlong值给一个unsignedlong的值能返回一个字符串inet_atonintinet_aton(constchar*cp,structin_addr*inp);例如将“192.168.0.10”0xC0A8000Ainet_addrunsignedlonginet_addr(constchar*cp);功能同上,但不能处理广播地址inet_ntoachar*inet_ntoa(structin_addrin);例如将0xC0A8000A转化为“192.168.0.10”基本套接口函数(1)-socket()基本套接口函数(2)-connect()TCP通信-客户端例子基本套接口函数(3)-bind()基本套接口函数(4)-listen()基本套接口函数(5)-accept()基本套接口函数(6)基本套接口函数(7)-其它TCP通信-服务器例子if(listen(fd,5)<0){fprintf(stderr,”listenerror!\n");exit(1);}newfd=accept(fd,(structsockaddr*)&cli,&cli_len);if(newfd<0){fprintf(stderr,"accepterror\n");exit(1);}socket()UDP通信——服务器端例子structsockaddr_incli;charbuf[512];intcli_len=sizeof(cli);intnbytes;nbytes=recvfrom(fd,buf,sizeof(buf),0/*flags*/,(structsockaddr*)&cli,&cli_len);if(nbytes<0){fprintf(stderr,“recvfromerror\n”);exit(1);}U