C语言send函数:在套接字连接上发送数据364


在C语言中,`send()` 函数用于通过套接字连接发送数据。该函数是套接字编程中最重要的函数之一,因为它允许程序在网络上与其他设备通信。

函数声明

`send()` 函数的声明如下:```c
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
```

其中:* `sockfd` 是套接字描述符,标识要发送数据的套接字。
* `buf` 是指向要发送数据的内存缓冲区的指针。
* `len` 是要发送的数据的长度,以字节为单位。
* `flags` 是指定发送行为的标志的按位 OR 值。

返回值

`send()` 函数返回已发送的字节数。如果发送失败,则返回 -1,同时将 `errno` 设置为以下错误代码之一:* `EAGAIN` 或 `EWOULDBLOCK`:由于套接字处于非阻塞模式,发送操作无法立即完成。
* `EINVAL`:无效参数。
* `ENOTCONN`:套接字未连接。
* `EPIPE`:套接字已被关闭或对端已重置连接。
* `ECONNRESET`:对端已关闭连接。
* `EHOSTUNREACH`:目标主机不可达。

参数

buf

`buf` 参数是一个指向要发送数据的内存缓冲区的指针。该缓冲区必须包含要发送的完整数据,包括任何必要的标头或元数据。

len

`len` 参数指定要发送的数据长度,以字节为单位。`send()` 函数将发送缓冲区中前 `len` 个字节的数据。如果 `len` 设置为 0,则不会发送任何数据。

flags

`flags` 参数指定发送行为的标志的按位 OR 值。最常用的标志包括:* `MSG_NOSIGNAL`:防止 `SIGPIPE` 信号在发送操作失败时被发送到进程。
* `MSG_DONTWAIT`:使发送操作成为非阻塞的。这意味着函数将立即返回,即使套接字缓冲区已满,无法发送所有数据。

示例

以下示例演示如何使用 `send()` 函数通过套接字发送数据:```c
#include
#include
#include
int main() {
int sockfd;
struct sockaddr_in servaddr;
// 创建一个套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8080);
// 连接到服务器
if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
perror("connect");
close(sockfd);
return -1;
}
// 发送数据
char data[] = "Hello, world!";
ssize_t sent_bytes = send(sockfd, data, sizeof(data), 0);
if (sent_bytes == -1) {
perror("send");
close(sockfd);
return -1;
}
// 关闭套接字
close(sockfd);
return 0;
}
```

在这个示例中,我们创建一个套接字,连接到服务器并发送 "Hello, world!" 消息。如果发送成功,则 `sent_bytes` 变量将保存已发送的字节数。

2024-12-04


上一篇:弱函数:C 语言中的扩展特性

下一篇:如何在 C 语言中输出六位整数