socket編程中,有一個TCP服務器,須要實現這樣的一個功能,它只能接受某個指定IP的客戶鏈接,其餘IP地址的鏈接都拒絕。
好比,服務器在端口3344進行監聽(listen),他只接受某個IP(如192.168.0.123)地址的客戶端鏈接過來,不是從192.168.0.123鏈接過來的,都拒絕。
假設有客戶端IP地址不是192.168.0.123,向服務器發起connect;
這時服務器的accept仍然不返回,而客戶的鏈接也失敗;
目前我所知的方法是,只要客戶端connect到服務器的3344,服務器的accept就返回,而後經過accept附帶的地址信息判斷是否是從192.168.0.123連過來的,若是不是,那麼就調用closesocket,關閉accept返回的socket。
這樣處理對於服務器端,問題不大。可是對於客戶端,卻有一些問題。由於當服務器accept以後,客戶端的connect就會成功,這時客戶端就會向用戶報告鏈接成功,或者作其餘事物。但是很快,服務器端就會關閉socket,而後又報告給客戶說鏈接不成功……。
最好的辦法就是,不是192.168.0.123的客戶端向服務器connect的時候,根本不會成功,服務器的accept也更不不會返回。
不知道你們有沒有什麼好建議?還有一種是過濾指定的端口,只有指定端口的鏈接才成功,其餘的都不能成功。編程
試試WSAAccept函數,後兩個參數提供一個回調函數用於過濾服務器
C/C++ code?app
1socket 2函數 3this 4spa 5.net 6code 7orm |
|
lpfnCondition
The address of an optional, application-specified condition function that will make an accept/reject decision based on the caller information passed in as parameters, and optionally create or join a socket group by assigning an appropriate value to the result parameter g of this function. If this parameter is NULL, then no condition function is called.
dwCallbackData
Callback data passed back to the application-specified condition function as the value of the dwCallbackData parameter passed to the condition function. This parameter is only applicable if the lpfnCondition parameter is not NULL. This parameter is not interpreted by Windows Sockets.
通過搗騰,vocanicy就是正解,不過以前要設置SO_CONDITIONAL_ACCEPT 感謝你們的建議,尤爲感謝vocanicy的幫助