linux系统编程-SOCKET通信基础编程(0)-UDP编程
linux系统编程-SOCKET通信基础编程(1)-UDP编程服务端程序
linux系统编程-SOCKET通信基础编程(2)-UDP编程客户端程序
1.UDP简介
UDP是一种基于IP协议,(1)无连接的,(2)不保证可靠(3)数据报传输协议。
无连接:通信双方在传输数据之前不需要建立连接。(也可以选择连接connect)
不保证可靠:不保证接收的数据包顺序与发送的数据包顺序一致,也不能够发送的内容与接收到的内容一致。
数据报:数据是分包的,有头有尾。发送一次接收方需要接收一次,这样UDP则就是有边界的数据包,而TCP数据则是连续的。发送一次,接收方需要接收一次。
2.UDP基本程序介绍
3.服务器端创建流程
3.1创建socket
int socket(int domain, int type, int protocol);
int sock_server = socket(AF_INET, SOCK_DGRAM, 0); //注意这里使用的是:SOCK_DGRAM (数据报套接字)
3.2填充IP地址
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;
3.3绑定IP地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(sock_server, (struct sockaddr *)&server_addr, sizeof(server_addr))
3.4开始接收客户端的消息
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)
3.5向客户端发送消息
sendto(sockfd, buf, len, flags, NULL, 0);
ret1 = sendto(server_sock, buf,strlen(buf), 0, (const struct sockaddr * )&client_addr, len);
3.6关闭scoket
scoekt()
4客户端创建流程
4.1创建socket
int socket(int domain, int type, int protocol);
int cli_sock = socket(AF_INET, SOCK_DGRAM, 0); //SOCK_DGRAM (数据报套接字)
4.2填充IP地址
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;
4.3绑定IP地址(可选:可以设置自己的端口号)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind(cli_sock, (struct sockaddr *)&cli_addr, sizeof(cli_addr)
4.4链接(可选)
(可选:UDP链接并不是TCP的那样会有三次握手,而是简单的建立关系,可以使用send和write函数)
可多次调用链接connect 而TCP只能链接一次。
4.5向服务端发送消息
sendto(sockfd, buf, len, flags, NULL, 0);
ret = sendto(cli_sock, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, socklen))
4.6向客户端发送消息
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);
4.7关闭socket
close();
附加设置地址复用
附加设置地址复用
int on = 1;
if(setsockopt(sock_server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
{
perror("setsockopt");
return -1;
}