socket:底层网络通信对象,又称"套接字",向网络发出请求或向网络做出回应.
Http协议是基于socket,Http协议的底层使用的就是socket.网络通信其实就是socket通信,数据在两个socket之间通过IO传输数据
socket介于应用层和网络层,它帮我们做了什么呢.我们在应用层给请求一个格式,把这个格式交给socket,之后的找主机,找端口都是socket.就像我们邮东西,我们只填好地址就可以,剩下的全部交给邮局去做,而这个邮局就可以看做是socket.
socket是纯的C语言,是跨平台的.
socket的通信过程
因为socket是C语言的,在开发之前要导入三个头文件
import <sys/socket.h>
import <netinet/in.h>
import <arpa/inet.h>
1.创建socket(变量)
socket(int, int,int)
函数原型:int socket(int domain, int type, int protocol);
变量:domain:协议域,又称协议族(family)。常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、AF_ROUTE等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:指定Socket类型。常用的socket类型有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对于面向连接的TCP服务应用。数据报式Socket(SOCK_DGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用。
protocol:指定协议。常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
注意:1.type和protocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。
2.连接到服务器(建立连接)
connect(int, const struct sockaddr *, socklen_t)
变量:
1.套接字描述
2.指向数据结构sockaddr的指针,其中包括目的端口和IP地址
3.结构体的长度
返回值:连接失败,返回-1.
第二个参数详解:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
htons:将主机字节顺序转为网络字节顺序,不同的CPU有不同的字节顺序类型,这些字节顺序类型指的是整数在内存中保存的顺序,即主机字节顺序。将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处。
eg:12345->0x3039(16进制)->0x930(字节翻转)--> 14640
3.发送数据给服务器
send(int, const void *, size_t, int)
参数:
1.socket
2.要发送的数据,通用指针
3.数据发送的字节长度
4.调用执行方式,默认0即可
const char *string = "who you are";
ssize_t sent = send(client, string, strlen(string), 0);
4.从服务器接收数据
recv(int, void *, size_t, int)
原型:int recv( In SOCKET s, Out char *buf, In int len, In int flags);
参数:
1.socket
2.用于接收数据的缓冲区
3.缓冲区的长度
4.指定调用方式,默认0
char *buffer[1024];
ssize_t reciveLen = recv(client, buffer, sizeof(buffer), 0);
返回值:成功接收的字节长度
5.关闭连接
close(int);
养成良好的习惯,打开连接,就要关闭连接.