UDP是一种基于IP协议,(1)无连接的,(2)不保证可靠(3)数据报传输协议。
无连接:通信双方在传输数据之前不需要建立连接。(也可以选择连接connect)
不保证可靠:不保证接收的数据包顺序与发送的数据包顺序一致,也不能够发送的内容与接收到的内容一致。
数据报:数据是分包的,有头有尾。发送一次接收方需要接收一次,这样UDP则就是有边界的数据包,而TCP数据则是连续的。发送一次,接收方需要接收一次。
int socket(int domain, int type, int protocol);
int sock_server = socket(AF_INET, SOCK_DGRAM, 0); //注意这里使用的是:SOCK_DGRAM (数据报套接字)
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sock_server, (struct sockaddr *)&server_addr, sizeof(server_addr))
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ret = recvfrom(server_sock, buf, BUFLEN-1, 0, (struct sockaddr*)&client_addr, &len)
sendto(sockfd, buf, len, flags, NULL, 0);
ret1 = sendto(server_sock, buf,strlen(buf), 0, (const struct sockaddr * )&client_addr, len);
scoekt()
int socket(int domain, int type, int protocol);
int cli_sock = socket(AF_INET, SOCK_DGRAM, 0); //SOCK_DGRAM (数据报套接字)
struct sockaddr_in cli_addr;
bzero(&cli_addr, sizeof(cli_addr));
cli_addr.sin_family = AF_INET;
cli_addr.sin_port = htons(CLIENT_PORT);
cli_addr.sin_addr.s_addr = INADDR_ANY;
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(cli_sock, (struct sockaddr *)&cli_addr, sizeof(cli_addr)
(可选:UDP链接并不是TCP的那样会有三次握手,而是简单的建立关系,可以使用send和write函数)
可多次调用链接connect 而TCP只能链接一次。
sendto(sockfd, buf, len, flags, NULL, 0);
ret = sendto(cli_sock, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, socklen))
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ret = recvfrom(cli_sock, buf, BUFLEN, 0, (struct sockaddr *)&server_addr, &socklen);
close();
附加设置地址复用
int on = 1;
if(setsockopt(sock_server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
{
perror("setsockopt");
return -1;
}