一、recvfrom函数
recvfrom:用于从套接字接收数据。该函数通常与无连接的数据报服务(如 UDP)一起使用,
recvfrom() 可以返回数据来源的地址信息。
参数说明:
sockfd:套接字文件描述符,通常由 socket 函数创建。
buf:指向存放接收到数据的缓冲区的指针。
len:缓冲区的大小(字节数)。
flags:接收数据的标志,通常设置为 0。
src_addr:指向 sockaddr 结构的指针,用于存放发送者的地址信息。如果不需要获取地址,可以设置为 NULL。
addrlen:指向 socklen_t 类型的变量的指针,初始值为 src_addr 所指结构的大小。函数调用后,这个变量会被更新为实际填充的地址长度。(inet_ntoa)
返回值:
成功时,返回接收到的字节数。
失败时,返回 -1,并设置 errno 以指示错误原因。
客户端发送给服务器,服务器接收返回客户端程序实例:
二、bind函数:
用于将一个套接字与一个本地地址(包括IP地址和端口号)绑定。
sockfd:套接字文件描述符。
addr:指向 sockaddr 结构体的指针,指定要绑定的本地地址。
addrlen:addr 结构体的长度。
返回值:
成功:返回 0。
失败:返回 -1,并设置 errno 以指示错误类型。
bind函数就是让套接字文件在通信时使用固定的IP和端口号(针对服务器来说)
调用socket函数创建的套接字仅仅执行了通信等协议,但是并没有指定通信时所需的ip地址和端口号。
ip 是对方设备的唯一标识
端口号 区分同一台计算机上的不同的网络通信进程
如果不调用bind函数指定ip和端口,则会自己指定一个ip和端口,此时违背了TCP通信的可靠性和面向连接的特点
如果说bind函数在服务器端调用,则表示将参数1相关文件与参数2指定的接口地址关联,用于从该接口接收数据。
bind函数在客户端调用,表示将数据从参数1所在的文件描述符中取出,然后从参数2所在的接口设备上发出去。(该函数可以在客户端省略,由默认接口发送数据)
三、TCP
1、tcp客户端:
建立连接:socket——bind——connect
通信过程:read-write-close
tcp服务器:
建立连接:socket——bind——listen——accept
listen :监听 客户端的连接请求 | accept:接听 完成之后可以收发数据
通信过程:read——write——close
2、tcp建立连接
三次握手
客户端—(请求)—服务器
服务器—(回复请求)—客户端
客户端—(回复服务器的请求)—服务器
四次回收
客户端—(请求断开)—服务器
服务器—(回复请求)—客户端
服务器—(准备断开)—客户端
客户端—(回复请求)—服务器
四、connect函数
connect函数的功能:就是完成面向连接的协议的连接过程,它是主要连接的。
面向连接的协议,在建立连接的时候总会有一方先发送数据,那么谁调用了connect谁就是先发送数据的一方。如此理解connect三个参数是容易了,我必需指定数据发送的地址,同时也必需指定数据从哪里发送,这正好是connect的前两个参数,而第三个参数是为第二个参数服务的。
sockfd:从哪发送,socket的一个接口发送
addr:发送到哪,服务端的地址,connect是主动连接的一方,要存在一个被动连接的一方需要调用listen以接受connect的连接请求,被动连接的一方就是服务器。
addrlen:结构体的长度。
五、listen和accept
listen:用于将一个套接字设置为监听状态,等待客户端的连接请求
参数:sockfd:要监听的套接字描述符
backlog:服务器套接字可以排队等待的连接请求数目,队列已满就被拒绝。
accept:当客户端的连接请求到达后,accept函数会创建一个新的套接字,并返回一个新的套接字描述符,该描述符与客户端的套接字建立连接。
参数:sockfd:监听套接字,用来接收客户端的连接请求
*addr:存储客户端的地址信息
*addrlen:一个指向socklen_t 类型的指针,表address 缓冲区的长度