Linux C开发中,详细说明文件描述符中的send , read等操作,生成send文件描述和read文件描述符的代码样例
时间: 2024-11-25 09:14:03 浏览: 6
详解Linux下的文件标述符和文件指针
在Linux C开发中,文件描述符(File Descriptor,简称FD)是操作系统用于标识进程对某个输入/输出资源的访问,比如标准输入、标准输出、管道、套接字等。`send()` 和 `read()` 是两个标准库函数,分别用于从套接字或其他类型的文件描述符发送数据和接收数据。
`send()` 函数的基本原型是这样的:
```c
ssize_t send(int fd, const void *buf, size_t len, int flags);
```
其中:
- `fd`: 要使用的文件描述符
- `buf`: 需要发送的数据指针
- `len`: 待发送数据的长度
- `flags`: 可选标志,如MSG_NOSIGNAL(防止发送信号)
`read()` 函数的原型如下:
```c
ssize_t read(int fd, void *buf, size_t count);
```
这里:
- `fd`: 文件描述符
- `buf`: 接收数据的目标缓冲区地址
- `count`: 指定要读取的字节数
以下是简单的示例代码,展示了如何使用 `send()` 发送数据到套接字,并使用 `read()` 从套接字接收数据:
```c
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
// 创建套接字
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
perror("Socket creation failed");
return 1;
}
// 绑定并监听
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(8080); // 端口号
if (bind(server_sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
perror("Binding failed");
close(server_sock);
return 1;
}
listen(server_sock, 5);
// 创建客户端连接
int client_sock = accept(server_sock, NULL, NULL);
if (client_sock == -1) {
perror("Accepting connection failed");
close(server_sock);
return 1;
}
char message[] = "Hello from Server!"; // 发送的数据
ssize_t sent = send(client_sock, message, strlen(message), 0);
if (sent <= 0) {
perror("Sending data failed");
close(client_sock);
close(server_sock);
return 1;
}
char buffer[1024];
ssize_t received = read(client_sock, buffer, sizeof(buffer));
buffer[received] = '\0'; // 添加空字符终止字符串
printf("Received: %s\n", buffer);
close(client_sock);
close(server_sock);
return 0;
}
```
在这个例子中,首先创建了一个TCP服务器,然后接受客户端连接,发送消息给客户端,最后接收客户端的回复。
阅读全文