Linux C++ TCP read函数
时间: 2024-10-28 21:13:08 浏览: 32
在Linux系统中,使用C++编写TCP客户端程序时,通常会用到`<netinet/in.h>`和 `<arpa/inet.h>`库中的函数来处理网络通信,包括读取数据。当你想从连接的TCP套接字中读取数据时,可以使用`recv()`或`read()`函数。
`recv()`函数是更底层的选择,它接收指定大小的数据,并返回实际接收到的字节数。语法大致如下:
```cpp
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
```
参数说明:
- `sockfd`: 连接的套接字描述符。
- `buf`: 存放接收到数据的目标缓冲区地址。
- `len`: 指定要接收的最大字节数。
- `flags`: 可选标志,如`MSG_DONTWAIT`表示设置非阻塞模式。
而`read()`函数则是标准输入、输出和错误流的基础函数,也可以用于网络套接字,语法类似:
```cpp
ssize_t read(int fd, void *buf, size_t count);
```
`fd`参数替换为套接字描述符,其他参数含义相同。
注意,在使用这两个函数时,都需要处理可能出现的错误情况,比如`EAGAIN`(资源暂时不可用)、`EINTR`(被信号中断)等。同时,如果`recv()`或`read()`成功返回0,那可能意味着对方已经关闭了连接,需要特别关注。
相关问题
C++中TCP协议connect函数代码实例
在C++中,当你想要通过TCP连接到服务器时,通常会使用`std::socket`和相关的库,如`boost.asio`或者标准库中的`netdb.h`, `netinet/in.h`, 和 `arpa/inet.h`。以下是一个基本的例子,展示如何使用`boost.asio`库的`ip::tcp`模块来进行TCP连接:
```cpp
#include <boost/asio.hpp>
#include <iostream>
namespace ip = boost::asio::ip;
using tcp = boost::asio::ip::tcp;
int main() {
try {
// 创建一个IO服务对象
boost::asio::io_context io_context;
// 创建一个TCP socket
tcp::resolver resolver(io_context);
tcp::resolver::query query("example.com", "80"); // 服务器地址和端口
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
// 连接到第一个可用的IP地址
tcp::socket socket(io_context);
boost::asio::connect(socket, endpoint_iterator);
std::cout << "Connected to server.\n";
// 发送数据...
boost::array<char, 128> message = {'H', 'e', 'l', 'l', 'o', '\r', '\n'};
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
// 接收数据...
char buffer[128];
boost::asio::read(socket, boost::asio::dynamic_buffer(buffer), ignored_error);
std::cout << "Received: " << std::string(buffer) << "\n";
} catch (std::exception& e) {
std::cerr << "Failed: " << e.what() << '\n';
}
return 0;
}
```
在这个例子中,我们首先创建了一个IO服务,然后解析服务器地址并连接到它。接着发送一条消息并接收响应。注意,这个代码需要`boost.asio`库支持。
c++ tcp server 例子
好的,以下是一个简单的C语言TCP服务器的例子:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
char buf[BUF_SIZE];
int read_cnt;
struct sockaddr_in serv_adr, clnt_adr;
socklen_t clnt_adr_sz;
if(argc != 2) {
printf("Usage: %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_adr.sin_port = htons(atoi(argv[1]));
if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1)
perror("bind() error");
if(listen(serv_sock, 5) == -1)
perror("listen() error");
clnt_adr_sz = sizeof(clnt_adr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
while(1) {
read_cnt = read(clnt_sock, buf, BUF_SIZE);
if(read_cnt == 0)
break;
write(clnt_sock, buf, read_cnt);
}
close(clnt_sock);
close(serv_sock);
return 0;
}
```
此例子中,我们使用了 socket 函数创建套接字,然后使用 bind 函数将套接字绑定到特定 IP 和端口上,接着我们使用 listen 函数来监听客户端连接。当有客户端请求连接时,我们使用 accept 函数接受客户端连接请求,并创建一个新的套接字进行通信。在通信过程中,我们使用 read 函数从套接字中读取数据,并使用 write 函数向套接字中写入数据。最后,我们关闭套接字并结束程序。
希望这个例子能够帮到你。
阅读全文