2012-04-22 145 views
2

我需要獲取連接的IP地址,以查看它是否已經連接過(如果已經連接過,但沒有連接,它會說離線)。 (使用非阻塞套接字)在接受連接之前獲取套接字的IP地址C++

如何在沒有首先接受IP的情況下獲得IP。

///

case FD_ACCEPT: 
     int W; 
     for(W = 0;W <= ListView_GetItemCount(GetDlgItem(HwND,IDC_IPLIST));W++){ 

所以後來我只是要去檢查IP對列表視圖以查看是否收到連接。如果有,我想使用上次使用的相同套接字號。

這是我如何接受連接,現在

 case FD_ACCEPT: 
     while(Client[F] != NULL) 
     { 
     F++; 
     } 
     Client[F]=accept(wParam,(LPSOCKADDR)&ServAdr,&AdrLen); 
     break; 

所以要打破它......

我要覈對以前的連接的IP列表傳入連接。該列表將具有IP以及其在線/離線(已連接/未連接)。如果在我希望它在我接受新連接時顯示Online時已連接,並使用上次使用的相同套接字號,而不是一起使用新套接字號。如果它沒有,我希望它被添加到列表中。 (名單將有套接字號碼)

如果這沒有多大意義,我會嘗試澄清更多。

+0

[拒絕來自主機的連接]可能的重複(http://stackoverflow.com/questions/1116225/refusing-connection-from-a-host) – alexisdm 2012-04-22 01:23:54

+0

當然,這會使用NAT來垃圾用戶。 – 2012-04-22 05:59:49

回答

1

如果插座數量你的意思是accept()返回的數字,你不能依賴它的價值可言。我的意思是,如果遠程主機斷開並再次連接,accept()返回的值很可能會有所不同。依靠這個號碼是沒有意義的。

如果插座數量你的意思是你的陣列中的位置,您可以指定由accept()返回臨時變量的值:

SOCKET tmpSock; 
sockaddr_in tmpAddr; 
int namelen; 
typedef struct { /*...*/ } TClient; 
TClient Client[MAX_CLIENTS]; 
/*...*/ 
tmpSock = accept(/*...*/); 
namelen = sizeof(tmpAddr); 
getpeername(tmpSock, (sockaddr*)&tmpAddr,&namelen); 
/*...*/ 
//looking for tmpAddr.sin_addr in your list and calculating 
//the list position - F 
/*...*/ 
Client[F].Socket = tmpSock; 
Client[F].IsConnected = true; 
Client[F].Address = tmpAddr.sin_addr; 

有想法的listen()調用後OS內核將接受所有到您設置的端口/本地IP的傳入連接。這意味着遠程主機的connect()將成功返回,無論您是否撥打accept()(如果您在偵聽隊列中有空間)。調用accept()將只允許您與套接字進行交互。它不會改變遠程主機看到的連接狀態。

+0

謝謝你們的幫助,好建議Pavel! – user1348950 2012-04-24 03:21:31

1

我不確定這是可能的,也不是一個有效的規範來實現你想要的。我要麼:

  1. 接受任何連接,然後檢查IP地址,斷開其不在列表

  2. (這可能是不適合你)連接配置上游的防火牆,這樣的只允許IP地址通過。

+0

很好的答案,謝謝。在某些情況下,同時進行#1和#2可能是有益的/必要的。例如,如果您需要向不同的客戶端發送不同的數據。 – Zeek 2017-08-14 11:08:59

2

你所要求的不能用accept()完成。直到它被接受並分配了新的SOCKET句柄後,才能訪問連接的信息。要獲得連接信息預接受,您必須使用WSAAccept()的回調功能。

無論哪種方式,都無法重新使用現有的SOCKET句柄來建立新的連接。每個接受的連接必須具有自己的唯一SOCKET句柄。不過,您可以將先前看到的IP中的新連接與ListView中的現有插槽關聯起來。

0

如果綁定到通配符地址(INADDR_ANY),則用於通信的IP地址在連接進入之前不會被確定(它將是數據包通過的接口中的一個)。相同的監聽套接字可能導致多個IP地址上的接受連接。

如果你綁定到一個特定的地址,那麼你已經知道你綁定的地址。