如何在Linux环境下进行UDP Socket编程?

Linux UDP Socket编程是一种用于在Linux操作系统中实现无连接数据传输的编程方法,UDP(User Datagram Protocol)是一种面向数据报的传输层协议,与TCP相比,它不提供可靠的数据传输服务,但具有较低的延迟和较高的传输效率,以下是关于Linux UDP Socket编程的详细解答:

如何在Linux环境下进行UDP Socket编程?插图1

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. 绑定地址信息

如何在Linux环境下进行UDP Socket编程?插图3

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:套接字描述符。

如何在Linux环境下进行UDP Socket编程?插图5

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

(0)
上一篇 2024年10月27日 23:15
下一篇 2024年10月27日 23:30

相关推荐