问题描述
写了一个 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,我的服务端也顺利的收到了客户端的信息.
这真的很奇怪.