Я пытаюсь создать сервер, который мог бы отправлять пакеты регулярно (каждые 5 секунд), в то же время имея возможность получать входящие пакеты, ответы от того, который я отправил, и обрабатывать их. До сих пор мне удавалось регулярно отправлять пакеты, хотя я не уверен, что это хорошее решение. Однако я до сих пор не знаю, сможет ли мой сокет действительно принимать пакеты одновременно.
Это то, что я написал до сих пор:
int main(int argc, char const *argv[]){
int rc;
int sockopt;
int s = socket(AF_INET6, SOCK_DGRAM, 0);
rc = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &sockopt,sizeof(int));
if (rc < 0){
perror("setsockopt");
exit(EXIT_FAILURE);
}
struct sockaddr_in6 server;
memset(&server, 0, sizeof(server));
server.sin6_family = AF_INET6;
int p = inet_pton(AF_INET6, "127.0.0.1", &server.sin6_addr);
if (p < 0){
perror("inet_pton");
exit(EXIT_FAILURE);
}
server.sin6_port = htons(2077);
rc = fcntl(s, F_GETFL);
if (rc < 0) {
perror("fcntl\n");exit(1);
}
rc = fcntl(s,F_SETFL, rc | O_NONBLOCK);
if (rc < 0) {
perror("fcntl\n");exit(1);
}
char *message = "Netcat\n";
unsigned char reply[1024];
memset(reply, 0, sizeof(reply));
int to = 5;
struct timeval timeNow;
struct timeval timeLimit;
rc = gettimeofday(&timeNow, NULL);
if (rc < 0){
perror("gettimeofday");
exit(EXIT_FAILURE);
}
rc = gettimeofday(&timeLimit, NULL);
if (rc < 0){
perror("gettimeofday - limit");
exit(EXIT_FAILURE);
}
while(1){
if (timeNow.tv_sec - timeLimit.tv_sec >= 5){
rc = sendto(s,message,7,0,(struct sockaddr *)&server, sizeof(server));
printf("5 seconds\n");
gettimeofday(&timeLimit, NULL);
}
gettimeofday(&timeNow, NULL);
rc = recvfrom(s, reply, 1024, 0, NULL, NULL);
if (strlen(reply) != 0){
printf("reply=%s\n", reply);
}
}
return 0;
}
Моя цель здесь можно было бы отправлять пакеты каждые 5 секунд, при этом все еще имея возможность получать входящие. Я netcat
открыл в одном терминале, слушающем :: 1/2077, я попытался отправить пакет, чтобы узнать, получит ли мой сервер его, выполнив echo "test" | nc -6u -w0 ::1 2077
, но netcat получил его, а не мой сервер.
У вас есть какие-нибудь решения, которые я мог бы использовать, чтобы сделать это, пожалуйста?
Спасибо