我有一个UDP客户端(代表其他客户端代理),它为我的UDP服务器执行sendto()
,它使用select()
和FD_ISSET()
来处理所有传入的请求。我的客户端和服务器都在同一个盒子里。
(客户端)
sock_fd = socket(AF_INET, SOCK_DGRAM, 0 );
setsockopt(socket_fd, SOL_IP, IP_PKTINFO, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_IP, IP_TRANSPARENT, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_IP, IP_RECVORIGDSTADDR, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(int));
/* client_addr points to the source IP (i.e. other client's IP) */
bind(sock_fd, (const struct sockaddr *)client_addr, sizeof(struct sockaddr));
/* dst_addr points to this box's IP */
sendto(sock_fd, dns_packet_buffer, data_len, 0,
(const struct sockaddr *)dst_addr, sizeof(struct sockaddr));
(服务器) - 显然不是完整的代码摘录!
FD_ZERO(&read_set);
FD_SET(fd, &read_set);
select(num_of_fds, &read_set, &write_set, &error_set);
if (FD_ISSET(fd, read_set))
reply(fd, source_addr.sa.sa_family);
在sendto()
返回成功但FD_ISSET()
返回false的情况下?这似乎发生在我身上!
如果我不代表其他客户端代理(即其他客户端直接与服务器通信),那么它可以工作。只有当我尝试代理时才会出现一些错误。我做错了什么,在哪里?