C++ Linux UDP socket,服务端监听127.0.0.1被自动转换为255.255.255.255?

问题描述

写了一个 UDP socket 通信的程序,服务端和客户端都部署在本机.服务端监听 127.0.0.1:30000,客户端向 127.0.0.1:30000发送消息.然而,服务端并没有收到消息.

排查过程

在终端中使用

netstat -ah | grep 30000

来查看被监听的 30000 端口.输出如下

udp 0 0 255.255.255.255:30000 0.0.0.0:*

被监听的本地地址变成了 255.255.255.255,导致了服务端无法收到消息.

问题的解决 以及 奇怪的现象

出现问题的服务端代码

// baseinter.cpp

class BaseInter{
public:
	...
    (一些无关紧要的代码)
    ...
    
    int16_t getPort() const {return port;}
    const char* getIp() const {return ip;}
    int getSocket() const {return socket_fd;}

private:
    int16_t port;
    const char* &ip;
    int socket_fd;
};
// server.cpp
// UDPServer:public BaseInter

int8_t UDPServer::init(){
	...
	(一些无关紧要的代码)
	...
	sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port   = htons(getPort());
	local.sin_addr.s_addr = inet_addr(getIp());
	int state = bind(getSocket(), (const sockaddr*)&local, sizeof(local));
	...
	(一些无关紧要的代码)
	...
}

我确信代码的其他部分没有问题,因为当我让服务端监听 0.0.0.0 时,可以正常收到消息.只有监听 127.0.0.1 出现了上述的奇怪问题.

奇怪的事情

我在 server.cpp 中加入打印 local.sin_addr.s_addr 的代码,如下

// server.cpp
// UDPServer:public BaseInter

int8_t UDPServer::init(){
	...
	(一些无关紧要的代码)
	...
	sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port   = htons(getPort());
	local.sin_addr.s_addr = inet_addr(getIp());
	// 下面一行是新加入的
	std::cout<< "raw ip: "<< std::string(getIp())<< "  rap ip: "<< local.sin_addr.s_addr<< std::endl;

	int state = bind(getSocket(), (const sockaddr*)&local, sizeof(local));
	...
	(一些无关紧要的代码)
	...
}

然后再次使用 netstat命令查看被监听的 30000 端口,输出如下:

udp 0 0 127.0.0.1:30000 0.0.0.0:*

这一次,被监听的地址没有变成 255.255.255.255,我的服务端也顺利的收到了客户端的信息.

这真的很奇怪.

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值