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

Socket 网络编程

文章目录

  • Socket操作的常用系统调用
  • 基于TCP的Socket程序流程
  • Socket网络函数
    • socket函数
    • bind函数
    • listen函数
    • connect函数
    • accept函数
    • send函数和recv函数

Socket操作的常用系统调用

socket( )建立Socket端点,获得Socket描述符
bind( )Server绑定Socket地址(IP地址+端口号)
listen( )Server等待Client连接
connect( )Client连接到Server
accept( )Server获得连接请求的Client的Socket地址
send( ) / recv( )在已建立的连接上发送 / 接收数据(TCP方式)
sendto( ) / recvfrom( )无需连接,直接发送 / 接收数据(UDP方式)
close( )关闭 Socket(双向/单向)

基于TCP的Socket程序流程

在这里插入图片描述

利用Socket方式进行数据通信与传输,步骤如下:

  1. 创建服务端 socket,绑定建立连接的端口
  2. 服务端程序在一个端口调用 listen 及 accept 后,处于阻塞状态,等待客户机的连接
  3. 创建客户端 socket 对象
  4. 客户端指定主机名称或 IP 地址、连接端口号
  5. 客户机通过 connect 发起连接请求
  6. 建立连接
  7. 利用 send (sendto) 和 recv (recvfrom) 进行数据传输
  8. 关闭 socket

Socket网络函数

从上面的Socket程序流程图可以看见使用了很多函数,接下来详细讲解一下各个函数

socket函数

为了执行网络输入输出,一个进程必须做的第一件事就是调用 socket() 函数获得一个套接字描述符

socket() 函数原型为:

int socket(int family, int type, int protocol);
  • family:指定使用协议簇
    • AF_INET: IPV4协议
    • AF_INET6:IPV6协议
  • type:指定使用的套接字类型
    • SOCK_STREAM:字节流套接字
    • SOCK_DGRAM:数据报套接字
    • SOCK_RAW:原始套接字
  • protocol:0(原始套接字除外)

函数返回值:成功返回非负套接字描述符;失败返回 -1

bind函数

bind() 函数为套接字描述符分配一个本地 IP 地址和一个端口号,将 IP 地址和端口号与套接字描述符绑定在一起

bind() 函数原型为:

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
  • sockfd:套接字描述符
  • my_addr:指向本地 IP 地址结构的指针
  • addrlen:IP 地址的长度

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

listen函数

listen() 函数仅被 TCP 服务器调用,它的作用是将用 socket 创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求

listen() 函数原型为:

int listen(int sockfd, int backlog);
  • sockfd:socket 函数经绑定 bind 后的套接字描述符
  • backlog:设置可连接客户端的最大连接个数,默认值 20

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

connect函数

客户端用 socket 建立了套接口后,可以调用 connect() 函数为这个套接字指明远程服务器的地址,以进行连接

connect() 函数原型为:

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
  • sockfd:套接字描述符
  • serv_addr:指向服务器的 IP 地址结构的指针
  • addrlen:IP 地址的长度

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

accept函数

accept() 函数与 bind、listen 函数一样,是应用于 TCP 连接的服务端程序的函数

accept() 函数调用后,服务端程序一直会处于阻塞状态,等待来自客户端的连接请求

accept() 函数原型为:

int  accept(int sockfd, struct sockaddr *cli_addr, socklen_t *addrlen);
  • sockfd:socket 函数经 listen 后的套接字描述符
  • cli_addr:客户端套接字地址结构
  • addrlen:指向存有 addr 地址长度的整型数

函数返回值:若接收到客户端的连接请求,则返回非负套接字描述符;失败返回 -1

【注意】accept() 函数返回一个全新的套接字描述符

  • 原来的套接字描述符继续侦听指定的端口
  • 新的套接字则用于发送或接受数据

send函数和recv函数

send() 函数原型为:

int send(int sockfd, const void *msg, int len, int flags);
  • sockfd:套接字描述符
  • msg:发送的数据的指针
  • len:发送数据的长度
  • flags:0

recv() 函数原型为:

int recv(int sockfd, void *buf, int len, unsigned int flags);
  • sockfd:套接字描述符
  • buf:存放接收数据的缓冲区
  • len:接收数据的长度
  • flags:0

函数返回值:发送的字节数 / 接受数据的字节数

http://www.dtcms.com/a/499595.html

相关文章:

  • 哪里可以做网站网站兼容性怎么解决
  • 网站备案流程实名认证哪个平台做网站好
  • 最版网站建设案例中国建设银行开户行查询
  • 衡水网站制作多少钱世界著名产品设计作品
  • 我们如何更好地相处和协作?
  • Vlanif的作用
  • 62.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--自训练ML模型
  • 北京住房城乡建设网站秦皇岛手机网站制作公司
  • 【SpringBoot从初学者到专家的成长18】SpringBoot中的数据持久化:JPA与Hibernate的结合
  • Ubuntu服务器已下载Nginx安装包的安装指南
  • 高可用Prometheus问题集锦
  • wap建站模板物流网站怎么开
  • 【Leetcode hot 100】763.划分字母区间
  • Agent向量存储中的记忆衰退与记忆过载解决方案
  • php网站跟随导航扁平化配色方案网站
  • 降噪算法的效果分析
  • FreeSWITCH RTP 自动调整花费时间太久
  • 怎么在一个网站做编辑一流的镇江网站优化
  • 常用电子元器件学习总结
  • TCP/IP协议相关知识点
  • 网站点播视频如何做帮助做APP的网站公司
  • 直圆锥(Right Circular Cone)
  • vue适合做门户网站吗企业官网下载
  • 熬夜肌救星:EGT+AKG+SOD科学修护
  • 上海住房城乡建设网站成都创软科技的口碑
  • 建设银行网站建设情况网络维护公司需要什么资质
  • 解决stm32cubeide工程复制后更改路径导致无法识别问题
  • GitHub 热榜项目 - 日榜(2025-10-18)
  • 【问题】Mac 的 Finder 中没有桌面选项如何处理?(访达 -> 设置 -> 边栏 -> 勾选桌面)
  • string类介绍