El código original para el cliente UDP es el que se muestra a continuación:
while (getline(cin, buf)) {
// c.getConnd() return connected fd
write(c.getConnfd(), buf.c_str(), buf.size());
memset(cbuf, 0, sizeof(cbuf));
read(c.getConnfd(), cbuf, 1024);
LOG(DEBUG) << "read message: " << cbuf;
}
Funciona bien, por lo que ni el servidor (usando recvfrom y sendto) ni el enlace de socket causan este problema.
Para aprender IO multiplex escribo una clase nombrada IOMultiplexingUtility
, que permite al usuario combinar un fd
con el respectivo objeto invocable. Después de configurarlos, ingrese en un bucle infinito (encuentre un fd legible, realice alguna acción, espere de nuevo):
class IOMultiplexingUtility {
public:
IOMultiplexingUtility() {
FD_ZERO(&socketSet);
}
void addFd(int fd, std::function<void(int)> action) {
maxfd = fd + 1;
FD_SET(fd, &socketSet);
fdVec[fd] = action;
}
void start() {
auto readySet = socketSet;
select(maxfd + 1, &readySet, NULL, NULL, NULL);
for (auto &pair: fdVec)
if (FD_ISSET(pair.first, &readySet)) {
if (pair.second != nullptr)pair.second(pair.first);
else if (defaultAction) defaultAction(pair.first);
}
}
private:
fd_set socketSet;
int maxfd;
std::unordered_map<int, std::function<void(int)>> fdVec;
};
Código de cliente UDP modificado como este:
io.addFd(c.getConnfd(), [&c](int)mutable -> void {
char cbuf[1024];
memset(cbuf, 0, sizeof(cbuf));
read(c.getConnfd(), cbuf, 1024);
cout << cbuf << endl;
});
io.addFd(fileno(stdin), [&c](int)mutable -> void {
string buf;
getline(cin, buf);
write(c.getConnfd(), buf.c_str(), buf.size());
});
while (true) io.start();
Se produjo un error (ingreso texto, el servidor recibe y envía correctamente, pero cbuf
nunca se muestra) y no puedo encontrar una manera de resolverlo. Se agradece cualquier idea.
Parece una falla lógica addFd
. Debería ser algo maxfd = std::max(fd, maxfd)
así como inicializar maxfd
en algo como INT_MIN
en el constructor.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras