UDP 서버가 select
시스템 호출로 패킷을 수신 중입니다. 그리고 각 UDP 클라이언트로부터 최신 패킷을 받고 싶습니다. (또한 여러 개의 UDP 클라이언트 패킷을 듣고 싶습니다.) 내 간단한 UDP 서버의udp 서버의 최신 패킷 수신 - C
코드 :
int main(void) {
int fd;
int port = 5678;
char buffer[1024];
fd_set readfs;
socklen_t client_length;
struct timeval timeout_interval;
struct sockaddr_in6 server_addr;
struct sockaddr_in6 client_addr;
int result;
int recv;
char client_addr_ipv6[100];
fd = socket(PF_INET6, SOCK_DGRAM, 0);
printf(" \e[1m \e[34m ---------------------------------------- \n-------------------- UDP SERVER --------------------\n \e[39m \e[0m \n");
printf("Process: \e[34m %d \e[49m Port ..\n", port);
if (fd < 0) {
printf("ERR: fd < 0");
} else {
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin6_family = AF_INET6;
server_addr.sin6_addr = in6addr_any;
server_addr.sin6_port = htons(port);
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin6_family = AF_INET6;
client_addr.sin6_addr = in6addr_any;
client_addr.sin6_port = htons(port);
if (bind(fd, (struct sockaddr *) &server_addr, sizeof(server_addr))
>= 0) {
printf("\e[1m INFO: \e[0m \e[34m Bind success.. \e[39m\n");
} else {
printf("Bind.");
return -1;
}
for (;;) {
FD_ZERO(&readfs);
FD_SET(fd, &readfs);
int max_fd = MAX(0, fd);
timeout_interval.tv_sec = 3;
timeout_interval.tv_usec = 50000000;
result = select(max_fd + 1, &readfs, NULL, NULL, &timeout_interval);
//printf("\n %d \t %d \n", result, fd);
if (result < 0) {
printf("ERR\n");
} else if (result == 0) {
printf("\nTimeout\n");
} else {
if (FD_ISSET(fd, &readfs)) {
client_length = sizeof(client_addr);
if ((recv = recvfrom(fd, buffer, sizeof(buffer), 0,
(struct sockaddr *) &client_addr, &client_length))
< 0) {
printf("Recv-ERR!");
break;
}
inet_ntop(AF_INET6, &(client_addr.sin6_addr), client_addr_ipv6, 100);
//printf("Client IP/Port : %s ",client_addr_ipv6);
printf("\n ------------------------------------------ \n");
printf("\e[1m Data: \e[0m \e[32m %.*s \n Client IP/Port : \e[34m %s/%d \n\e[39m", recv, buffer,client_addr_ipv6,ntohs(client_addr.sin6_port));
}
}
}
}
}
다른 서버에서 보낸 마지막 패킷을 의미한다고 가정하면 UDP 패킷의 순서가 정해져 있지 않으므로 마지막으로 보낸 패킷을 알 수 없습니다. 어느 것이 "마지막"인지 결정하기 위해 패킷에 데이터를 넣어야합니다. –
각 udp-client에서 마지막으로 오는 패킷을 의미합니다. 그래서 어떻게 패킷에서 "마지막"정의하지 않고 할 수 있습니다. 내가 "이 udp 클라이언트에서 가장 최근의 패킷"같은 코드 수 있습니까? 또는 어떻게 이런 식으로 코드 수 있습니까? – Gkan
패킷이 "최신"인지 어떻게 알 수 있습니까? – dbush