2012-06-27 3 views
0

Я пытаюсь написать приложение, которое подключается к нескольким IP-адресам/портам, и проблема, с которой я сталкиваюсь, заключается в том, что количество IP-адресов неизвестно мне, поэтому один отдел может использовать это соединение до 2 ips и другого отдела могут подключаться к 8, поэтому его нужно настраивать во время выполнения, я думаю об использовании потоков или fork внутри цикла, но не уверен, какой из них лучше для работы, надеюсь, что кто-то может направить меня сюда, Я использую C под Linux.TCP-сокет для нескольких IP-портов

Например можно запустить его, как это a.out ip1 port1 ip2 port2 IP3 port3 и другие могут запустить его, как этот a.out a.out ip1 port1

Благодаря

ответ

3

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

  1. 1 Процесс/разъем (вилка): Это имеет то преимущество, что неисправимая ошибка в одном процессе (например, Segfault) не будет влиять на другие процессы. Недостатки включают в себя тот факт, что подход более ресурсоемкий и что процессы сложнее согласовать (например, если вы хотите сделать динамическую балансировку нагрузки).

  2. 1 thread/socket (pthreads): Это имеет то преимущество, что оно довольно светлое, а потоки легко координируются, поскольку они имеют общее пространство памяти. Недостатки включают в себя тот факт, что ошибка в одном потоке может привести к удалению всего вашего приложения.

  3. конечного автомата: Вы можете использовать один поток в одном процессе, который делает огромный poll на всех гнездах, затем принимает право (без блокировки) действие, то есть, read, write или close. Я слышал, что это очень быстро на одном процессоре, однако он не использует многоядерную архитектуру и несколько сложнее программировать.

  4. Гибрид: выберите любой из трех вышеуказанных и объедините их. См. Например, Apache server.

+0

# 2 имеет очень важное значение - он делает программу многопоточной. Это превращает вас в захватывающий мир условий гонки, разрушения данных, блокировок и тупиков. Это необходимо учитывать. – ugoren

+0

Вы имеете в виду, что fd будет делиться между потоками, не так ли? –

+0

@BagDev no. В таких проектах каждый поток получает свой собственный fd (передается ему потоком accept() при подключении клиента) и работает независимо. Чтобы получить проблему с взаимоблокировками и т. Д., Вам нужно будет специально закодировать код. Если сервер просто выполняет запрос/ответ со своим собственным клиентом, он становится блокирующим циклом чтения/записи. Проблемы могут возникнуть, если один клиент-серверный поток хочет связаться с другим fd (например, чатом). Верно, что грубая ошибка в одном потоке (например, дикий указатель) действительно может удалить все приложение, но для этого вам нужно написать действительно плохой код. –

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