Read(), похоже, блокируется, хотя передан флаг O_NONBLOCK [закрыто]Linux

Ответить
Anonymous
 Read(), похоже, блокируется, хотя передан флаг O_NONBLOCK [закрыто]

Сообщение Anonymous »


Я пытаюсь написать программу чата, используя UNIX-сокеты. Предполагается, что он будет работать аналогично nc -U '/tmp/...' -l. В настоящее время я тестирую только однонаправленный подход, но, похоже, он не работает.

Моя проблема сейчас в том, что чтение сокета сервера (очевидно) блокируется, и я не знаю, почему. Простой запуск кода серверного сокета должен распечатать бесконечный цикл «Один цикл», но когда вы действительно его запускаете, он просто блокируется при чтении.

Есть идеи, почему?

Серверный сокет:

// стандарт включает #include #include #include // включает в себя функцию сокета() #include #include #include // включаем для чтения() #include // включаем функцию fnctl() (неблокирующую) #include интервал основной() { // переменные интервал врет; интервал server_socket; структура sockaddr_un server_addr; буфер символов[16]; //16-байтовая передача size_t byteSize; // создаем server_socket server_socket = сокет (AF_UNIX, SOCK_DGRAM, 0); // делаем сокет сервера неблокирующим int status = fcntl(server_socket, F_SETFL, fcntl(server_socket, F_GETFL, 0) | O_NONBLOCK); если (статус == -1){ perror("вызов fcntl"); } // привязываем server_socket server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, "/tmp/bidirec.socket"); Рет = связывание(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)); если (рет == -1) { ошибка("связать"); выход (EXIT_FAILURE); } // мастер-цикл в то время как (1) { while(read(0, &buffer, 16) > 0) { запись (server_socket, &buffer, 16); memset(&buffer, '0', sizeof(буфер)); перерыв; } printf("Один цикл\n"); } } Клиентский сокет:
// стандарт включает #include #include #include // включает в себя функцию сокета() #include #include #include // включаем для write() #include интервал основной() { интервал врет; интервал client_socket; структура sockaddr_un client_addr; буфер символов[16]; // создаем client_socket client_socket = сокет (AF_UNIX, SOCK_DGRAM, 0); // подключаемся к server_socket client_addr.sun_family = AF_UNIX; strncpy(client_addr.sun_path, "/tmp/bidirec.socket", sizeof(client_addr.sun_path) - 1); ret = Connect(client_socket, (struct sockaddr *)&client_addr, sizeof(client_addr)); если (рет == -1) { fprintf(stderr, "Сервер не работает.\n"); выход (EXIT_FAILURE); } // мастер-цикл в то время как (1) { while(read(client_socket, &buffer, 16) > 0) { printf("%s", буфер); memset(&buffer, 0, sizeof(буфер)); перерыв; } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»