今日主要学习网络知识
udp
recvfrom
ssize_t recvfrom(int sockfd, //socket的fd
void *buf, //保存数据的一块空间的地址
size_t len, //这块空间的大小
int flags, // 0 默认的接收方式 --- 阻塞方式
struct sockaddr *src_addr, //用来保存发送方的地址信息
socklen_t *addrlen //表示发送方实际的地址信息大小
);
返回值:
成功 返回接收到的字节数
失败 -1
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]; 地址信息
};
//本地 socket
//网络 ipv4
// ipv6
转换成网络地址结构如下:
struct sockaddr_in ///网络地址结构
{
u_short sin_family; //地址族
u_short sin_port; //地址端口
struct in_addr sin_addr; //地址IP //"192.168.1.123"
char sin_zero[8]; //占位
};
//in_addr_t === unsigned int
struct in_addr
{
in_addr_t s_addr;
}
tcp
tcp 客户端:
//1.建立连接
socket //买了一部手机
bind //可选 //插上sim卡
connect //拨打电话
....
//2.通信过程
read
write
close
tcp服务器:
//1.建立连接
socket //买了一部手机
bind //插上sim卡
listen //监听 客户端的连接请求
accept //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据
.....
//2.通信过程
read
write
close
connect
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//拨打电话 --- 知道对方的号码
1、int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0
失败 -1;
struct sockaddr *addr //通用地址结构类型,并没有实际去用,实际用到都是具体地址结构类型
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
listen
sockfd
: 这是一个整数类型的套接字描述符,通常是通过socket()
函数创建的。backlog
: 这是一个整数,表示在服务器接受连接之前,等待连接的队列的最大长度。也就是说,它决定了在拒绝连接之前,操作系统为这个套接字所允许的最大未决连接数。
返回值
- 成功时,返回0。
- 失败时,返回-1,并且可以通过
errno
获取错误码。
功能
listen
函数的主要功能是使得套接字处于被动监听状态,这样它就可以接受来自客户端的连接请求。在调用listen
之后,服务器会等待客户端的连接请求,可以通过accept
函数接收这些请求。
accept
参数
sockfd
: 这是一个socket描述符,通常是通过socket()
和bind()
以及listen()
函数创建和设置的监听套接字。addr
: 这是一个指向sockaddr
结构体的指针,用于存储客户端的地址信息。可以传入NULL
,但在这种情况下,客户端的地址信息将不会被填充。addrlen
: 这是一个指向socklen_t
类型变量的指针,表示地址结构的大小,函数调用后会更新为实际填充的大小。
返回值
- 成功时,返回一个新的套接字描述符,该描述符用于与连接的客户端进行通信。
- 失败时,返回-1,并且可以通过
errno
获取错误码。
功能
accept
函数的主要功能是接受一个连接请求并返回一个新套接字,这个新套接字用于与连接的客户端进行数据传输。调用accept
后,服务器可以通过新的套接字与客户端进行双向通信。