套接字创建的过程

套接字创建的过程

头文件

#include<sys/socket.h>

创建套接字

int socket(int domain, int type, int protocol);

domain:表示协议族,常用的有AF_INET(IPv4)、AF_INET6(IPv6)等。

type:表示套接字的类型,常用的有SOCK_STREAM(流式套接字,基于TCP协议实现)和SOCK_DGRAM(数据报套接字,基于UDP协议实现)。

SOCK_STREAM(面向连接的套接字)
在这里插入图片描述

该种传递方式下具有缓冲区,收到数据后在缓冲区未满之前可能不会立马读取数据。如果数据的读取慢于输入,缓冲区将被填满,但并不会发生数据的丢失。因为传输端会阻塞等待。如果发生上传错误还会提供重传服务

更适合对数据可靠性和完整性有较高要求的应用场景

SOCK_DGRAM(面向消息的套接字)

在这里插入图片描述

protocol:表示具体的协议,一般设置为0,系统会根据domain和type自动选择合适的协议。

绑定套接字与IP地址

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:表示要进行绑定操作的套接字文件描述符。

addr:表示要绑定的本地地址,它是一个指向sockaddr结构体的指针,不同的协议族对应的结构体类型不同。例如,对于IPv4协议族,结构体类型为sockaddr_in。

sockaddr结构体

struct sockaddr {
    sa_family_t sa_family;      //地址族(地址类型)
    char        sa_data[14];    //存放地址数据的缓冲区
};

addrlen:表示addr结构体的长度。

设置为被动状态

int listen(int sockfd, int backlog);

sockfd:表示要进行操作的套接字文件描述符。

backlog:表示内核中用于存放已完成三次握手的连接请求队列的最大长度。一般情况下,该值设置为5~10之间即可;如果该值被设置得过大,则可能会影响系统性能。

同意申请

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

使用该函数同意连接的请求

sockfd:表示要进行操作的套接字文件描述符。

addr:用于存放客户端的地址信息。它是一个指向sockaddr结构体的指针,不同的协议族对应的结构体类型不同。例如,对于IPv4协议族,结构体类型为sockaddr_in。

addrlen:表示addr结构体的长度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值