Две сети в программе - PullRequest
       1

Две сети в программе

0 голосов
/ 15 июля 2011

вот ситуация: мне нужно отправить данные соседу (сокету) и затем переключиться в режим прослушивания. У меня есть клиентская часть в client.c, которая просто слушает, а серверная часть в server.c - отправляет данные. При использовании сокетов мне нужно иметь main() в обоих. Как мне заставить их "сотрудничать" вместе, чтобы оба mains s не приводили к ошибке?

Или есть другие идеи, как решить эту проблему с помощью отправки и прослушивания?

Заранее спасибо!

Lucas

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Вы всегда можете создать два исполняемых файла из источников. У каждого из них будет свой main.

Или вы можете создать один исполняемый файл и разрешить ему fork другой процесс или создать другой поток. При создании нового потока вы укажете вторую функцию "main" как функцию потока.

Когда fork -ing, вы должны создать две функции main_server и main_client и позволить фактическому main решить, какую из них вызывать, сразу после fork. Смотри фрагмент:

int main_server(int argc, int argv){
  //TODO: complete
  return 0;
}

int main_client(int argc, int argv){
  //TODO: complete
  return 0;
}

int main(int argc, int argv){
  //TODO: parse args and get argv_server, argv_client, argc_server, argc_client
  int pid = fork();
  if (pid < 0) {
     //TODO: handle error and leave
  } else if (pid) {
     // start client here for example
     main_client(argc_client, argv_client);
  } else {
     main_server(argc_server, argv_server);
     wait(pid);
  }
  return 0;
  /* TODO: each of the above calls should be checked for errors */
}

Надеюсь, это поможет.

Примечание: лучше создать отдельный исполняемый файл, но если вам нужен только один, используйте приведенный выше фрагмент.

1 голос
/ 15 июля 2011

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

0 голосов
/ 15 июля 2011

Другое решение для этого - использование метода select ().Это только для программирования сокетов в среде Linux / Unix.Используя это, вы можете одновременно выполнять задачу отправки и прослушивания в одной функции main ().Вот учебник для этого метода.

http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#selectman

Что он делает, вместо того, чтобы использовать fork (), он помещает все сокеты в read_set.и затем он входит в бесконечный цикл do-while ().Теперь это очень полезно для программирования сокетов в Linux / Unix.Что происходит в Linus / Unix, каждому сокету присваивается дескриптор файла (FD), в который они записывают данные, а затем они передаются.Он рассматривает консоль ввода-вывода как FD.Таким образом, консольный FD помещается в read_set, затем все остальные прослушивающие порты в read_set, а затем ожидает данные от любого из вышеуказанных FD.Поэтому, если у вас есть данные в консоли, он выберет этот FD и выполнит задание, которое вы написали.Или будет в режиме прослушивания, пока вы не закроете программу.

Теперь это лучше, чем вилка (), потому что при использовании fork (), если не обрабатывается должным образом, это может создать бомбу-вилку, котораябудет создавать процессы рекурсивно и будет бомбить вашу основную память.Поэтому лучше создать один процесс и использовать в нем обе функции.

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