C `sendto` 与 `write`

c++

1个回答

写回答

听宴

2025-07-06 02:55

+ 关注

AI
AI

C语言中的sendto和write函数都是用来发送数据的,但是它们在一些方面有所不同。本文将介绍这两个函数的区别,并且通过一个简单的案例代码来演示它们的用法。

sendto函数

sendto函数用于在网络编程中发送数据,它通常用于UDP协议。该函数的原型如下:

c

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

这个函数接受六个参数,其中最重要的是第一个参数sockfd,它是一个已经建立好的套接字文件描述符,用于标识一个网络连接。第二个参数buf是一个指向要发送数据的缓冲区的指针,第三个参数len是要发送数据的字节数。

sendto函数还有两个可选参数flags和dest_addr,分别用于设置发送标志和指定目标地址。最后一个参数addrlen表示目标地址结构体的长度。

sendto函数的返回值是成功发送的字节数,如果返回-1,则表示发送失败。

write函数

write函数用于向文件描述符写入数据,它通常用于在本地文件系统中进行文件操作。该函数的原型如下:

c

ssize_t write(int fd, const void *buf, size_t count);

这个函数接受三个参数,其中第一个参数fd是一个已经打开的文件描述符,用于标识一个文件。第二个参数buf是一个指向要写入数据的缓冲区的指针,第三个参数count是要写入数据的字节数。

write函数的返回值是成功写入的字节数,如果返回-1,则表示写入失败。

区别与用法比较

虽然sendto和write函数都可以用来发送数据,但它们在使用上有一些区别。

1. 适用场景不同:sendto函数主要用于网络编程中,特别是在使用UDP协议时。而write函数则主要用于本地文件系统中进行文件操作。

2. 参数不同:sendto函数需要传入目标地址和长度等参数,而write函数只需要传入文件描述符和数据长度。

3. 错误处理不同:sendto函数在发送失败时,返回-1,并且可以通过errno全局变量获取具体的错误代码。而write函数在写入失败时,也返回-1,但是不能通过errno获取错误代码。

案例代码

下面通过一个简单的案例代码来演示sendto和write函数的用法。

c

#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

int mAIn() {

// 创建套接字

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

// 定义目标地址结构体

struct sockaddr_in dest_addr;

dest_addr.sin_family = AF_INET;

dest_addr.sin_port = htons(1234);

dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

// 发送数据

char *message = "Hello, World!";

ssize_t send_bytes = sendto(sockfd, message, strlen(message), 0,

(struct sockaddr *)&dest_addr, sizeof(dest_addr));

// 写入数据

ssize_t write_bytes = write(STDOUT_FILENO, message, strlen(message));

// 关闭套接字

close(sockfd);

return 0;

}

以上代码首先创建了一个套接字,然后定义了一个目标地址结构体,并将要发送的数据存储在一个字符串中。接下来,使用sendto函数将数据发送到目标地址,并使用write函数将数据写入标准输出。最后关闭套接字并返回。

通过这个案例代码,我们可以清楚地看到sendto函数和write函数的使用方式和效果。需要注意的是,在实际使用中,我们需要根据具体的需求选择合适的函数来发送数据。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号