文档介绍:通信之socket通信该通信是基于互联网TCP/IP协议的通信。 OSI每层完成的功能: 物理层:实现网络相邻结点的信号的按位传输; 数据链路层:实现网络相邻结点的信号的帧传输;(mac地址) 网络层:实现网络不相邻结点的信号的帧传输;(IP地址) 传输层:实现网络不相邻结点的不同进程的帧传输;(端口号) 应用层:基于传输提供的服务完成网络应用 我们编写的socket应用程序是基于传输层提供的服务来进行网路通信的,传输层的两种协议:TCP:可靠的通信,保证数据包无差错、按序交付给应用层主要依靠传输前建立链接、通信过程中回发确认包来保证可靠通信的。类似于打电话;UDP:不可靠的通信通信前不需要链接、没有确认包类似于发电子邮件;socket编程相关函数:inet_aton()功能:将strptr所指的字符串转换成32位的网络字节序二进制值。#include<arpa/>_aton(constchar*strptr,structin_addr*addrptr); typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;}; 其中,strptr指向要转换点分十进制ip地址,如“”addrptr指向转换后的结果注意:structin_addr不需要你定义了!!!系统头文件已经定义!!小任务:编写程序实现把一个点分十进制的IP地址(可尝试通过命令行参数输入)专换成字节序列逐个字节打印出来!其余点分十进制和二进制IP地址的转换函数请自行编写程序实验;端口:我们自定程序的端口应该大于1023!字节序列:网络字节序列:高字节先发送,也就是说大端格式;小任务:自行设计实验验证你的pc是用的大端格式还是小端格式(课后做)网络字节序列转换自行实验基于TCP的SOCKET编程步骤:服务器端:创建套接字#include<sys/>/*SeeNOTES*/#include<sys/>intsocket(intdomain,inttype,intprotocol);参数说明:domain:对于IPV4,type:选择套接字类型,当我们选择TCP时为SOCK_STREAM;选择UDP则为SOCK_DGRAMprotocol:一般为0例如:intsock_fd;sock_fd=socket(,SOCK_STREAM,0);绑定作为服务器的一端必须通过绑定公开其IP地址和端口号#include<sys/>/*SeeNOTES*/#include<sys/>intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);参数说明:sockfd:待绑定的套接字描述符;addr:待绑定的地址结构指针;addrlen:地址结构长度其中,structsockaddr{sa_family_tsa_family;charsa_data[14];}一般情况下我们不会直接使用structsockaddr类型,而是使用与其等效的另外一个地址结构structsockaddr_in//见你们纸质版讲义的92页{}注意:当我们在实际使用过程中,更多的是使用structsockaddr_in,而不直接使用structsockaddr。intret; structsockaddr_inmyaddr; bzero(myaddr,sizeof(structsockaddr_in));=;=htons(8888);=inet_addr(“”);ret=bind(sock_fd,(structsockaddr*)&myaddr,sizeof(structsockaddr_in));if(ret<0){ perror(“Failedtobind:”); return–1;}侦听:套接字被listen后的功能只能用来发现外来连接请求了!!!#include<sys/>/*SeeNOTES*/#include<sys/>intlisten(intsockfd,intbacklog);通过侦听,该套接字将处于侦听状态,在该状态可以发现是否有连接请求进来参数说明:sockfd:要侦听的套接字描述符;backlog:处于等待状态的请求有多少。举例:intret; ret=listen(sock_fd,10);(4)接收连接请求#include<sys/>/*SeeNOTES*/#include<sys/>ept(intsoc