2011-06-20 200 views
4

相關前閱讀客戶端的IP地址:C++ Winsock API how to get connecting client IP before accepting the connection?Linux的TCP服務器:接受連接

你好,當你運行的是TCP服務器(C語言編寫的,使用Berkeley套接字API)是有可能在實際接受連接之前讀取客戶端的IP地址/端口?

據我所知,如果您不想通過IP地址與給定的客戶端進行通信,則必須先連接accept,然後直接連接shutdown

僞代碼(我找了peekrefuse法):

int serverfd = listen(...); 
for(;;) { 
    struct sockaddr_in clientAddr; 
    peek(serverfd, &clientAddr, sizeof(clientAddr)); 
    if(isLegit(&clientAddr)) { 
     int clientfd = accept(serverfd, &clientAddr, sizeof(clientAddr)); 
     handleClient(clientfd); 
    } else { 
     refuse(serverfd, &clientAddr, sizeof(clientAddr)); 
    } 
} 
+0

我做了一大堆研究,因爲我相當肯定,我曾經爲此看到過一個'ioctl'。沒有骰子。我不認爲這也可以做到。 – Omnifarious

回答

3

我想你要做的是防止發生TCP協商,如果它匹配一個特定的IP。據我所知,這是不可能在套接字層。 TCP協商將發生,並且在您接受套接字時,協商已經發生。

從技術上講,你可能會以某種方式窺視那些狀態信息,但它不會做你期望的事情。接受套接字是已經完成工作的內核和想要讀取數據的程序之間的接口。最簡單的做法是接受套接字,如果你不需要,就引導它。

如果您想要首先防止發生TCP協商,則需要使用iptables。

1

沒有這樣的API可用於TCP瓦特/ BSD插座。建議:使用tcp-wrappers或iptables來完成繁重的工作。一個比另一個更自動。

UDP允許你使用MSG_PEEK,它可以讓你從recvfrom看到它是誰,但是你仍然必須讀取數據包,所以這是不成功的。