UDP是面向非连接服务的,但UDP中也可以使用connect函数
1)。连接的建立
程序使用connect函数实现UDP的连接套接字,用法秘TCP相同,但实现效果不一样。UDP中的connect不会启动三次握手,而仅仅是在UDP套接字中记住目的地址和端口,如果以后这个套接字上的数据发送没有指定端口和目的地址,则使用connect中设置的目的地址和端口,如果指定的目的地址的端口,则仍用指定信息来填写UDP头部;
2)。send和recv函数
#include<sys/types.h>
#include<sys/socket.h>
int send(int sockfd, void * msg, int msglen, int flags);
int recv(int sockfd, void * buf, int buflen, int flags);
函数使用和sendto、recvfrom一样,只是不用指定目的地址和端口;
说明:
对于连接套接字我们也可以用sendto来发送数据报组非缺省的目的地址,但是通过recvfrom只能接收来自指定目的地址的数据报,因为来自其它地址的数据报在UDP层被过滤掉了;
3)。连接和重设和取消
struct sockaddr_in serv_addr1, serv_addr2;
int udpfd;
/*设置地址操作*/
connect(udpfd, (struct socdaddr *)&serv_addr1, sizeof(serv_addr1));
…发送数据操作
connect(udpfd, (struct socdaddr *)&serv_addr2, sizeof(serv_addr2));
4)。数据报发送后的几种可能及错误信息
a)。数据报在网络中由于字节发生错误而丢失,OR路由器缓冲区满丢失,这种情部发送端不会收到任何错误信息。
b)。数据报由于主机不可达而丢失。这种情况如果经过了路由器,则路由器发回ICMP报文,通知发送端数据报不可达;如果此时发送正在执行系统调用,则系统调用将以ENETUNREACH 或 EHOSTUNREACH错误返回;
C)。数据报到达目的主机,但目的主机指定端口上没有进程在接收数据,此时UDP将丢弃这个数据报,将返回ICMP错误报文;
d)。数据到达目的主机,但目的主机缓冲区满,则没有任何返回结果;
e)。发送成功,且接收成功;