Только один экземпляр приложения обмена сообщениями, получающего сообщения - PullRequest
0 голосов
/ 04 декабря 2011

В приведенном ниже коде у меня есть 3 функции (включая main).Функция receive_loop опрашивает сокет, связанный с 127.0.0.1, и, если он получает какое-либо сообщение, он печатает его.sender_loop ожидает пользовательского ввода, используя scanf, и при наличии ввода отправляет его через сокет, связанный с 127.0.0.1.main разветвляется и запускает sender_loop в дочернем элементе и receive_loop в родительском.

Теперь, если я скомпилирую код и запускаю два экземпляра этого исполняемого файла, любой экземпляр запускается первым, получая сообщения, отправленныелюбой экземпляр.Допустим, сначала был запущен instance1, а затем instance1 получает сообщения, отправленные instance1 и instance2.Я не могу понять, почему это происходит, и я был бы признателен, если бы кто-то мог объяснить это, пожалуйста (подробно).Спасибо.

// INCLUDES NOT SHOWN

// recieve_loop
int receive_loop(int sock_fd, struct sockaddr *peer) {
    int isDataReady = 0;
    char buff[128]  = {0};
    struct pollfd poll_struct;

    poll_struct.fd     = sock_fd; 
    poll_struct.events = POLLIN;

    printf("reciever up\n");
    while (1) {
        while (1) {
            if (isDataReady > 0) break;
            isDataReady = poll(&poll_struct, 1, 500);
        }
        socklen_t sock_len = sizeof(struct sockaddr);
        recvfrom(sock_fd,
                buff,
                sizeof(buff),
                0,
                (struct sockaddr *)peer,
                &sock_len);

        printf("%s\n", buff);
    }

    return 0;
}


// sender_loop
int sender_loop(int sock_fd, struct sockaddr *peer) {
    char buff[32] = {0};

    printf("sender up\n");
    while (1) {
        scanf("%s", buff);

        int bytes_sent = sendto(sock_fd, buff, sizeof(buff), 0, (struct sockaddr *)peer, sizeof(struct sockaddr_in));

        if (bytes_sent <= 0)
            printf("sending message failed\n");

    }

    return 0;
}

int main(int argc, const char *argv[]) {
    // socket file descriptor to send data through
    int sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    // fill in the peer's address, loopback in this case
    struct sockaddr_in *peer = malloc(sizeof(struct sockaddr_in));
    peer->sin_family = AF_INET;
    peer->sin_port   = htons(11110);
    inet_pton(AF_INET, "127.0.0.1", &peer->sin_addr);

    bind(sock_fd, (struct sockaddr *)peer, sizeof(struct sockaddr_in)); 

    pid_t pid = fork();
    if (pid < 0) {
        printf("Couldn't fork, exiting");
        return 1;
    }
    if (pid == 0) {
        sender_loop(sock_fd, (struct sockaddr *)peer);
    } else {
        receive_loop(sock_fd, (struct sockaddr *)peer);
    }
    return 0;
}

1 Ответ

2 голосов
/ 04 декабря 2011

Ошибка вашего второго экземпляра на bind(), так как он пытается подключиться к порту, уже используемому первым экземпляром.

Перейдите к этому и посмотрите.

int ret = bind(sock_fd, (struct sockaddr *)peer, sizeof(struct sockaddr_in));
if (ret < 0)
{
    perror("bind");
    exit(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...