Linux UDP Socket编程是一种用于在Linux操作系统中实现无连接数据传输的编程方法,UDP(User Datagram Protocol)是一种面向数据报的传输层协议,与TCP相比,它不提供可靠的数据传输服务,但具有较低的延迟和较高的传输效率,以下是关于Linux UDP Socket编程的详细解答:
Linux UDP Socket编程
一、网络字节序
定义:网络字节序是指在网络上传输数据时使用的字节顺序。
大端字节序:数据的低位保存在高地址,高位保存在低地址。
小端字节序:数据的低位保存在低地址,高位保存在高地址。
网络字节序转换:在发送数据之前,主机字节序需要转换为网络字节序;在接收数据之后,网络字节序需要转换为主机字节序。
二、TCP与UDP的区别
TCP:有连接、可靠传输、面向字节流。
UDP:无连接、不可靠传输、面向数据报。
三、UDP Socket编程流程
1. 创建套接字
int socket(int domain, int type, int protocol);
domain:指定协议族,如AF_INET(IPv4)。
type:指定套接字类型,如SOCK_DGRAM(UDP)。
protocol:通常为0,表示使用默认协议。
2. 绑定地址信息
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:套接字描述符。
addr:指向sockaddr结构体的指针,包含IP地址和端口号。
addrlen:地址结构的长度。
3. 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
sockfd:套接字描述符。
buf:发送缓冲区。
len:发送数据的长度。
flags:标志位,通常为0。
dest_addr:目的地址。
addrlen:目的地址的长度。
4. 接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
sockfd:套接字描述符。
buf:接收缓冲区。
len:期望接收的数据长度。
flags:标志位,通常为0。
src_addr:源地址。
addrlen:源地址的长度。
5. 关闭套接字
close(int fd);
四、UDP Socket代码实战
1. 服务端代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8888 #define MAXLINE 1024 int main() { int server_socket = socket(AF_INET, SOCK_DGRAM, 0); if (server_socket == -1) { perror("socket"); exit(EXIT_FAILURE); } struct sockaddr_in server_addr, client_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); close(server_socket); exit(EXIT_FAILURE); } char buffer[MAXLINE]; socklen_t client_addr_len = sizeof(client_addr); while (1) { int n = recvfrom(server_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &client_addr_len); if (n == -1) { perror("recvfrom"); close(server_socket); exit(EXIT_FAILURE); } buffer[n] = ' '; printf("Received from client: %s ", buffer); char message[] = "Hello, client!"; sendto(server_socket, message, strlen(message), 0, (struct sockaddr*)&client_addr, client_addr_len); } close(server_socket); return 0; }
2. 客户端代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8888 #define SERVER_IP "127.0.0.1" #define MAXLINE 1024 int main() { int client_socket = socket(AF_INET, SOCK_DGRAM, 0); if (client_socket == -1) { perror("socket"); exit(EXIT_FAILURE); } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); inet_pton(AF_INET, SERVER_IP, &(server_addr.sin_addr)); char message[] = "Hello, server!"; sendto(client_socket, message, strlen(message), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); char buffer[MAXLINE]; socklen_t server_addr_len = sizeof(server_addr); int n = recvfrom(client_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&server_addr, &server_addr_len); if (n == -1) { perror("recvfrom"); close(client_socket); exit(EXIT_FAILURE); } buffer[n] = ' '; printf("Received from server: %s ", buffer); close(client_socket); return 0; }
到此,以上就是小编对于linux udp socket编程的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/86014.html