No se pueden recibir datos cuando se combinan la selección y el protocolo UDP

Lw Cui

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 fdcon 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 cbufnunca se muestra) y no puedo encontrar una manera de resolverlo. Se agradece cualquier idea.

Yuki

Parece una falla lógica addFd. Debería ser algo maxfd = std::max(fd, maxfd)así como inicializar maxfden algo como INT_MINen 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

No se pueden recibir datos cuando se combinan la selección y el protocolo UDP

La aplicación se bloquea cuando no se pueden cargar datos con Rxjava 2 y Retrofit 2

El socket UDP no puede recibir respuestas cuando se utiliza la función de conexión en Linux

No se pueden obtener los datos actualizados de la selección d3 cuando se usa la tecla

Reaccionar: los componentes de la función no pueden recibir referencias cuando se muestra un modal

No se pueden enviar datos entre el cliente UDP en matlab y el servidor en linux

TypeError: el objeto 'NoneType' no se puede suscribir cuando se combinan elementos de datos

no se pueden recibir datos adicionales de la notificación push de análisis en Android

no se pueden recibir datos adicionales de la notificación push de análisis en Android

No se pueden recibir datos con libusb

Android: no se pueden recibir datos de PHP

No se pueden recibir datos POST en nodeJs

Seguir ordenando mis datos en la leyenda de ggplot donde se combinan el color y la forma

¿Cómo evitar el "efecto de sacudida" en "hover" cuando se combinan transición y transformación?

pg-promise: no se puede recibir la respuesta de la base de datos cuando se usa el lote

¿Cómo recibir una llamada al controlador cuando se cambia el cuadro de selección?

No se pueden recibir datos POST a menos que actualice el cliente. ¿Por qué? ¿Cómo puedo esperar a que se reciban los datos de la publicación antes de que se cargue la página?

No se pueden pasar datos a otro controlador de vista cuando se prepara para la transición

No se pueden recuperar datos de la base de datos, cuando la conexión es correcta

No se puede recibir el paquete UDP en la aplicación WPF

No se pueden recibir datos en el conector de extracción usando zeroMQ, "Dirección en uso" - Error

¿Cómo resolver el problema cuando la aplicación se publica en la Expo y otros no pueden tener acceso?

La transición no ocurre cuando se eliminan y agregan datos en el modelo en swiftUi

La transición no ocurre cuando se eliminan y agregan datos en el modelo en swiftUi

La transición no ocurre cuando se eliminan y agregan datos en el modelo en swiftUi

No se pueden recibir datos de la base de datos de firebase

No se pueden ocultar elementos por página y paginación en la tabla de datos cuando se muestra menos del número

No se pueden recibir datos en un método HttpPost de API web desde la publicación React axios

No se pueden insertar datos en la tabla SQL cuando se usa el mismo código que la consulta anterior

TOP Lista

CalienteEtiquetas

Archivo