首先看一下上一篇三次握手四次挥手文章中提到的原理图。
其中的read对应的就是recv函数,write对应的就是send函数。
步入正题,函数的使用:
1.TCP客户端
socket : 创建套接字
函数原型:int socket(int family,int type,int protocol);
功能:创建一个用于网络通信的socket套接字(描述符)
参数:
@family : 协议族(AF_INET、AF_INET6、PF_PACKET)
@type : 套接字类(SOCK_STREAM、SOCK_DGRAM、SOCK_RAW)
@protocol: 协议类别(0、IPPROTO_TCP、IPPROTO_UDP)(一般传0,自动匹配)
返回值:套接字
特点:创建套接字时,系统不会分配端口。
创建的套接字默认属性是主动的,即主动发起服务的请求;
当作为服务器时,往往需要修改为被动的。(listen)
头文件:
#include <sys/socket.h>
connect : 连接“服务器”
函数原型:
int connect(int sockfd,const struct sockaddr *addr,socklen_t len);
功能:主动跟服务器建立链接
参数:
@sockfd : socket 套接字
@addr : 连接的服务器地址结构
@len : 地址结构体长度
返回值:
成功 : 0 失败 : 其他
注意:
connect 建立连接之后不会产生新的套接字;
连接成功后才可以开始传输 TCP 数据。
头文件:
#include <sys/socket.h>
send : 发送数据到“服务器”
函数原型:
ssize_t send(int sockfd, const void* buf,size_t nbytes, int flags);
功能:用于发送数据
参数:
@sockfd : 已建立连接的套接字
@buf : 发送数据的地址
@nbytes : 发送缓数据的大小(以字节为单位)
@flags : 套接字标志(常为0)
返回值:成功发送的字节数
注意:
不能用发送 0 长度的数据包,这是与sendto的差别。
头文件:
#include <sys/socket.h>
recv : 接受“服务器”的响应
函数原型:
ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
功能:用于接收网络数据
参数:
@sockfd : 套接字
@buf : 接收网络数据的缓冲区的地址
@nbytes