我正在編寫大學項目,涉及使用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? –