忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2280 | 回复: 1

Node.js master + worker 问题 [复制链接]

论坛徽章:
0
发表于 2017-09-15 23:52 |显示全部楼层
本帖最后由 B_C_1024 于 2017-09-15 23:54 编辑

nodejs 中master进程 accept的socket发送给worker进程去处理,如果master在把socket发送给worker之前数据已经到了,那么这些数据还能在worker中得到吗?

下面是我的例子:

Master

var http = require('http'),

    numCPUs = require('os').cpus().length;

    cp = require('child_process'),

    net = require('net');

var workers = [];

for (var i = 0; i < numCPUs; i++) {

    workers.push(cp.fork('work.js', ['normal']));

}

net.createServer(function(s) {

    s.pause();

    var worker = workers.shift();

    worker.send('c',s, {track: false, process: false});

    workers.push(worker);

}).listen(8121);

worker:

var http = require('http'),

    cp = require('child_process'),

    net = require('net');

console.log("webServer started on " + process.pid);

process.on("message", function(msg,socket) {

    process.nextTick(function(){

        if(msg == 'c' && socket) {

            socket.on('data', function(data){

                console.log(data);

            });

            socket.readable = socket.writable = true;

            socket.resume();

            socket.emit("connect");

        }

    });

});

发送数据的client:

               int main( int argc, char ** argv)

{

    int sockfd = 0;

    struct sockaddr_in serveraddr;

    char recvline[4096], sendline[4096];

    int ret = 0;

    memset(sendline, 0, 4096);

    printf(" %s\n", post);

    strcat(sendline, "POST http://127.0.0.1:8121/api/analyze HTTP/1.1\r\n");

    strcat(sendline, "Accept-Encoding: identity\r\n");

    strcat(sendline, "Content-Length: 65\r\n");

    strcat(sendline, "Host: 127.0.0.1\r\n");

    strcat(sendline, "Content-type: application/json\r\n\r\n");

    strcat(sendline, post);

    printf("%s\n", sendline);




    if(argc != 2)

    {   

        printf(" usage:./client <ipaddress>\n");

        exit(0);

    }   

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if(sockfd < 0)

    {   

        printf(" create socket error: %s\n", strerror(errno));

        exit(0);

    }   

    memset(&serveraddr, 0, sizeof(serveraddr));

    serveraddr.sin_family = AF_INET;

    serveraddr.sin_port = htons(8121);

    ret = inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);

    if(ret < 0)

    {   

        printf(" inet_pton error for %s\n", argv[1]);

        exit(0);

    }   

    ret = connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));

    if(ret < 0)

    {   

        printf(" connect error: %s\n", strerror(errno));

        exit(0);

    }   

    //fgets(recvline, 4096, stdin);

                   ret = write(sockfd, sendline, strlen(sendline));// 第一次发送

    if(ret <= 0)

    {

        printf(" write to socket error\n");

        exit(0);

    }

    fgets(recvline, 4096, stdin);

    ret = write(sockfd, sendline, strlen(sendline));//第二次发送

    if(ret <= 0)

    {

        printf(" write to socket second error: %s\n", strerror(errno));

        exit(0);

    }




    close(sockfd);

    return 0;

}        

这个client发送了两次数据,第一次发送在server端怎么也收不到,第二次接收输入后在发送,nodejs的server收到了。这是第一次发送的数据丢失了吗,为什么丢失了呢?                                                                       


论坛徽章:
0
发表于 2017-09-16 10:01 |显示全部楼层
问题已经决,确实是第一次发送数据丢失。解决方法,在net.createServer(function(s) {... 这里加上{pauseOnConnect:true}选项。这样做可以保证在把socket发送给worker之前,client发送的数据保留在socket的缓冲区里,在进程中接收。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP