相关疑难解决方法(0)

怎么应该使用strace?

一位同事曾告诉我,当Linux上的所有内容都无法调试时,最后一个选项是使用strace.

我试图学习这个奇怪工具背后的科学,但我不是系统管理大师,我没有真正得到结果.

所以,

  • 究竟是什么,它做了什么?
  • 如何以及在何种情况下使用它?
  • 如何理解和处理输出?

简而言之,简单来说,这些东西是如何工作的?

linux debugging strace

266
推荐指数
8
解决办法
27万
查看次数

如何正确关闭Node.js TCP服务器?

我无法在Google或SO上找到明确的答案.

我知道一个net.Server实例有一个close方法,不允许更多的客户端.但它不会断开已经连接的客户端.我怎样才能做到这一点?

我知道如何用Http做到这一点,我想我问的是它与Tcp是否相同或是否有所不同.

有了Http,我会做这样的事情:

var http = require("http");

var clients = [];

var server = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("You sent a request.");
});

server.on("connection", function(socket) {
    socket.write("You connected.");
    clients.push(socket);
});

// .. later when I want to close
server.close();
clients.forEach(function(client) {
    client.destroy();
});
Run Code Online (Sandbox Code Playgroud)

对于Tcp来说是一样的吗?或者我应该采取不同的方式吗?

javascript tcp http node.js server

9
推荐指数
1
解决办法
7041
查看次数

SO_REUSEADDR和SO_REUSEPORT的行为发生了变化?

在旧版本的Mac OS X中,通配符绑定的工作方式如下所述:

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有何不同?它们在所有主要操作系统中的含义是否相同?

组播地址

SO_REUSEADDR的含义会更改多播地址,因为它允许多个套接字绑定到源多播地址和端口的完全相同的组合.换句话说,对于多播地址,SO_REUSEADDR的行为与单播地址的SO_REUSEPORT完全相同.实际上,代码对于多播地址同样对待SO_REUSEADDR和SO_REUSEPORT,这意味着您可以说SO_REUSEADDR对所有多播地址都意味着SO_REUSEPORT,反之亦然.

MacOS X.

在其核心,MacOS X只是一个BSD风格的UNIX,基于BSD代码的相当晚的分支,甚至与Mac OS 10.3版本的FreeBSD 5同步.这就是为什么MacOS X提供与BSD相同的选项,它们的行为方式与BSD相同.

但在10.10.5中,我在测试网络库时发现了一个变化.

即使设置了SO_REUSEADDR,两个未绑定(通配符)UDP套接字也不能再共享同一个端口(errno = EADDRINUSE).必须在两者上设置SO_REUSEPORT,这对我来说是一个谜.

它可以通过这个简单的测试代码重现:

#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

int main() {
    for(int p = 0; p < 4; ++p) {
        printf("Flags set: ");
        if(p&1) printf("SO_REUSEADDR ");
        if(p&2) printf("SO_REUSEPORT");
        printf("\n");

        int handles[2];
        bool success = true;
        for(int i = 0; i < sizeof(handles)/sizeof(int); ++i) {
            handles[i] = socket(AF_INET, SOCK_DGRAM, 0);

            int flag = 1;
            if((p&1) …
Run Code Online (Sandbox Code Playgroud)

sockets macos

7
推荐指数
1
解决办法
2769
查看次数

标签 统计

debugging ×1

http ×1

javascript ×1

linux ×1

macos ×1

node.js ×1

server ×1

sockets ×1

strace ×1

tcp ×1