localhost、127.0.0.1、192.168.xx.xx 的区别

1)localhost:本地主机域名。计算机网络中,localhost意为“本地主机”,指“这台计算机”,是给回路网络接口(loopback)的一个标准主机名,相对应的IP地址为127.0.0.1(IPv4)和[::1](IPv6)。
2)127.0.0.1:是回送地址,指本地机。 127.0.0.1是用来检测网络中自己的IP。对任何一台电脑来说,不管是否连接到Internet,127.0.0.1对于自己来说都是自己
3)192.168.1.1:本机ip地址,但不固定,也可以手动设置成其他ip地址

前两个基本相等,一个是域名,一个是ip,且一定指本机,最后一个不一定是本地机

本机IP的方式,可以让同局域网内其他机器访问。这个是前两个比不了的。

转载于:https://www.cnblogs.com/ang-r/p/10874692.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题需要使用多线程来同时接收来自192.168.1.1和192.168.131.1的数据包,并将它们分别发送到127.0.0.1127.0.0.2。以下是一个简单的多线程示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> #include <unistd.h> #define BUF_SIZE 1024 #define SRC_IP1 "192.168.1.1" #define SRC_IP2 "192.168.131.1" #define DST_IP1 "127.0.0.1" #define DST_IP2 "127.0.0.2" #define SRC_PORT 8080 #define DST_PORT1 8081 #define DST_PORT2 8082 // 线程参数结构体 struct thread_param { int sock; struct sockaddr_in addr; }; // 接收数据并发送的线程函数 void* recv_send_thread(void* arg) { struct thread_param* param = (struct thread_param*)arg; int sock = param->sock; struct sockaddr_in addr = param->addr; char buf[BUF_SIZE]; int ret; // 从指定地址接收数据并发送到指定地址 while (1) { memset(buf, 0, sizeof(buf)); ret = recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL); if (ret < 0) { perror("recvfrom error"); break; } if (addr.sin_addr.s_addr == inet_addr(SRC_IP1)) { ret = sendto(sock, buf, strlen(buf), 0, (struct sockaddr*)&(struct sockaddr_in){AF_INET, htons(DST_PORT1), inet_addr(DST_IP1)}, sizeof(struct sockaddr_in)); } else if (addr.sin_addr.s_addr == inet_addr(SRC_IP2)) { ret = sendto(sock, buf, strlen(buf), 0, (struct sockaddr*)&(struct sockaddr_in){AF_INET, htons(DST_PORT2), inet_addr(DST_IP2)}, sizeof(struct sockaddr_in)); } if (ret < 0) { perror("sendto error"); break; } } // 释放线程参数内存 free(param); return NULL; } int main() { int sock1, sock2, ret; struct sockaddr_in addr1, addr2; // 创建接收端UDP socket1 sock1 = socket(AF_INET, SOCK_DGRAM, 0); if (sock1 < 0) { perror("socket create error"); return -1; } // 绑定接收端IP1和端口 memset(&addr1, 0, sizeof(addr1)); addr1.sin_family = AF_INET; addr1.sin_port = htons(SRC_PORT); addr1.sin_addr.s_addr = inet_addr(SRC_IP1); if (bind(sock1, (struct sockaddr*)&addr1, sizeof(addr1)) < 0) { perror("bind error"); close(sock1); return -1; } // 创建接收端UDP socket2 sock2 = socket(AF_INET, SOCK_DGRAM, 0); if (sock2 < 0) { perror("socket create error"); close(sock1); return -1; } // 绑定接收端IP2和端口 memset(&addr2, 0, sizeof(addr2)); addr2.sin_family = AF_INET; addr2.sin_port = htons(SRC_PORT); addr2.sin_addr.s_addr = inet_addr(SRC_IP2); if (bind(sock2, (struct sockaddr*)&addr2, sizeof(addr2)) < 0) { perror("bind error"); close(sock1); close(sock2); return -1; } // 创建线程1用于接收来自192.168.1.1的数据包并发送到127.0.0.1 pthread_t tid1; struct thread_param* param1 = (struct thread_param*)malloc(sizeof(struct thread_param)); param1->sock = sock1; param1->addr = addr1; ret = pthread_create(&tid1, NULL, recv_send_thread, param1); if (ret < 0) { perror("pthread_create error"); close(sock1); close(sock2); free(param1); return -1; } // 创建线程2用于接收来自192.168.131.1的数据包并发送到127.0.0.2 pthread_t tid2; struct thread_param* param2 = (struct thread_param*)malloc(sizeof(struct thread_param)); param2->sock = sock2; param2->addr = addr2; ret = pthread_create(&tid2, NULL, recv_send_thread, param2); if (ret < 0) { perror("pthread_create error"); close(sock1); close(sock2); free(param1); free(param2); return -1; } // 等待线程退出 pthread_join(tid1, NULL); pthread_join(tid2, NULL); // 关闭socket close(sock1); close(sock2); return 0; } ``` 该示例代码中,我们首先创建了两个UDP socket用于分别接收来自192.168.1.1和192.168.131.1的数据包,并绑定了IP地址和端口。然后,我们创建了两个线程,分别用于接收数据并发送到指定地址。最后,我们等待线程退出并关闭socket。 注意:本示例代码仅供参考,实际应用中还需要进行错误处理、超时处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值