Matthew Note

UDP 多种使用方法

创建UDP客户端的典型过程为:首先调用socket()函数,接下来定义发送和接收数据的远程主机和端口,然后用sendto()和recvfrom()来发送接收数据,如果使用sendto()和recvfrom()函数则可以在发送数据时再指定目标地址及端口。

除此之外UDP数据报的发送也可以使用write()、send()函数。如果使用write()或send(),则必须事先以UDP套接字为参数调用connect()函数。

与TCP不同的是,在UDP套接字上收发的数据是作为单独的单元接收或发送的,而不是作为字节流。每次调用write()、send()、或sendto()函数都会在线路上产生一个UDP数据报。接收到的UDP数据报的读取也是一个单独的操作,如果读取报文时提供的缓冲区长度不够,则会返回一个出错代码。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sockaddr_in serv_addr;
// create udp socket
m_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (m_sock < 0)
{
return false;
}
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(m_serv_addr);
serv_addr.sin_port = htons(m_serv_port);
if (connect(m_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
{
fprintf(stderr,"connect fail.\n");
return false;
}
char buf[]="abcdefg";
send(m_sock,(void*)buf,sizeof(buf),0);

或者我们可以用sendto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sockaddr_in serv_addr;
// create udp socket
m_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (m_sock < 0)
{
return false;
}
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(m_serv_addr);
serv_addr.sin_port = htons(m_serv_port);
char buf[]="abcdefg";
sendto(m_sock,(void*)buf,sizeof(buf),0,(struct sockaddr *)&serv_addr,sizeof(serv_addr));