несколько клиентов останавливаются и ждут с помощью C

#c #sockets

Вопрос:

Я реализую stopamp;wait с помощью программирования сокетов c и udp. с одним клиентом это работает, но с несколькими клиентами это не работает.

сервер.c

 struct sockaddr_in newAddr;
socklen_t addr_size = sizeof(newAddr);
fd_set rset;
int frame_id = 0;
Frame frame_recv;
Frame frame_send;

int socket_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (socket_desc < 0) {
    perror("Socket Creation Failed ");
    exit(EXIT_FAILURE);
}
else {
    perror("Socket Created ");
}

if (bind(socket_desc, (struct sockaddr *) amp;server_addr,
        sizeof(server_addr)) < 0 ) {
    perror("Bind Failed ");
    exit(EXIT_FAILURE);
}
else {
    perror("Bind Done ");
}

printf("Listening for Messages...n");

FD_ZERO(amp;rset);

while (1) {
    FD_SET(socket_desc, amp;rset);
    select(socket_desc   1, amp;rset, NULL, NULL, NULL);
    if (FD_ISSET(socket_desc, amp;rset)) {
        int recv_size = recvfrom(socket_desc, amp;frame_recv, sizeof(Frame), 0,
                                  (struct sockaddr *) amp;newAddr, amp;addr_size);
        if (recv_size > 0 amp;amp; frame_recv.frame_kind == 1 amp;amp;
            frame_recv.sq_no == frame_id) {
            printf("[ ]Frame Received: %sn", frame_recv.packet.data);

            frame_send.sq_no = 0;
            frame_send.frame_kind = 0;
            frame_send.ack = frame_recv.sq_no   1;
            sendto(socket_desc, amp;frame_send, sizeof(frame_send), 0,
                  (struct sockaddr*)amp;newAddr, addr_size);
            printf("[ ]Ack Sendn");
        }
        else {
            printf("[ ]Frame Not Receivedn");
            break;
        }
        frame_id   ;
    }
}
close(socket_desc);
 

клиент.c

 char buffer[1024];
socklen_t addr_size;
int frame_id = 0;
Frame frame_send;
Frame frame_recv;
int ack_recv = 1;

int socket_desc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (socket_desc < 0) {
    perror("Socket Creation Failed ");
    exit(EXIT_FAILURE);
}
else {
    perror("Socket Created ");
}

while (1) {
    if (ack_recv == 1) {
        frame_send.sq_no = frame_id;
        frame_send.frame_kind = 1;
        frame_send.ack = 0;

        printf("Enter Data: ");
        scanf("%s", buffer);
        strcpy(frame_send.packet.data, buffer);
        sendto(socket_desc, amp;frame_send, sizeof(Frame), 0,
              (struct sockaddr*)amp;server_addr, sizeof(server_addr));
        printf("[ ]Frame Sendn");
    }
    int addr_size = sizeof(server_addr);
    int recv_size = recvfrom(socket_desc, amp;frame_recv, sizeof(frame_recv), 0 ,(struct sockaddr*)amp;server_addr, amp;addr_size);

    if (recv_size > 0 amp;amp; frame_recv.sq_no == 0 amp;amp; frame_recv.ack == frame_id   1) {
        printf("[ ]Ack Receivedn");
        ack_recv = 1;
    }
    else {
        printf("[-]Ack Not Receivedn");
        ack_recv = 0;
        break;
    }

    frame_id  ;
}
close(socket_desc);
 

заголовок.h

 typedef struct packet {
    char data[1024];
} Packet;

typedef struct frame {
    int frame_kind; //ACK:0, SEQ:1 FIN:2
    int sq_no;
    int ack;
    Packet packet;
} Frame;
 

Я обнаружил, что frame_recv.sq_no это и frame_id имеет другое значение при запуске второго клиента.

Я прочитал вопросы на ту же тему, но не смог найти ошибку в своем коде.

Комментарии:

1. perror("Socket Created "); На самом деле это не имеет никакого смысла. Если socket вызов выполнен успешно, он не обязательно оставляет errno какое-либо конкретное значение, и это может привести к появлению таких сбивающих с толку сообщений об ошибках, как Socket Created: not a typewriter . Вы действительно не хотите писать сообщение об ошибке, если только не произошла ошибка.

2. Спасибо. Я все исправлю. Не могли бы вы, пожалуйста, проверить код на наличие проблемы?