linux系统编程-SOCKET通信基础编程(0)-UDP编程

 

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;
}

猜你喜欢

转载自blog.csdn.net/yuupengsun/article/details/106459667