在C/C++中,从TCP套接字读取的正确方法是使用recv()
函数。recv()
函数是一个异步操作,它从套接字中读取数据,并将数据存储在提供的缓冲区中。以下是使用recv()
函数的基本步骤:
listen()
函数将套接字设置为监听状态。accept()
函数接受来自客户端的连接请求。recv()
函数从套接字中读取数据。以下是一个简单的示例代码:
#include<iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_socket;
int client_socket;
socklen_t client_length;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
char buffer[1024];
int result;
// 创建套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
// 设置套接字选项
int enable = 1;
setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int));
// 设置服务器地址和端口
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(8080);
// 绑定套接字到地址和端口
bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address));
// 设置套接字为监听状态
listen(server_socket, 5);
// 接受客户端连接请求
client_length = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_length);
// 从套接字中读取数据
result = recv(client_socket, buffer, 1024, 0);
// 打印接收到的数据
std::cout << "Received data: "<< buffer<< std::endl;
// 关闭套接字
close(client_socket);
close(server_socket);
return 0;
}
在这个示例中,我们创建了一个TCP套接字,并将其绑定到地址INADDR_ANY
(任意地址)和端口8080
上。然后,我们将套接字设置为监听状态,并接受来自客户端的连接请求。最后,我们使用recv()
函数从套接字中读取数据,并将其打印到控制台上。
需要注意的是,recv()
函数返回的是实际读取到的字节数,如果返回值为0,则表示连接已经关闭。如果返回值为-1,则表示出现了错误,可以通过errno
变量来获取错误信息。
领取专属 10元无门槛券
手把手带您无忧上云