2012-04-11 3 views
1

Я создаю чат-сервер, который принимает как TCP, так и UDP-соединения. Предположим теперь, что сервер разрешает только одному клиенту подключаться; с кем еще не общаться.Принимая как TCP, так и UDP-соединения?

Но как это сделать?

int sock = socket(PF_INET, SOCK_STREAM, 0); 

Как я понимаю, существенная разница в настройке является this--

int sock = socket(PF_INET, SOCK_DGRAM, 0); 

Но как же мне делать то и другое одновременно? Настроить два порта и альтернативное прослушивание для обоих соединений?

ответ

1

Посмотрите на функцию select(). Это позволяет «просматривать» несколько файловых дескрипторов. Подсказка: UDP не имеет подключений, поэтому у вас нет сокета «прослушиватель». Для TCP вы открываете сокет-слушатель, на котором могут быть приняты соединения. Вы можете использовать select() для просмотра сокета «listen».

-1

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

Мой совет - не использовать UDP при отправке важной информации, поскольку это ненадежно и НЕ гарантирует доставку данных, которые вы хотите отправить. Однако, если абсолютно необходимо использовать протоколы TCP и UDP, я предлагаю многопоточность сервера, чтобы он прослушивал оба типа подключений и принимал их оба.

Примечание: Вы заметили, что веб-сайты могут начинаться с http: // и https: //? Назначение - одно и то же, но тип передаваемых данных отличается, и используется другой номер порта (80 для http и 443 для https). Это просто краткое объяснение того, почему вам понадобится сервер для размещения на двух разных портах.

+1

-1 для консультации не использовать UDP вообще и для рекомендации многопоточности (почему бы просто не использовать что-то вроде select?) - возможно, вам нужно просто удалить второй абзац. :-p –

+0

В какой-то степени он прав - мы должны многопоточно это делать. Я просто не беспокоюсь об этом. – Aerovistae

+0

Но мы также должны использовать UDP. Нет выбора. – Aerovistae

Смежные вопросы