我必须使用套接字(不使用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));
我尝试了一些解决方案,但还是出现了同样的错误。。。。
std::thread client_th(client.SendXBytes(socket, 512, (void*)buffer));
这直接调用SendXBytes
函数,将其返回值(即void
(传递给std::thread
构造函数,从而导致错误。你可能想做的是把这个调用包装成这样的lambda:
std::thread client_th([&]{ client.SendXBytes(socket, 512, (void*)buffer); });
如果你从未听说过lambdas,你也许可以读一读。确保您理解通过引用(如这里所示(或使用=
而不是&
通过值捕获外部变量的含义。在这种情况下,通过引用捕获是可以的,但如果线程的寿命可能超过捕获的变量,则会导致未定义的行为。