Урок 3. Сетевые архитектуры. TCP-сокеты #3

Open
alexander wants to merge 5 commits from lesson_03 into master
6 changed files with 26 additions and 14 deletions
Showing only changes of commit 09446a63f7 - Show all commits

View File

@ -22,7 +22,7 @@ public:
const unsigned short int getSize() const;
const std::string getString() const;
void clear();
operator void*();
operator char*();
};
}

View File

@ -16,7 +16,6 @@ class ClientTCP: public Server // @suppress("Class has a virtual method and non-
{
private:
bool _connect;
int _connfd;
void chat();
public:

View File

@ -75,7 +75,7 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
std::string host = optionHost.getValues()[0];
auto host = optionHost.getValues()[0];
client(port, host);
}

View File

@ -32,9 +32,9 @@ void Buffer::clear()
bzero(_buffer.get(), _size);
}
Buffer::operator void*()
Buffer::operator char*()
{
return _buffer.get();
return reinterpret_cast<char*>(_buffer.get());
}
}

View File

@ -13,7 +13,7 @@
namespace zh
{
ClientTCP::ClientTCP(const std::string &address, const unsigned short int port, const unsigned short int sizeBuffer) : Server(port, sizeBuffer), _connect(false), _connfd(-1)
ClientTCP::ClientTCP(const std::string &address, const unsigned short int port, const unsigned short int sizeBuffer) : Server(port, sizeBuffer), _connect(false)
{
_socket = std::make_unique<Socket>(AF_INET, SOCK_STREAM, IPPROTO_IP);
_address = std::make_unique<Address>(AF_INET, address, port);
@ -27,7 +27,7 @@ void ClientTCP::connect()
return;
}
if (::connect((*_socket), reinterpret_cast<const sockaddr*>(&(*_address)), (*_address).size()) != 0)
if (::connect(*_socket, reinterpret_cast<const sockaddr*>(&(*_address)), (*_address).size()) != 0)
std::cerr << "Не удаётся подключить клиентский сокет к серверному сокету!" << std::endl;
else
_connect = true;
@ -37,12 +37,20 @@ void ClientTCP::connect()
void ClientTCP::chat()
{
Buffer *bf = &(*_buffer);
while (_connect)
{
Buffer *bf = &(*_buffer);
bf->clear();
std::cin.getline(reinterpret_cast<char*>(bf->operator void *()), bf->getSize());
write(_connfd, *bf, bf->getSize());
std::cin.getline(*bf, bf->getSize());
write(*_socket, *bf, bf->getSize());
bf->clear();
if (read(*_socket, *bf, bf->getSize()) > 0)
{
if (bf->getString() == "exit")
break;
else
std::cout << '\t' << bf->getString() << std::endl;
}
}
close(*_socket);
}

View File

@ -26,8 +26,7 @@ void ServerTCP::Hook::execute(std::string buffer, ServerTCP &s)
}
else
{
auto pos = buffer.find_first_of(_command);
if (pos != std::string::npos && pos == 0)
if (buffer == _command)
{
_handler(buffer, s);
}
@ -54,7 +53,7 @@ void ServerTCP::bind()
return;
}
if (::bind((*_socket), reinterpret_cast<const sockaddr*>(&(*_address)), (*_address).size()) != 0)
if (::bind(*_socket, reinterpret_cast<const sockaddr*>(&(*_address)), (*_address).size()) != 0)
std::cerr << "Не удаётся связать адрес с дескриптором слушающего сокета!" << std::endl;
else
_bind = true;
@ -85,16 +84,22 @@ void ServerTCP::listen()
void ServerTCP::chat()
{
Buffer *bf = &(*_buffer);
while (_listenLoop)
{
Buffer *bf = &(*_buffer);
bf->clear();
int size = read(_connfd, *bf, bf->getSize());
if (size > 0)
{
std::for_each(_hooks.begin(), _hooks.end(), [&](Hook &hook)
{
hook.execute(bf->getString(), *this);
});
if (!_listenLoop)
write(_connfd, "exit", 4);
else
write(_connfd, "OK", 2);
}
else if (size < 0)
break;
}