一、socket创建套接字
socket是用来创建网络通信或本地通信的套接字,跟文件有关:告诉系统,PCB(进程控制块)控制的数据应该向哪个套接字写入、或读取;这个套接字是在TCP/IP协议下运行的
#include <sys/types.h> //头文件
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
三个参数:domain、type、protocol
1.domain:域名,领域,定义域(中文解释)
使用:表示程序员想要表示,通信在哪个域中进行?,是本地域通信?还是网络域通信?
本地域通信 [ AF_UNIX, AF_LOCAL (Local communication) ]
网络域通信 [ AF_INET (IPv4 Internet protocols)]
2.type:类型(中文解释)
使用:程序员想要表示:通信传输类型,是面向数据报还是面向字节流?
面向数据报:SOCK_DGRAM
面向字节流:SOCK_STREAM
3.protocol:协议(中文解释)
使用:前两个参数,一个在网络上通信(IPV4协议),一个规定了通信传输类型(TCP协议)两个组成了TCP/IP协议(传输层/网络层协议);一般来说,前两个订好了,第三个参数设置为0;
二、bind绑定
IP地址:确定网络中的唯一主机;
port端口号:确定主机中的唯一程序;
bind:将用户设置的ip和port,在内核中和我们的进程强关联
#include <sys/types.h> //头文件
#include <sys/socket.h>#include <netinet/in.h> //后两个是结构体的头文件
#include <arpa/inet.h>
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
参数:
1.sockfd:套接字
使用:socket的返回值->套接字
2.struct sockaddr结构体
这个结构体对象是要和网络进行绑定的;
2.1struct sockaddr结构体是一个通用型结构体
下图是他们在内存中的存储方式(具体的请看Linux头文件定义表)
struct sockaddr :通用结构体类型
struct sockaddr_in:网络通信使用此结构体:遵守IP协议
struct sockaddr_un:本地通信使用此结构体
sockaddr结构:
sockaddr_in结构:
in_addr结构:IP地址
16位地址类型:描述本地通信还是网络通信的结构体;这个结构体对象是用来网络通信还是本地通信;
16位端口号:未来可能会把端口号发送给对方主机:所以要进行大端处理:函数htons();
32位IP地址:将点分十进制换成4字节进制,并进行大端处理;函数inet_addr()
2.2大小端转化函数
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
2.3socklen_t addrlen
使用:结构体的长度;
3.总结
此函数的三个参数,sockfd套接字,告诉了系统向哪里写数据,并对此进行操作(并遵守TCP/IP协议);struct sockaddr定义了自己的IP地址和端口号;确定了网络上的唯一的锚点;完成了先描述的概念;两者绑定;