先来简单回忆一下上一次说到的TCP协议
TCP协议:面向连接、可靠的、流式服务
UDP协议:无连接的、不可靠的、数据报服务
会发现UDP协议和TCP协议恰好相反,但是既然有了可靠的TCP协议,为什么又要另外一个不可靠的UDP协议呢???
因为UDP有它自己的优点UDP协议是无连接方式的协议,它的效率高,速度快,占资源少,使用起来会更快捷,方便,如一般的聊天软件。
下面编写一个编程流程(以TCP协议为例)
服务器端(server):socket bind listen accept recv/send close
(1)(创建socket)socket(int domain,int type,int protocol)
domain参数表示告诉系统使用哪个底层协议族。我们现在一般还使用IP v4,所以
domain:: 协议簇 AF_INET
type:: 选择协议 SOCK_STREAM(tcp) SOCK_DGRAM(udp)
protocol:: 0
示例:
int sockfd = socket(AF_INET,SOCK_TREAM,0)
(2) (命名socket)bind (int sockfd,const struct sockaddr* my_addr,socklen_t addrlen)
sockfd:相当于文件描述符
my_addr:将my_addr所指的socket地址分配给未命名的sockfd文件描述符。指定 IP 地址和端口号,里面有三部分,地 址簇、端口号、IP地址。
addrlen:socket地址的长度。
struct sockaddr_in
{
sa_family_t sin_family; // 地址簇 AF_INET
u_int16_t sin_port;
// 端口号 。网络字节序(大端模式) PC 机(小端模式) 函数htons(主机字节序转化为网络字节序)
struct in_addr sin_addr; // IP 地址
}
struct in_addr
{
u_int32_t s_addr; // IP 地址最终的表示 这里需要用 inet_addr来转化ip地址。
}
(3)(监听socket)listen(int sockfd ,int backlog)
backlog:指所有处于半连接状态和完全连接状态的socket的上限。典型值为5。
(4)(接收连接)accept(int sockfd,struct sockaddr *addr, socklen_t *addreln)
返回值: 获取到的和客户端连接的文件描述符
addr:; 记录客户端的 IP 地址和端口号
addrlen:该ocket地址的长度。
(5)recv/send
recv:(int sockfd ,void *buf, size_t len,int flags)
Send(int sockfd ,const void *buf, size_t len,int flags)
(6)(关闭连接)close(int sockfd)
客户端(client):socket connect recv/send close
这里不同的就是connect发起连接函数
int connect(int sockfd, struct sockaddr* addr, int addrlen);
addr:: 要连接的服务器的 IP 地址和端口号。
下面是代码显示:
服务器端(ser)
客户端(cli)