我正在编写大学项目,涉及使用POSIX套接字和C++编写聊天客户端和服务器。POSIX UDP套接字未绑定到正确的IP
客户端应该使用P2P进行对话,例如每个客户端都有自己的开放UDP套接字,通过该套接字他可以发送消息并从其他客户端接收消息。
我的问题是2倍:
- 我UDPSocket类构造似乎被完全忽视的端口号,而不管参数的绑定到端口65535。
- 端口绑定到IP 255.255.255.255而不是我自己的IP(10.0.0.3),或者至少这就是我在调用getpeername时得到的结果。
据我路过INADDR_ANY应绑定到我的本地地址,并通过端口号为0应该让OS选择自由港的知识,我究竟做错了什么?
这是我UDPSocket类的构造函数:
UDPSocket::UDPSocket(int port){
socket_fd = socket (AF_INET, SOCK_DGRAM, 0);
// clear the s_in struct
bzero((char *) &in, sizeof(in)); /* They say you must do this */
//sets the sin address
in.sin_family = (short)AF_INET;
in.sin_addr.s_addr = htonl(INADDR_ANY); /* WILDCARD */
in.sin_port = htons((u_short)port);
fsize = sizeof(from);
//bind the socket on the specified address
if(bind(socket_fd, (struct sockaddr *)&in, sizeof(in))<0){
perror ("Error naming channel");
}
}
这是初始化:
m_Socket = new UDPSocket(0);
这是我用来检索绑定的地址的方法:(UDPSocket继承插座)
std::string Socket::GetSocketAddress()
{
struct sockaddr_in addr;
int len = sizeof(addr);
getpeername(socket_fd, (struct sockaddr*)&addr, (socklen_t*)&len);
char ipAddressBuffer[50];
memset(ipAddressBuffer, 0, sizeof(ipAddressBuffer));
sprintf(ipAddressBuffer, "%s:%d", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
return ipAddressBuffer;
}
任何帮助将不胜感激,Avi。
感谢(非常)快速响应,虽然现在我面对你似乎已经预测 - 地址是0.0.0.0而不是我自己的地址(本例中为10.0.0.3)。我如何绑定到我的本地IP地址? –
你需要吗?绑定到0.0.0.0将允许您在任何地方发送和接收数据包。 – nos
它将如何工作?假设我有两台不同的PC上有我的服务器和两个客户端A和B,如果我给客户端一个客户端B的地址是“0.0.0.0:3456”,他将能够发送消息到该地址并到达客户端B? –