一.recvfrom
recvfrom函数是一个系统调用,用于从套接字接收数据。该函数通常与无连接的数据报服务(如 UDP)一起使用,但也可以与其他类型的套接字使用。与简单的 recv() 函数不同,recvfrom() 可以返回数据来源的地址信息。
函数原型为:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
参数解释:
sockfd:一个已打开的套接字的描述符。
buf:一个指针,指向用于存放接收到的数据的缓冲区。
len:缓冲区的大小(以字节为单位)。
flags:控制接收行为的标志。通常可以设置为0,但以下是一些可用的标志:
MSG_WAITALL:尝试接收全部请求的数据。函数可能会阻塞,直到收到所有数据。
MSG_PEEK:查看即将接收的数据,但不从套接字缓冲区中删除它【1】。
其他一些标志还可以影响函数的行为,但在大多数常规应用中很少使用。
src_addr:一个指针,指向一个 sockaddr 结构,用于保存发送数据的源地址。
addrlen:一个值-结果参数。开始时,它应该设置为 src_addr 缓冲区的大小。当 recvfrom() 返回时,该值会被修改为实际地址的长度(以字节为单位)。
返回值:
在成功的情况下,recvfrom() 返回接收到的字节数。
如果没有数据可读或套接字已经关闭,那么返回值为0。
出错时,返回 -1,并设置全局变量 errno 以指示错误类型。
二.bind
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
2、int bind(int sockfd, struct sockaddr *my_addr,
socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
的文件描述符文件与参数2 指定的接口地址关联,
用于从该接口接受数据。
如果该函数在客户端调用,则表示要将数据从
参数1所在的描述符中取出并从参数2所在的接口
设备上发送出去。
注意:
如果是客户端,则该函数可以省略,由默认
接口发送数据。
参数:
sockfd 之前通过socket函数创建的文件描述符,套接字id
my_addr 是物理接口的结构体指针。表示该接口的信息。
struct sockaddr 通用地址结构 --- ip + 端口
{
u_short sa_family; 地址族
char sa_data[14]; 地址信息
};
三.tcp
基于tcp:
tcp 客户端:
//1.建立连接
socket //买了一部手机
bind //可选 //插上sim卡
connect //拨打电话
....
//2.通信过程
read
write
close
tcp服务器:
//1.建立连接
socket //买了一部手机
bind //插上sim卡
listen //监听 客户端的连接请求
accept //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据
.....
//2.通信过程
read
write
close
四。tcp如何建立链接
tcp三次握手
客户端 服务器
-----我要和你建立连接--->
<----好的,可以建立连接--
-----好 ---------------->
断开连接
tcp 四次回收
客户端 服务器
-----我要和你断开连接--->
<----好的,可以断开------
<----我也要断开----------
-----好 ---------------->
tcp 客户端:
//1.建立连接
socket //买了一部手机
bind //可选 //插上sim卡
connect //拨打电话
五.connect
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//拨打电话 --- 知道对方的号码
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0
失败 -1;
六.listen
int listen(int sockfd, int backlog)
功能:反应监听那个套接字并且建立成功之后返回一个新的套接字
参数:当前的套接字同时可以监听的个数
返回值 正确 返回建立的新的套接字 错误 返回 -1
listen原理: