MST

星途 面试题库

面试题:C语言UDP通信中sendto函数的参数及使用

在Linux环境下使用C语言进行UDP通信时,sendto函数经常用于发送数据,请详细说明sendto函数的各个参数的含义,并给出一个简单的代码示例,展示如何正确使用sendto函数向指定的UDP地址发送数据。
13.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

sendto函数参数含义

  • int sockfd:套接字描述符,通过socket()函数创建,标识一个已打开的UDP套接字。
  • const void *buf:指向要发送数据缓冲区的指针,即要通过UDP发送的数据。
  • size_t len:要发送数据的长度,以字节为单位。
  • int flags:通常设置为0,用于指定一些额外的发送选项,如MSG_DONTROUTE等。
  • const struct sockaddr *dest_addr:指向目标地址结构体的指针,该结构体包含目标IP地址和端口号等信息,一般为sockaddr_in结构体类型转换而来。
  • socklen_t addrlen:目标地址结构体的长度,对于sockaddr_in结构体,通常为sizeof(struct sockaddr_in)

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr_in servaddr;
    char buffer[BUFFER_SIZE] = "Hello, UDP Server!";

    // 创建UDP套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    memset(buffer, 0, sizeof(buffer));

    // 填充服务器地址结构体
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);

    // 发送数据
    sendto(sockfd, (const char *)buffer, strlen(buffer),
           MSG_CONFIRM, (const struct sockaddr *) &servaddr, sizeof(servaddr));
    printf("Data sent to server: %s\n", buffer);

    close(sockfd);
    return 0;
}