- 论坛徽章:
- 0
|
本帖最后由 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收到了。这是第一次发送的数据丢失了吗,为什么丢失了呢?
|
|