簡體   English   中英

如何知道TCP連接是否在同一台機器上的兩個進程之間?

[英]How to know if a TCP connection is between two processes on the same machine?

使用套接字編程API(例如,socket(),connect(),accept()...),我怎么知道TCP連接是否在同一台機器上的兩個進程之間? 說,我有套接字文件描述符和遠程ip。 我可以簡單地檢查遠程IP是否為127.0.0.1?

沒有真正可靠的方法來確定這一點 - 您可以使用全局路由的IP地址連接到本地進程(即,本地進程可以使用127.0.0.1以外的IP)。 如果您處於虛擬化環境中,那么進程也可以在同一物理硬件上的不同虛擬機中運行。

但請注意,如果遠程IP(通過getpeername )或本地IP(通過getsockname )以127 (包括127.0.0.1 )開頭,那么它確實是本地連接; 但是,如果它是一對不同的地址,則不能排除它可能是本地連接的可能性。

使用getsockname()getpeername()來檢索與該連接關聯的兩個IP,然后使用gethostname()gethostbyname() (或其他特定於平台的API,如Windows上的GetAdaptersInfo()GetAdapterAddresses() )來確定IP屬於本地計算機,然后您可以將連接IP與本地計算機IP進行比較,以查看它們是否匹配。 一台機器可以分配多個IP,同一台機器上的多個IP可以相互通信。

如果你已經擁有遠程ip地址,你可以檢查它是否是環回地址,或者它是否是主機的ip地址,因為正如cnicutar指出的那樣,它不必超過環回地址就是本地連接。

這是我使用的方法。 我們的想法是嘗試將偵聽器綁定到該IP地址,並使用失敗/成功代碼來確定該地址是否是本地的。

我並不是說這個效率特別高,但它應該相當可靠,對我的應用來說這是合適的。

#include <sys/socket.h>
#include <errno.h>
/* ...probably need some other headers I am forgetting... */

int
is_local(const struct sockaddr *addr, socklen_t addr_len)
{
    const char *func = "is_local()";
    int result = 0;

    int tmp = socket(addr->sa_family, SOCK_STREAM, 0);
    if (tmp < 0) {
        printf("%s: socket(%d,SOCK_STREAM,0) failed, errno %d\n",
               func, addr->sa_family);

        goto out;
    }

    /* If bind() succeeds, or if it fails because the address is in
       use, then the address must be local to this system. */
    if (bind(tmp, addr, addr_len) < 0) {
        if (errno == EADDRINUSE)
            result = 1;
        else if (errno == EADDRNOTAVAIL)
            ; /* do nothing; address is remote */
        else
            printf("%s: bind() unexpected error %d\n", func, errno);
    }
    else {
        result = 1;
    }

    close(tmp);

 out:
    return result;
}

你這樣稱呼它:

struct sockaddr_storage client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int fd = accept(listener, &client_addr, &client_addr_len);

if (is_local((struct sockaddr *)&client_addr, client_addr_len))
    /* peer is local */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM