Как можно одновременно отправлять и получать пакеты udp? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь создать сервер, который мог бы отправлять пакеты регулярно (каждые 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 получил его, а не мой сервер.

У вас есть какие-нибудь решения, которые я мог бы использовать, чтобы сделать это, пожалуйста?

Спасибо

...