UDP编程特点:c/s模型
不可靠 ; 无链接 ;数据报形式(效率高);
TCP编程特点:
面向链接; 可靠传输;(保证数据准确可靠); 面向字节流;
ssize_t recvfrom(int sockfd, socket的fd
void *buf, 保存数据的一块空间的地址
size_t len, 这块空间的大小
int flags, 0 默认的接收方式 --- 阻塞方式
struct sockaddr *src_addr, 用来保存发送方的地址信息
socklen_t *addrlen 表示发送方实际的地址信息大小
);
返回值:
成功 返回接收到的字节数
失败 -1
2、int bind(int sockfd, struct sockaddr *my_addr,
socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
的文件描述符文件与参数2 指定的接口地址关联,
用于从该接口接受数据。
如果该函数在客户端调用,则表示要将数据从
参数1所在的描述符中取出并从参数2所在的接口
设备上发送出去。
注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
my_addr 是物理接口的结构体指针。表示该接口的信息。
绑定地址:运行所在主机上的地址;服务器程序所在的程序;
基于TCP客户——服务器程序的套接字服务:
TCP建立连接:TCP的三次握手过程;
断开链接: TCP的四次回收;
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 */
};
关于三次握手:
三次握手的目的就是为了确保双方的连接正常
第一次握手:客户端向服务器发送;证明客户端的发送正常;
第二次握手:服务器接收到客户端的发送,并向客户端发送;证明服务器的接收、发送能力正常;
第三次握手:客户端向服务器发送,证明客户端的接收能力正常;
关于四次挥手:
- 首先客户端想要释放连接,先向服务器发送;
- 服务器收到客户端的发送后,确认客户端想要释放连接,
- 服务器向客户端发送自己也要释放连接的消息;
- 客户端接收到服务器要释放连接的消息,向服务器发送收到的消息;
完成四次挥手;