本代码提供自己创建 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 机制。我们可以实现同时监听多个客户端,然后过滤其他客户端的功能。