其实是纸巾|

悲伤鳄鱼吃面包

园龄:1年9个月粉丝:0关注:0

2023-08-08 20:26阅读: 29评论: 0推荐: 0

Socket编程

Socket

套接字。类似于一个结构体,内部封装了ip地址、协议、端口(唯一标识进程)

阻塞与非阻塞

套接字默认阻塞,即当我们使用某些函数要对缓冲区进行I/O操作时,若缓冲区无法操作,那么会卡在这里直到缓冲区中有空间操作。
对非阻塞套接字,如果行就执行操作并返回成功值,不行就返回错误值。
我们也可以通过以下函数设置非阻塞套接字

int setnonblocking(int fd)
{
int old_option = fcntl(fd, F_GETFL); //获取文件状态
int new_option = old_option | O_NONBLOCK; //添加非阻塞特性
fcntl(fd, F_SETFL, new_option); //设置文件状态
return old_option;
}

监听并接受客户端请求

创建socket

int socket(int domain, int type, int protocol);
  • domain:指定协议族,如IPv4、IPv6等等
  • type:指定套接字类型,如用于 TCP or UDP
  • protocol:指定套接字协议,如TCP、UDP

这个函数是创建了一个socket,但要使用这个socket还需要他跟本地ip以及端口绑定,我们还需要创建一个socket地址(不是指针的那种地址),地址内部就包含了ip以及端口号

创建socket地址

struct sockaddr_in listenfd;
memset(&listenfd, 0, sizeof(listenfd)); //固定操作
listenfd.sin_family = AF_INET; //指定协议族
listenfd.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
listenfd.sin_port = htons(DEFAULT_PORT); //设置的端口 DEFAULT_PORT由我们赋值

socket地址也可叫协议地址

将创建的socket与socket地址绑定

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:就是我们创建的socket
  • addr:创建的socket地址(协议地址)
  • addrlen:创建的socket地址的长度

让socket开始监听

int listen(int sockfd, int backlog);
  • sockfd:绑定完的完整socket
  • backlog:监听队列中最多排几个请求

这一步也叫创建监听队列

接受客户端连接请求

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd:我们创建的监听socket,服务器端socket
  • addr :客户端的协议地址
  • addrlen: 客户端的协议地址长度
  • 返回值:为这个连接分配的文件描述符

accept函数执行成功会自动给addr以及addrlen赋值

posted @   悲伤鳄鱼吃面包  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起