Linux下send函数和recv函数

news/2024/10/3 19:35:22/

1. 基本介绍

send 函数

send 函数用于向一个已连接的套接字发送数据。它的典型使用场景是在TCP通信中,客户端和服务器之间交换数据。

函数声明:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数解释:

  • sockfd:套接字描述符,表示已连接的套接字。
  • buf:指向要发送的数据缓冲区。
  • len:要发送的数据字节数。
  • flags:控制数据发送行为的标志,可以为 0 或者使用一些选项(例如 MSG_DONTWAIT,非阻塞发送)。

返回值:

  • 成功时,返回发送的字节数。
  • 失败时,返回 -1,并设置相应的 errno 错误码。
recv 函数

recv 函数用于从已连接的套接字接收数据。通常和send函数配合使用。

函数声明:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数解释:

  • sockfd:套接字描述符,表示已连接的套接字。
  • buf:指向接收数据的缓冲区。
  • len:缓冲区的大小,最大接收字节数。
  • flags:控制接收行为的标志,如 MSG_WAITALL(等待接收完整数据),MSG_PEEK(查看缓冲区中的数据,但不将其从缓冲区移除)。

返回值:

  • 成功时,返回接收到的字节数。
  • 如果对端正常关闭连接,返回 0。
  • 失败时,返回 -1,并设置 errno

2. 发送和接收的典型使用场景

TCP 通信中的 sendrecv
  • 在客户端-服务器模型中,通常会先由客户端发起连接,然后通过send函数发送请求数据,服务器通过recv接收请求并处理。
  • 服务器响应数据后,再使用send函数将结果返回给客户端,客户端通过recv获取返回结果。
UDP 通信中的 sendrecv

UDP是无连接的,因此可以使用sendtorecvfrom来指定目标地址和端口,进行数据的发送和接收。

3. flags 参数的常见选项

sendrecvflags 参数可以控制不同的发送和接收行为,常用的选项包括:

  • MSG_DONTWAIT:非阻塞模式,若无法立即发送或接收数据,sendrecv 会立刻返回而不是阻塞。
  • MSG_PEEK:查看缓冲区数据但不移除数据,常用于探测网络数据的到来。
  • MSG_OOB:发送或接收带外数据(TCP紧急数据)。
  • MSG_WAITALL:等待接收到指定大小的数据后才返回。

4. 常见错误及处理

  • EAGAINEWOULDBLOCK:在非阻塞模式下,数据无法立即发送或接收,需要等待套接字可用。
  • EINTR:操作被信号中断,通常可以重试。
  • ECONNRESET:连接被对端重置,通常意味着对端异常关闭了连接。

5. 示例代码

客户端使用示例
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int sockfd;struct sockaddr_in server;char message[1000], server_reply[2000];// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {printf("创建套接字失败\n");}server.sin_addr.s_addr = inet_addr("192.168.1.1");server.sin_family = AF_INET;server.sin_port = htons(8888);// 连接到远程服务器if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0) {perror("连接失败");return 1;}// 发送数据strcpy(message, "Hello Server");if (send(sockfd, message, strlen(message), 0) < 0) {printf("发送失败\n");return 1;}// 接收服务器响应if (recv(sockfd, server_reply, 2000, 0) < 0) {printf("接收失败\n");}printf("服务器响应:%s\n", server_reply);close(sockfd);return 0;
}

服务器使用示例

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>int main() {int socket_desc, client_sock, c;struct sockaddr_in server, client;char client_message[2000];// 创建套接字socket_desc = socket(AF_INET, SOCK_STREAM, 0);if (socket_desc == -1) {printf("无法创建套接字\n");}// 配置服务器地址结构server.sin_family = AF_INET;server.sin_addr.s_addr = INADDR_ANY;server.sin_port = htons(8888);// 绑定if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {perror("绑定失败");return 1;}// 监听listen(socket_desc, 3);// 接受客户端连接c = sizeof(struct sockaddr_in);client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c);if (client_sock < 0) {perror("接受连接失败");return 1;}// 接收客户端消息if (recv(client_sock, client_message, 2000, 0) > 0) {printf("客户端消息:%s\n", client_message);// 发送响应send(client_sock, "Hello Client", strlen("Hello Client"), 0);}close(client_sock);close(socket_desc);return 0;
}

6. 总结

sendrecv 是套接字通信中的基础操作,理解它们的使用方式和参数对于编写可靠的网络程序至关重要。


http://www.ppmy.cn/news/1533597.html

相关文章

【Java SE 题库】移除元素(暴力解法)--力扣

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素。元素的顺…

网络协议一般分为几类?如何划分

网络协议是计算机网络中用于通信的规则和标准&#xff0c;确保不同设备之间能够有效地传输数据。网络协议可以根据不同的标准和功能进行分类&#xff0c;主要分为以下几类&#xff1a; 一、按功能划分 应用层协议 应用层协议负责特定应用程序之间的通信&#xff0c;它们定义了…

(22)activeMQ部署

activeMQ集群部署: 前言:从ActiveMQ 5.9开始,ActiveMQ的集群实现方式取消了传统的Master-Slave方式, 增加了基于ZooKeeper + LevelDB的Master-Slave实现方式,其他两种方式目录共享和数据库共享依然存在。 25.213.39.177 25.213.39.97 25.213.39.86 主机 集群端…

通过python-api使用openai的gpt

目前&#xff0c;OpenAI 提供的 GPT 模型可以通过其提供的 API 进行访问。以下是如何通过 Python 使用 OpenAI GPT API 的详细步骤&#xff1a; 1. 安装 OpenAI Python 库 首先&#xff0c;你需要安装 OpenAI 的 Python 库。可以通过 pip 安装&#xff1a; pip install open…

开发微信小程序 案例01-本地生活首页页面

1---home.wxml 区域 &#xff08;页面整体的标签&#xff09; <!-- 轮播图区域 --> <swiper indicator-dots circular autoplay> <swiper-item wx:for"{{SwiperArr}}" wx:key"id"> <image src"{{item.image}}"></ima…

HTML【知识改变命运】03font 字体标签

题目&#xff1a;在页面上显示"北京"两个字&#xff0c;字体为微软雅黑&#xff0c;颜色为红色&#xff0c;大小为40xp&#xff1b; font标签可以修饰字体的大小&#xff0c;颜色&#xff0c;和字体 属性&#xff1a;color颜色&#xff0c;face字体&#xff0c;size大…

Python中流行的开源OCR项目

以下是一些Python中流行的开源OCR项目&#xff1a; PaddleOCR&#xff1a;由百度开发的OCR工具库&#xff0c;支持多种语言的文字识别&#xff0c;包括中英文&#xff0c;同时支持倾斜、竖排等多种方向的文字识别。它提供了超轻量级的PP-OCRv3模型&#xff0c;适合在资源受限的…

Spring Boot 3整合FFmpeg进行图片和MP3转换为视频

Spring Boot 3整合FFmpeg进行图片和MP3转换为视频的示例代码如下&#xff1a; 添加FFmpeg依赖到pom.xml&#xff1a; <dependency><groupId>com.github.kokorin.jaffree</groupId><artifactId>jaffree</artifactId><version>0.1.2</v…