当前位置: 首页 > news >正文

【计算机网络】Socket编程接口

一、sockaddr结构体

套接字种类很多,例如:网络套接字、原始套接字、unix域间套接字

三种套接字就要设计三套接口吗?不用,利用struct sockaddr复用同一套接口

如果是网络套接字编程:使用socket相关函数时,传参传递的是 struct sockaddr_in

如果是unix域间套接字编程:使用socket相关函数时,传参传递的是 struct sockaddr_un

二、Socket常见接口

1. socket()

int socket(int domain, int type, int protocol); // 创建socket文件描述符

① int domain: 协议版本 -> 网络通信(AF_INET)

② int type: SOCK_DGRAM(数据报服务) -> UDP;SOCK_STREAM(流式服务) -> TCP

③ int protocol : 默认填0即可

④ 返回值:返回一个文件描述符,利用这个fd进行读写

2. bind()

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); // 将sockfd和套接字绑定

① int sockfd:要绑定的socket文件描述符

② struct sockaddr *my_addr:要绑定的套接字

③ socklen_t addrlen:struct sockaddr *my_addr的长度 -> sizeof(my_addr)

④ 返回值:绑定成功返回0;绑定失败返回-1

3. recvfrom()

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); // 接收数据(接收方读数据)适用于UDP

① int sockfd:接收方的socket文件描述符

② void *buf:读到/接收到 的数据放到buf缓冲区里

③ size_t len:buf的长度 -> sizeof(buf)

④ int flags:填0 -> 阻塞式

⑤ struct sockaddr *src_addr:谁发的(发送方的ip/port)

⑥ socklen_t *addrlen:struct sockaddr *src_addr的长度 -> sizeof(src_addr)

⑦ 返回值:读到的数据的长度

4. sendto()

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); // 发送数据(发送方发数据)适用于UDP

① int sockfd:发送方的socket文件描述符

② const void *buf:要发出去的 的数据放到buf缓冲区里

③ size_t len:buf的长度 -> sizeof(buf)

④ int flags:填0 -> 阻塞式

⑤ const struct sockaddr *dest_addr:发给谁(接收方的ip/port)

⑥ socklen_t addrlen:const struct sockaddr *dest_addr的长度 -> sizeof(dest_addr)

⑦ 返回值:发送的数据的长度

5. listen()

int listen(int s, int backlog); // 设置socket为监听状态 TCP

设置后的sockfd 不是用来进行数据通信的,而是用来监听链接到来,获取新链接的

① int s:要设置的socket文件描述符

② int backlog:同时请求连接的最大个数(还未建立连接)

③ 返回值:成功返回0;失败返回-1

6. accept()

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 获取连接 TCP

① int sockfd:socket()创建sockfd -> listen()设置成listen状态 -> 传入listensock

② struct sockaddr *addr:谁来建立的连接,就是谁的套接字

③ socklen_t *addrlen:struct sockaddr *addr的长度 -> sizeof(addr)

④ 返回值:返回一个文件描述符,用于和client进行通信的fd

7. connect()

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // 建立连接 TCP

① int sockfd:建立连接的sockfd

② const struct sockaddr *addr:对方的套接字

③ socklen_t addrlen:const struct sockaddr *addr的长度 -> sizeof(addr)

④ 返回值:成功返回0;失败返回-1


总结:用一幅图表示个函数之间的关系

三、基本转换函数

1. 与port有关的转换

2.与ip有关的转换

IP地址的表示有两种:点分十进制表示和整数表示

"192.168.1.100" -> 点分十进制风格的IP -> 字符串形式,可读性好

uint32_t ip; -> 整数风格的IP -> 网络通信使用

(1)inet_addr

in_addr_t inet_addr(const char *cp); // 点分十进制表示 -> 整数表示

函数内部完成两个工作:①点分十进制IP -> uint32_t    ②htonl()

(2)inet_ntoa

char *inet_ntoa(struct in_addr in); // 整数表示 -> 点分十进制表示

函数内部完成两个工作:①ntohl()    ②uint32_t -> 点分十进制IP


http://www.mrgr.cn/news/75135.html

相关文章:

  • pytest-allure框架简单封装----测试报告
  • 【微信小程序】let和const-综合实训
  • FPGA EDA软件的位流验证
  • microPython搭建webServer--(一)使用microdot库实现基本页面显示
  • Elasticsearch:向量数据库基础设施类别的兴衰
  • android刷机
  • 【MinIO】Python 运用 MinIO 实现简易文件系统
  • WLAN消失或者已连接但是访问不了互联网
  • SpringSecurity+jwt+captcha登录认证授权总结
  • 程序员的数学之进制与零
  • Flink1.19编译并Standalone模式本地运行
  • 保姆级教程,免费短链平台
  • cache缺失和关联度
  • sqlmap使用教程
  • Python 异常处理试卷
  • 【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)
  • 大语言模型LLM综述
  • GRU(门控循环单元)详解
  • Siggraph Asia 2024 | Adobe发布MagicClay:可通过文字引导去对3D模型中的特定部分进行雕刻
  • 【今天的乐子】你真懂代码吗?挑战这10个笑话,程序员专属梗了解一下
  • C++《继承》
  • 企业运营的智能化升级:AI助理与SOP的融合之道
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • 线程的状态有哪些?它是如何工作的?
  • SMA-BP基于黏菌算法优化BP神经网络时间序列预测
  • 解析安卓镜像包和提取DTB文件的操作日志