前言
tcp编程的实现流程:
tcp编程相关函数
1、socket函数
功能:创建套接字并返回套接字描述符
头文件:
#include<sys/socket.h>
函数原型:
int socket(int family,int type,int protocol)
参数:
family:协议族
AF_INET:IPv4协议
AF_INET6:IPv6协议
type:套接字类型
SOCK_STREAM:流式套接字(tcp)
SOCK_DGRAM:数据报套接字(udp)
protocol:0
返回值:
非负套接字描述符
2、bind函数
功能:将套接字与IP地址和端口号绑定
头文件:
#include<sys/socket.h>
函数原型:
int bind(int sockfd,(struct sockaddr *)my_addr,int addrlen)
参数:
sockfd:套接字描述符
my_addr:绑定的地址
addrlen:地址长度
有关sockaddr和sockaddr_in结构体的知识——[转]socket编程——sockaddr_in结构体操作
3、listen函数
功能:设置监听模式和连接端口数量
头文件:
#include<sys/socket.h>
函数原型:
int listen(int sockfd,int backlog)
参数:
sockfd:套接字描述符
backlog:请求队列中允许的最大请求数
4、accept函数
功能:等待并接收客户端的请求
头文件:
#include<sys/socket.h>
函数原型:
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)
参数:
sockfd:套接字描述符
addr:用于保存客户端地址
addrlen:addr长度变量的地址
返回值:
建立好连接的套接字描述符
5、connect函数
功能:客户端发送连接请求
头文件:
#include<sys/socket.h>
函数原型:
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen)
参数:
sockfd:套接字描述符
addr:服务器端地址
addrlen:地址长度
6、send函数
功能:发送数据
头文件:
#include<sys/socket.h>
函数原型:
int send(int sockfd,const void *buf,int len,int flags)
参数:
sockfd:套接字描述符
buf:发送缓存区的地址
len:发送数据的长度
flags:一般为0
返回值:
实际发送的字节数
7、recv函数
功能:接收数据
头文件:
#include<sys/socket.h>
函数原型:
int recv(int sockfd,void *buf,int len,unsigned int flags)
参数:
sockfd:套接字描述符
buf:存放接收数据的缓存区的地址
len:接收数据的长度
flags:一般为0
返回值:
实际接收的字节数
8、close函数
功能:关闭套接字
头文件:
#include<sys/socket.h>
函数原型:
int close(int sockfd)
参数:
sockfd:套接字描述符
总结
tcp和udp的区别:
TCP面向连接 | UDP是无连接 的,即发送数据之前不需要建立连接 |
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达 | UDP尽最大努力交付,即不保证可靠交付 |
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制 | UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信 |
每一条TCP连接只能是点到点的 | UDP支持一对一,一对多,多对一和多对多的交互通信 |
TCP对系统资源要求较多 | UDP对系统资源要求较少 |