01/10/2018, 11:11
Thắc mắc về socket multithread C++
Chào mấy man!!!
Tình hình là em đang làm một cái socket để gửi file giữa client và server, cũng như bao người thì em sẽ tạo một thread mới khi có một client mới kết nối, nhưng cuộc đời không như là mơ khi có kết nối thứ hai thì server không còn nhận được kết nối của client trước nữa
Em có sử dụng thread ở đây:
void Server::start() {
if (listen(this->socketFileDescriptor, 20) < 0) {
throw Exception("Listen error");
}
std::cout << "Server: waiting for connection." << std::endl;
SocketFileDescriptor newSocketFileDescriptor;
struct sockaddr_storage clientAddress;
socklen_t clientAddressLen = sizeof(clientAddress);
while (true) {
if ((newSocketFileDescriptor = accept(socketFileDescriptor,
(struct sockaddr *)&clientAddress,
&clientAddressLen)) < 0)
{
throw Exception("Server can't accept connection.");
}
char ipClient[INET_ADDRSTRLEN];
inet_ntop(clientAddress.ss_family, &((struct sockaddr_in *)&clientAddress)->sin_addr, ipClient,
INET_ADDRSTRLEN);
std::cout << "Server got connection from: " << ipClient << "." << std::endl;
std::thread newThread(&Server::handle, this, std::ref(newSocketFileDescriptor));
newThread.detach();
}
}
Đây là hàm Server::handle():
void Server::handle(SocketFileDescriptor &socketFileDescriptor) {
char request[100];
while (true) {
std::memset(request, 0, 100);
ssize_t bytes = recv(socketFileDescriptor, request, 100, 0);
if (bytes == 0) {
break;
}
std::cout << "Thread id: " << std::this_thread::get_id() << ", Client: "
<< socketFileDescriptor << ", Bytes = " << bytes
<< ", Message: " << request << std::endl;
}
::close(socketFileDescriptor);
}
Mong được sự giúp đỡ của các đồng môn. Thân ái!!!
Bài liên quan
Mỗi một SocketFileDescriptor (sfd) sẽ đại diện cho 1 client kết nối tới. Do đó bạn cần tạo một biến sfd mới cho mỗi lần accept.
Giải pháp là tạo một nơi lưu trữ các sfd này. Có thể là array, vector, map, list…
Thanks bạn!!
Mình đã làm được, mình sai ở hàm handler vì để reference vào.