2016-04-13 2 views
0

спасибо, что посмотрели. В настоящее время я использую сервер и клиент для сервера сокетов в C, используя linux. В настоящее время у меня есть рабочая система чата, где и сервер, и сокет могут отправлять уникальные сообщения, а другой конец получит это сообщение с правильной длиной.Socket Server с неизвестным номером принимается в цикле

пример вывода:

Server side 

You:Hello! 
client:hi, how are you? 
You: fine thanks. 
client: blabla 

..И стороне клиента будет выглядеть следующим:

server: Hello! 
you:hi,how are you? 

и т.д. и т.п.

Мой вопрос, есть ли способ для клиент/сервер, чтобы отправлять несколько сообщений до других ответов?

У меня в настоящее время есть бесконечный цикл while, который ждет приема, а затем переходит к отправке, и это будет повторяться до тех пор, пока соединение не будет потеряно. Используя этот метод, я могу отправить только одно сообщение, прежде чем я буду вынужден ждать получения. Я не уверен в правильной реализации, поскольку я все еще совершенно новичок в обоих сокетах и ​​C! Спасибо :)

+0

Это совсем не ясно, о чем вы просите. Что мешает обеим сторонам просто отправлять несколько сообщений до того, как они попытаются получить? –

+0

Общим способом структурирования этого является использование нескольких потоков. Один поток считывает с терминала и отправляет то, что пользователь вводит в соединение, другой поток считывает из соединения и отображает вывод. – Barmar

+0

Другой способ сделать это - использовать 'select()' или 'poll()' для ожидания ввода как от терминала, так и от сети одновременно в одном потоке. – Barmar

ответ

1

Да, это возможно. Основная часть вашего кода, не ждет сокета для данных. Он считывает сокет, если данные уже находятся на нем. Это возможно с помощью функции выбора. После выбора вызова он считывает сокет для отображения принятых сообщений и отправляет сообщения пользователя другому партнеру, если они готовы к вводу.

+0

Предположим, что вы заблокировали в течение 1 минуты при выборе, полученные сообщения на сокете будут отображаться через 1 минуту. Я имею в виду, что. –

+0

Благодарим вас за помощь. Я ошибся, это таймаут. –

+0

Если вы собираетесь использовать thread, почему бы не просто создать один поток, который блокирует 'read' или' recv'? Зачем использовать 'select' для потока, которому больше нечего делать? –

0

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

Следовательно, вы сначала кодируете основной поток только управляете отправкой, так же, как если приложение не может получить вообще. По-видимому, у вас есть поле редактирования где-то (и как-то конвейер из мэгги). Каждый раз, когда пользователь нажимает Enter, вы отправляете из функции обратного вызова поля Edit.

Затем вы кодируете отдельную тему, которая вызывает (и зависает, блокируется). Получает(). Каждый раз, когда Receive «slips on» (т. Е. Данные поступают), вы делаете что-то с данными, а затем возвращаетесь к точке входа Receive. Это продолжается до тех пор, пока вы не прекратите сокет, или другими способами не решите вернуться к точке входа Receive.

только ситуация, когда две нити «касаются друг друга», когда они оба хотят записать текстовое содержимое в одно окно чата. Оба должны сделать это немедленно по мере прохождения передачи, но потенциально оба могут попытаться получить доступ к окну чата точно в тот же момент, что приведет к сбою. Следовательно, вы можете использовать механизм блокировки здесь; тот, который сначала пытается получить доступ к окну чата, «получает его», в то время как механизм блокировки удерживает другой на удержании, пока первый не освободит блокировку. Тогда второй может сделать это. Запирание - это, в конце концов, всего лишь микросекунды.

Это немедленные действия, свободные друг от друга. Вам не нужно указывать несколько сообщений; каждый обрабатывается «как это бывает».