【发布时间】:2016-01-23 17:15:52
【问题描述】:
我正在为大学编写一个项目,涉及使用 POSIX 套接字和 C++ 编写聊天客户端和服务器。
客户端应该使用 P2P 相互交谈,例如每个客户端都有自己的开放式 UDP 套接字,他通过该套接字发送和接收来自其他客户端的消息。
我的问题有两个:
- 我的 UDPSocket 类构造函数似乎完全忽略了端口号,无论参数如何都绑定到端口 65535。
- 端口绑定到 IP 255.255.255.255 而不是我自己的 IP (10.0.0.3),或者至少这是我调用 getpeername 时得到的。
据我所知,传递 INADDR_ANY 应该绑定到我的本地地址,传递端口号 0 应该让操作系统选择一个空闲端口,我做错了什么?
这是我的 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继承Socket)
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。
【问题讨论】: