2013-06-14 4 views
1

Я собираюсь написать TCP-сервер (Socket-Linux-C). У меня есть три вопроса:Три вопроса для создания TCP-сокета, Linux с C

1) Для того, чтобы узнать, отключена ли сеть (или подключение), воспользуемся ли вы опцией SO_KEEPALIVE?

Например:

int optval = 1; 
socklen_t optlen = sizeof(optval); 

if (setsockopt(file_descriptor,SOL_SOCKET,SO_KEEPALIVE,&optval,optlen)<0) {  
Close(file_descriptor); 
Print_error("setsockopt() failed"); 

2) Я хочу, чтобы мой сервер контактов другой сервер. Как мой сервер знает, выключено ли на удаленном сервере?

3) Я хочу написать параллельный сервер и поэтому я использую fork() для того, чтобы создать ребенка:

3,1) Я должен обрабатывать одновременный доступ к общим переменным, даже если они предназначены только для чтения цели?

3.2) У меня не будет зомби в моем списке процессов ... Может ли этот код быть прав?

void sigchld_h (int signum); 

int main(int argc, char *argv[]){ 
...; 
} 

void sigchld_h (int signum){ 
    pid_t pid; 
    int status; 
    while ((pid = waitpid(-1,&status,WNOHANG)) > 0) 
     printf("(%s) INFO - child %d terminated with exit status %d", nome_programma, pid, status); 
} 

Большое спасибо за консультацию.

+0

Я думаю, что это слишком широкий охват, это не один вопрос (или даже три, как он утверждает). – unwind

ответ

3

Для того чтобы узнать, отключена ли сеть (или подключение), воспользуемся ли вы опцией SO_KEEPALIVE?

Вы можете это сделать. Кроме того, вы можете реализовать собственный механизм «сердцебиения» поверх TCP/IP.

Я хочу, чтобы мой сервер связывался с другим сервером. Как мой сервер знает, выключено ли на удаленном сервере?

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

Я хочу написать параллельный сервер и поэтому я использую вилку() для того, чтобы создать ребенку

Это худшая идея когда-либо в почти каждом случае. Лучший способ сделать это - использовать asynchronous I/O со значительно меньшим количеством потоков.

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

Если вы используете fork(), каждый процесс получает свою собственную копию памяти, которая включает в себя переменные, поэтому синхронизация не требуется. В случае потоков вам не нужно блокировать доступ к постоянной памяти.

У меня не будет зомби в моем списке процессов ... Может ли этот код быть прав?

Нет, вам не позволено звонить printf() из обработчика сигнала. Разрешены только функции асинхронного/повторного ввода.

1
  1. SO_KEEPALIVE поможет вам определить, что данное TCP-соединение мертво, что означает, что другая сторона не имела активности в течение заданного времени (обычно 2 часа). Он также помогает поддерживать простоя TCP-соединений через промежуточные маршрутизаторы, которые могут просто отключить состояние соединения из-за неактивности. См., Например, here для более длинного объяснения.

    Гораздо более полезный и удобный способ узнать состояние вашего подключенного партнера строится периодически heartbeat обмен в протокол уровня приложения.

  2. В этом случае ваш сервер действует как клиент. Подключитесь к удаленному концу и обменивайтесь данными. Вы узнаете, что другая сторона не работает, если вы не можете подключиться или b) получить нулевые байты (изящное закрытие сокета одноранговым узлом), или c) получить сообщение об ошибке send(2), в котором говорится, что канал поврежден. Опять же, удаленный серверный сбой является самым сложным для обнаружения. SO_KEEPALIVE в конечном итоге скажет вам, что есть проблема, но сердечные приступы приложения скажут вам гораздо раньше.

  3. fork(2) - самый тяжелый из инструментов параллелизма, доступных на современном Unix. Проекты, основанные на дочернем процессе на клиентское соединение (и даже поток на соединение), быстро приводят к проблемам с ресурсами и обычно медленны. Исследуйте пулы ниток и неблокирующие розетки наряду с механизмами опроса, такими как select(2), poll(2) и epoll(7).

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