【发布时间】:2021-11-09 11:53:06
【问题描述】:
我必须使用套接字(不使用 boost 库)从客户端向服务器发送数据(通过 TCP)。
我在 cpp 文件中的实现:
void Server::SendXBytes(int socket, unsigned int x, void* buffer)
{
int bytesSent = 0;
int result;
int* bufferint = (int*)buffer;
while (bytesSent < x)
{
result = read(socket, bufferint + bytesSent, x - bytesSent);
if (result < 1)
{
cout << "Error sending bytes" << endl;
}
}
}
然后我在下面的main.cpp 中使用它:
#include "client.cpp"
#include "server.cpp"
#include <thread>
int main()
{
int server_id;
int socket;
Server server(1024);
Client client(1024);
int server_fd = server.createSocket(server_id);
server.PrepareSocket(server_fd);
server.AcceptConn(server_fd, socket);
int* buffer = new int[2000];
std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));
std::thread server_th(server.ReadXBytes(socket, 512, (void*)buffer));
server_th.join();
client_th.join();
}
编译时返回错误:
main.cpp:15:70: error: invalid use of void expression
std::thread server_th(server.ReadXBytes(socket, 512, (void*)buffer));
^
main.cpp:16:70: error: invalid use of void expression
std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));
我尝试了一些解决方案,但仍然有同样的错误....
【问题讨论】:
-
带有
int数组的名称bytesSent很奇怪。另外,我会避免裸露new,并在可能的情况下进行类型转换 -
std::thread的构造函数接受的参数是一个函数(或函数对象),并且可以选择传递给该函数的一组参数。线程本身将调用该函数。没有构造函数接受调用函数的结果(除非该函数返回指向函数或函数对象的指针,而您的函数调用不会)但这就是main()传递的内容。试试std::thread client_th(&Server::SendXBytes, &client, socket, 512, (void *)buffer); -
顺便说一句,你打电话给
read而不是write -
您真的不想在线程之间共享缓冲区。 (为什么
Client和Server不管理自己的缓冲区?) -
@user253751,是的,你是对的......!