【C++】Socket网络编程形象概述
网络7层:
物理层、数据链路层、网络层(ip协议)、传输层(Tcp协议)、会话层、表示层、应用层(http协议)。
socket就是对(IP和TCP协议的封装和应用,传输层的协议 ),方便程序员使用协议栈,利用socket建立网络连接的步骤:**服务器监听、客户端请求、连接确认。
I、windows下socket为套接字 API,为使用者提供一个与协议无关的通用接口,一个套接字为一个通信端,是指向传输发起者的句柄。
主流三种套接字: 流套接字,数据报套接字,原始套接字。
流套接字:双向、有序、可靠、无重复、无记录边界的数据流服务。主用于TCP协议。
数据报套接字:支持双向,不保证可靠、有序、无重复,主要用于UDP协议。
原始套接字:允许对底层传输机制加以控制,定制化强、风险高。
流套接字编程示意图:
那么如何使用socket呢?
1、发送数据
i 、创建一个原始套接字,并设置ip头选项,
SOCKET sock = socket (AF_INET, SOCK_RAW, IPPROTO_IP);
或者
SOCKET sock = WSAsoccket (AF_INET, SOCK_RAW, IPPROTO_IP
NULL,0 , WSA_FLAG_OVERLAPPED);
ii、构造ip头信息,实现TCP/IP/ICMP/IGMP信息头即内容填充。
iii、发送数据。
sendto(sock , (char*)&ipbuf , sizeof(ipbuf) , 0 ,(sockaddr*)&addr_in,sizeof(addr_in));
iv、关闭套接字。
2、接收数据
i、创建一个原始套接字,并设置ip头选项,
SOCKET sock = socket (AF_INET, SOCK_RAW, IPPROTO_IP);
如果想接收所有IP报文,需设置SIO_RCVALL
ii、接收数据
recv(sock , RecvBuf, BUFFER_SIZE, 0) //接受任意数据包。
或者
recvfrom(sock , RecvBuf, BUFFER_SIZE, 0,(sockaddr*)&addr_in,sizeof(addr_in));
iii、 解析接收数据
iv、关闭套接字
closesocket(sock);
注意使用windows socket在程序中不仅需要连接Ws2_32.lib,还需要初始化,完成后需要调用,WSACleanup。