recv(经socket接收数据)

recv(经socket接收数据)
相关函数
recvfrom,recvmsg,send,sendto,socket
表头文件
#include<sys/types.h>
#include<sys/socket.h>
定义函数
int recv(int s,void *buf,int len,unsigned int flags);
函数说明
recv()用来接收远端主机经指定的socket传来的数据,并把数据存到由参数buf 指向的内存空间,参数len为可接收数据的最大长度。
参数
flags一般设0。其他数值定义如下:
MSG_OOB 接收以out-of-band 送出的数据。
MSG_PEEK 返回来的数据并不会在系统内删除,如果再调用recv()会返回相同的数据内容。
MSG_WAITALL强迫接收到len大小的数据后才能返回,除非有错误或信号产生。
MSG_NOSIGNAL此操作不愿被SIGPIPE信号中断返回值成功则返回接收到的字符数,失败返回-1,错误原因存于errno中。
错误代码
EBADF 参数s非合法的socket处理代码
EFAULT 参数中有一指针指向无法存取的内存空间
ENOTSOCK 参数s为一文件描述词,非socket。
EINTR 被信号所中断
EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断
ENOBUFS 系统的缓冲内存不足。
ENOMEM 核心内存不足
EINVAL 传给系统调用的参数不正确。
 
### 如何在C++中使用`std::string`接收通过`socket`通信`recv`函数接收到的数据 在C++中,通常会使用字符数组来存储由`recv`函数接收到的数据。然而,在现代C++编程实践中,推荐使用`std::string`作为字符串容器,因为它提供了更灵活的操作接口和更好的内存管理能力。 以下是基于`recv`函数并结合`std::string`的一个简单示例: ```cpp #include <iostream> #include <cstring> // memset #include <unistd.h> // close() #include <sys/socket.h> // socket, recv #include <arpa/inet.h> // inet_addr int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serverAddr; memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080); serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr)); const size_t bufferSize = 1024; char tempBuffer[bufferSize]; std::string receivedData; while (true) { ssize_t bytesRead = recv(sockfd, tempBuffer, bufferSize - 1, 0); if (bytesRead <= 0) { // Connection closed or error occurred. break; } tempBuffer[bytesRead] = '\0'; receivedData += tempBuffer; // Append the new data to the string. if (receivedData.find("\n") != std::string::npos) { // Check for end-of-message marker. break; } } std::cout << "Received Data: " << receivedData << std::endl; close(sockfd); return 0; } ``` #### 解析 - **临时缓冲区**:由于`recv`函数只能操作原始字节数组,因此创建了一个固定大小的临时缓冲区 `tempBuffer` 来保存每次接收到的数据[^2]。 - **拼接数据**:将每次从`recv`返回的内容追加到`std::string`对象 `receivedData` 中,从而逐步累积整个消息[^4]。 - **终止条件**:为了判断何时停止读取,可以通过检测特定的消息结束标志(如换行符`\n`或其他约定好的分隔符)。如果未设置明确的协议,则可能需要依赖于已知的消息长度或关闭连接的通知[^3]。 此方法适用于大多数简单的应用场景;但在高并发环境下或者当面对大数据流传输时,还需要考虑更多因素比如性能优化、异常处理机制等[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值