首页 > 解决方案 > Kubernetes 中发送消息的 TCP 套接字连接干扰

问题描述

我正在用 C 语言创建一个应用程序,用于中间和管理计划的应用程序 (NodeJs) 以将信息收集到 MongoDB 中。

这使得应用程序的可伸缩性成为可能并避免重复值。

问题

C 应用程序发送套接字消息的代码:

static void
ssq_connection_server_handler()
{
    ...

    for (i = 0; i < ssq_max_sockets; i++) {
        sd = ssq_connection->clients[i];
        if (FD_ISSET(sd, &master)) {
            if ((ret = ssq_connection->recv(sd, buffer, SSQ_SERVER_MAX_BUFFER_SIZE)) <= 0) {
                continue;
            }

            buffer[ret] = '\0';
            token = ssq_strtok(buffer, ":");
            opts = ssq_strtok(NULL, ":");

            limit = ssq_atoi(opts, ssq_strlen(opts));
            if (limit == SSQ_ERROR) {
                limit = 10;
            }

            if (ssq_strcmp("next", token) == 0) {
                u_char *tasks;
                size_t len;

                tasks = ssq_mongo_collection_find(limit, ssq_mongo->collection, &len);
                ssq_connection->send(sd, tasks, len);
            }
        }
    }

    ...
}

static ssize_t
ssq_connection_send_handler(int fd, u_char *buf, size_t size)
{
    ssize_t n;
    ssq_err_t err;

    for (;;) {
        n = send(fd, buf, size, 0);

        ssq_log_debug("send: fd:%d %z of %uz", fd, n, size);

        if (n > 0) {
            return n;
        }

        err = ssq_socket_errno;

        if (n == 0) {
            ssq_log_error(SSQ_LOG_ALERT, err, "send() returned zero");
            return n;
        }

        if (err == SSQ_EAGAIN || err == SSQ_EINTR) {
            ssq_log_debug_error(err, "send() not ready");

            if (err == SSQ_EAGAIN) {
                return SSQ_AGAIN;
            }
        } else {
            return SSQ_ERROR;
        }
    }
}

NodeJs 中接收消息的代码:

const net = require('net');
const { EJSON } = require('bson');

const sock = new net.Socket();

sock.connect(process.env.SSQ_PORT || 3145, process.env.SSQ_HOST || '127.0.0.1', () => {
    console.log('socket connection established');
});

sock.on('data', (data) => {
    try {
        const tasks = EJSON.parse(data);
        console.log(tasks);
        process.exit(0);
    } catch (err) {
        console.error(err);
        process.exit(1);
    }
});

sock.on('error', () => {
    /* void */
});

sock.on('close', () => {
    console.warn('socket connection has been closed');
});

sock.write(Buffer.from('next:10'));

我认为来自 K8s 的东西正在拦截和修改消息。

标签: csocketskubernetes

解决方案


推荐阅读