网络编程中接受连接请求的套接字的创建过程
1.调用socket函数创建套接字
2.调用bind函数分配IP地址和端口号
3.调用listen函数转为可接收请求状态
4.调用accept函数受理连接请求
IP地址:在网络环境中唯一标示一台主机
端口号:在主机中唯一标示一个进程
IP+port:在网络环境中唯一表示一个进程(socket)
套接字是文件的一种类型(伪文件)
socket是全双工通信
socket一定是成对出现
socket必须绑定IP+端口
一个文件描述符指向两个缓冲区,一个读、一个写
int socket(int domain,int type,int protocol);
函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族
IPV4一般用AF_INET
type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字,TCP用),SOCKET_DGRAM(数据包套接字,UDP用)
protocol用于指定某个协议的特定类型,即type类型中的某个类型。通常某协议中只有一种特定的类型,这样protocol
仅能设置为0,但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型
结构体
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in_addr
{
uint32_t s_addr;
};
sin_family 地址族协议
sin_port 端口号
sin_addr ip地址
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。
sin_addr存储IP地址,使用in_addr这个数据结构
现在sockaddr退化了(void *)的作用,传递一个地址给函数,至于这个函数是
sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型
inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换
int inet_pton(int af, const char *src, void *dst);
这个函数转换字符串到网络地址,第一个参数af是地址簇,第二个参数*src是来源地址,第三个参数* dst接收转换后的数据。
int socket(int domain,int type,int protocol);
成功:返回一个新创建的socket的文件描述符,失败:-1,并设置errno
htons()函数:htons是将整型变量从主机字节顺序转变成网络字节顺序,(将一个无符号短整型数值转换为网络字节序,即大端
模式(big-endian))
就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。
INADDR_ANY这个宏是数值类型
htonl()函数:将主机数转换成无符号长整型的网络字节顺序。(将主机的无符号长整形数转换成网络字节顺序。)
本函数将一个32位数从主机字节顺序转换成网络字节顺序。
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
成功:0 失败:-1,并设置errno
sockfd:socket文件描述符
addr:构造出IP地址加端口号
addrlen:sizeof(addr)长度
返回值:成功返回0,失败返回-1,设置errno
int listen(int sockfd,int backlog);
sockfd:文件描述符
backlog:排队建立3次握手队列和刚刚建立3次握手队列的链接数和
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
sockfd:
socket文件描述符
addr:
传出参数,返回链接客户端地址信息,含IP地址和端口号
addrlen:
传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址
结构体的大小
返回值:
成功返回一个新的socket文件描述符,用于和客户端通信,失败-1,并设置errno
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
sockfd:
socket文件描述符
addr:
传入参数,指定服务器端地址信息,含IP地址和端口号
addrlen:
传入参数,传入sizeof(addr)大小
返回值
成功:0,失败:-1,并设置errno
bind(),accept(),connect()函数的第二个参数都需要强转,前面加(struct sockaddr *)
atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数