本代码提供自己创建 listen 的功能,因而可以实现服务器监听指定的客户端的数据

接口函数如下:
listen_t *create_listen(struct sockaddr *addr)

示例:


    int main(void)
    {
        listen_t *listen;
        struct sockaddr_in addr;
        int ret;
        char buf[1204];
        struct sockaddr_in clientaddr;

        /* 初始化socket */
        sockfd = init_socket(); 

        /*
            开始监听这个socket. 运行最大的连接数为10
            该函数类似于TCP协议中的 int listen(SOCKET sockfd, int backlog)
        */
        server_listen(&sockfd, 10);

        /* 指定某个客户度,例如,我想要监听来自 112.74.197.88:8008 的客户端的数据 */
        bzero(&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr("112.74.197.88");
        addr.sin_port = htons(8008);

        listen = create_listen((struct sockaddr *)&addr);

        while(1)
        {
            /* 只有指定的客户端数据会唤醒,其他客户端的发送过来的数据都将被过滤 */
            ret = recv_from_listen(listen, (struct sockaddr *)&clientaddr, buf, 1204, -1);
            if(ret == -1)
            {
                printf("%p recv is err \r\n", listen);
            }else{
                printf("%p recv %d byte data is [%s]\r\n", listen, ret, buf);
                if((ret = sendto(sockfd, buf, ret, 0, (struct sockaddr *)(&(listen->addr)), 
                                        sizeof(struct sockaddr))) == -1)
                {
                    perror("sendto :");
                }
                printf("sento [%s]\r\n", buf);
            }
        }
    }
搭配上上一章的 select 机制。我们可以实现同时监听多个客户端,然后过滤其他客户端的功能。