socket只接受特定的地址?

时间:2013-03-21 14:06:14

标签: c sockets

我正在编写一个基于下面列出的示例的小型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地址?

到目前为止,我发现的唯一技术是首先接受,检查地址,然后如果它不是经批准的地址则关闭()。

有什么建议吗?

1 个答案:

答案 0 :(得分:6)

使用POSIX API和TCP,您必须执行accept()查找客户端地址,然后您可以自由关闭,接收,发送或忽略。

通常,您会将操作系统防火墙用于此类任务。

请记住,忽略某些客户端不会增加安全性,因为您仍然容易受到中间人,重播和嗅探攻击的影响。