socket 网络编程一:socket 介绍及函数原语

马谦马谦马谦 C/C++评论365字数 2369阅读 7 分 53 秒阅读模式

socket 计算机中的一种网络传输机制,对 TCP 和 UDP 的封装,自动帮我们在底层完成各种协议操作,接收到数据包后返回到上层应用。

socket 分为客户端和服务端,它的工作模型为:

socket网络编程一:socket介绍及函数原语-图片1

一、 socket 网络地址

1.1 网络字节序

关于字节序的概念可以查看计算机中的字节序

一般来说,计算机是低字节序,网络传输是高字节序,两者之间并不统一。使用时需要通过以下函数进行转换:

记忆方式

h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数。

例如端口号是 16 位 (s),主机 (h) 转网络 (n) 字节序的函数为 htons

1.2 IP 地址转换函数

socket 地址

计算机中的 IP 地址是一个 32 位长整数,因为 ip 地址最多为 255.255.255.255,每个点位最多占 1 个字节=8 位,所以 IP 地址为 32 位整数。

我们用的地址是一个 sockaddr 类型,它包含了地址族,端口号和 IP 地址等信息。不过它是很早以前的地址结构了,为了适应需要,现在衍生出了 sockaddr_in 等地址类型如下图所示。

socket网络编程一:socket介绍及函数原语-图片2

但是为了向前兼容,现在 sockaddr 退化成了 (void *)的作用,传递一个地址给函数,至于这个函数是 sockaddr_in 还是 sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。类型的定义如下:

一般我们常用的是 sockaddr_in,简单用法为:

地址转换函数

早期 IPv4 地址转换函数:

在后期引入 IPv6 后的转换函数支持 IPv4 和 IPv6:

其中 af 是地址族,一般填写 AF_INET 表示以太网。

二、 socket 操作函数

2.1 socket

socket 函数用于创建一个 socket 对象,在 linux 环境中,socket 也是一个文件,因此该函数实际返回的是一个文件描述符。

参数说明

2.2 bind

bind 用于绑定地址到 socket 。

参数说明

绑定前要先设置好地址:

2.3 listen

listen 用于监听某个端口号:

参数说明

查看系统默认 backlog

典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的 accept() 返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未 accept 的客户端就处于连接等待状态,listen() 声明 sockfd 处于监听状态,并且最多允许有 backlog 个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

2.4 accept

服务端接受一个 socket 连接,此时的连接已经三次握手完成

参数说明

三次握手完成后,服务器调用 accept() 接受连接,如果服务器调用 accept() 时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。 addr 是一个传出参数,accept() 返回时传出客户端的地址和端口号。 addrlen 参数是一个传入传出参数 (value-resultargument),传入的是调用者提供的缓冲区 addr 的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度 (有可能没有占满调用者提供的缓冲区) 。如果给 addr 参数传 NULL,表示不关心客户端的地址。

2.5 connect

客户端连接服务端的函数,此时开始三次握手。

参数说明:

2.6 recv 和 recvfrom

recv 用于 TCP 协议读取数据:

recv 用于 udp 协议,参数含义类似。

由于 socket 也是一个文件描述符,因此也可以使用 read 来读取 socket 中的数据。

2.7 send 和 sendto

send 和 sendto 分别用于 tcp 和 udp 协议,参数含义和上面的 recv 类似,也可以使用 write 向 socket 中些数据。

三、一个简单的服务端和客户端案例

以下是一个示例 demo,客户端在连接上服务端后输入相应的字符串发送过去,然后服务端把所有字符转成大写返回。

运行结果

服务端通过./server 9988 启动,监听 9988 端口。客户端连接端口输入字符串测试:

服务端显示:

  最后更新:2018-11-15
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2018 年 3 月 9 日 11:32:13
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/socke-primitive.html
socket多路IO复用之select模型 C/C++

socket 多路 IO 复用之 select 模型

select 模型是 socket 中的一种多路 IO 复用模型之一,通过轮询的方式来完成多路访问控制。 一个很简单的例子来描述 select 模型: 幼儿园老师要照顾所有的小朋友,每天他都会轮流去问小朋友:「小朋...
TCP协议中的三次握手和四次挥手 TCP/IP

TCP 协议中的三次握手和四次挥手

一、三次握手 TCP 协议的三次握手和四次挥手分别表示了 TCP 连接的建立和释放过程,在整个 TCP 协议是一个很重要的内容,同时也是面试时的常见考点。 趁着找工作的劲,使用 socket+tcpdump 分析了...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证