2013-03-21 114 views
0

我正在寫一個基於下面列出的示例的小型tcp服務器,從here套接字只接受特定地址?

#include <sys/socket.h> 
#include <sys/un.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#define MY_SOCK_PATH "/somepath" 
#define LISTEN_BACKLOG 50 

#define handle_error(msg) \ 
    do { perror(msg); exit(EXIT_FAILURE); } while (0) 

int 
main(int argc, char *argv[]) 
{ 
    int sfd, cfd; 
    struct sockaddr_un my_addr, peer_addr; 
    socklen_t peer_addr_size; 

    sfd = socket(AF_UNIX, SOCK_STREAM, 0); 
    if (sfd == -1) 
     handle_error("socket"); 

    memset(&my_addr, 0, sizeof(struct sockaddr_un)); 
         /* Clear structure */ 
    my_addr.sun_family = AF_UNIX; 
    strncpy(my_addr.sun_path, MY_SOCK_PATH, 
      sizeof(my_addr.sun_path) - 1); 

    if (bind(sfd, (struct sockaddr *) &my_addr, 
      sizeof(struct sockaddr_un)) == -1) 
     handle_error("bind"); 

    if (listen(sfd, LISTEN_BACKLOG) == -1) 
     handle_error("listen"); 

    /* Now we can accept incoming connections one 
     at a time using accept(2) */ 

    peer_addr_size = sizeof(struct sockaddr_un); 
    cfd = accept(sfd, (struct sockaddr *) &peer_addr, 
       &peer_addr_size); 
    if (cfd == -1) 
     handle_error("accept"); 

    /* Code to deal with incoming connection(s)... */ 

    /* When no longer required, the socket pathname, MY_SOCK_PATH 
     should be deleted using unlink(2) or remove(3) */ 
} 

當使用accept()打開一個新的連接,是有可能只接受來自白名單中的IP地址連接或以某種方式拒絕被列入黑名單的IP地址?

我迄今爲止發現的唯一技術是首先接受,檢查地址,然後關閉(),如果它不是經過批准的地址。

有什麼建議嗎?

+0

[服務器套接字 - 只接受來自白名單中的IP地址的連接]的可能重複(http://support.microsoft.com/kb/9696618/server-socket-accept-connections-only-from-ip-addresses-in - 白名單) – Nick 2013-03-21 14:10:30

+1

使用防火牆。 – ydroneaud 2013-03-21 16:24:30

回答

5

使用POSIX API和TCP,您必須執行accept()來查找客戶端地址,然後您可以自由關閉,接收,發送或忽略。

通常情況下,您會使用操作系統防火牆執行此類任務。

還記得只是忽略某些客戶端不會增加安全性,因爲您仍然容易受到中間人,重播和嗅探攻擊。

相關問題