加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何知道同一机器上的两个进程之间的TCP连接是否相同?

发布时间:2020-12-16 05:39:48 所属栏目:百科 来源:网络整理
导读:使用套接字编程API(例如,socket(),connect(),accept()…),如何知道同一台机器上的两个进程之间是否有TCP连接?说,我有socket文件描述符和远程ip.我可以简单地检查远程ip是127.0.0.1吗? 解决方法 这是我使用的方法.这个想法是尝试将侦听器绑定到该IP地址,并
使用套接字编程API(例如,socket(),connect(),accept()…),如何知道同一台机器上的两个进程之间是否有TCP连接?说,我有socket文件描述符和远程ip.我可以简单地检查远程ip是127.0.0.1吗?

解决方法

这是我使用的方法.这个想法是尝试将侦听器绑定到该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,0) failed,errno %dn",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 %dn",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 */

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读