如何在c++中封装一个tcp类?
时间: 2023-03-19 18:24:46 浏览: 81
在 C 语言中,没有类的概念,但是可以使用结构体和函数指针等技术来实现面向对象编程的一些特性。下面是一个简单的封装 TCP 的例子,使用了结构体和函数指针来实现。
首先,我们定义一个结构体来表示 TCP 连接:
```c
typedef struct {
int sockfd;
} tcp_t;
```
其中,`sockfd` 表示套接字文件描述符,即表示 TCP 连接的句柄。接下来,我们定义一些操作 TCP 连接的函数:
```c
typedef int (*tcp_connect_func_t)(tcp_t *tcp, const char *host, int port);
typedef int (*tcp_send_func_t)(tcp_t *tcp, const void *buf, size_t len);
typedef int (*tcp_recv_func_t)(tcp_t *tcp, void *buf, size_t len);
typedef void (*tcp_close_func_t)(tcp_t *tcp);
```
这里使用了函数指针,将这些操作函数作为结构体的成员,可以方便地进行封装。
接下来,我们定义一个 TCP 类,包括一些操作函数的实现:
```c
typedef struct {
tcp_t tcp;
tcp_connect_func_t connect;
tcp_send_func_t send;
tcp_recv_func_t recv;
tcp_close_func_t close;
} tcp_class_t;
int tcp_connect(tcp_class_t *tcp, const char *host, int port) {
return tcp->connect(&tcp->tcp, host, port);
}
int tcp_send(tcp_class_t *tcp, const void *buf, size_t len) {
return tcp->send(&tcp->tcp, buf, len);
}
int tcp_recv(tcp_class_t *tcp, void *buf, size_t len) {
return tcp->recv(&tcp->tcp, buf, len);
}
void tcp_close(tcp_class_t *tcp) {
tcp->close(&tcp->tcp);
}
```
这里使用了结构体嵌套,将 `tcp_t` 结构体作为 `tcp_class_t` 的成员,实现了 TCP 连接的封装。其中,`tcp_connect`、`tcp_send`、`tcp_recv`、`tcp_close` 分别对应 TCP 连接的连接、发送、接收和关闭操作。
最后,我们可以使用这个 TCP 类来创建 TCP 连接:
```c
tcp_class_t tcp = {
.tcp = { .sockfd = -1 },
.connect = tcp_connect_impl,
.send = tcp_send_impl,
.recv = tcp_recv_impl,
.close = tcp_close_impl
};
if (tcp.connect(&tcp, "example.com", 80) == -1) {
perror("tcp.connect");
return 1;
}
char buf[1024];
if (tcp.send(&tcp, "GET / HTTP/1.1\r\n\r\n", strlen("GET / HTTP/1.1\r\n\r\n")) == -1) {
perror("tcp.send");
return 1;
}
if (tcp.recv(&tcp, buf, sizeof(buf)) == -1) {
perror("tcp.recv");
return 1;
}
tcp.close(&tcp);
```
这里创建了一个 `tcp_class_t` 对象,调用其成员函数来连接、发送、接收和关闭 TCP 连接。具体