我想讓多個客戶端連接,我想做 recvfrom 和 sendto。我使用了std:vector如下,但是每次recvfrom時,我都會輸入資訊,所以我寫了一個if陳述句,但是'=='會出錯。(沒有運算子==匹配這些運算元)
當同一個客戶端“recvfrom”時,有沒有辦法不將它添加到向量中?
std::vector<SOCKADDR_IN> udpClient_list;
addrlength = sizeof(dlg->client_addr);
recv_size = recvfrom(dlg->server_sock, reinterpret_cast<char*>(buf), BUFFER_SIZE, 0, (SOCKADDR*)&dlg->client_addr, &addrlength);
for (int i = 0; i == udpClient_list.size(); i )
{
if (udpClient_list[i] != &dlg->client_addr)
{
udpClient_list.push_back(dlg->client_addr);
break;
}
}
uj5u.com熱心網友回復:
首先,你的回圈條件是錯誤的。i應該是size_t,并且你需要在比較時使用<而不是。==iudpClient_list.size()
其次,您正在將一個SOCKADDR_IN實體與一個SOCKADDR_IN*指標進行比較,這顯然是行不通的。擺脫&. 但即便如此,除非您自己手動定義該運算子,否則您無法比較SOCKADDR_IN實體。operator==
vector第三,僅當所有現有條目都不匹配時,您才需要添加一個新條目。但是,如果任何條目不匹配,您將添加新條目。
嘗試更多類似的東西:
bool operator==(const SOCKADDR_IN &addr1, const SOCKADDR_IN &addr2)
{
return (addr1.sin_family == AF_INET &&
addr1.sin_family == addr2.sin_family &&
addr1.sin_port == addr2.sin_port &&
addr1.sin_addr.s_addr == addr2.sin_addr.s_addr);
}
std::vector<SOCKADDR_IN> udpClient_list;
...
addrlength = sizeof(dlg->client_addr);
recv_size = recvfrom(dlg->server_sock, reinterpret_cast<char*>(buf), BUFFER_SIZE, 0, (SOCKADDR*)&dlg->client_addr, &addrlength);
if (recv_size < 0) ... // error handling
bool exists = false;
for (size_t i = 0; i < udpClient_list.size(); i)
{
if (udpClient_list[i] == dlg->client_addr)
{
exists = true;
break;
}
}
if (!exists)
udpClient_list.push_back(dlg->client_addr);
話雖如此,請考慮std::find()改用,例如:
bool operator==(const SOCKADDR_IN &addr1, const SOCKADDR_IN &addr2)
{
return (addr1.sin_family == AF_INET &&
addr1.sin_family == addr2.sin_family &&
addr1.sin_port == addr2.sin_port &&
addr1.sin_addr.s_addr == addr2.sin_addr.s_addr);
}
std::vector<SOCKADDR_IN> udpClient_list;
...
addrlength = sizeof(dlg->client_addr);
recv_size = recvfrom(dlg->server_sock, reinterpret_cast<char*>(buf), BUFFER_SIZE, 0, (SOCKADDR*)&dlg->client_addr, &addrlength);
if (recv_size < 0) ... // error handling
if (std::find(udpClient_list.begin(), udpClient_list.end(), dlg->client_addr) == udpClient_list.end())
udpClient_list.push_back(dlg->client_addr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493795.html
