2015-01-02 4 views
1

Я немного новичок в виде сокета/сети, так что это может быть глупый вопрос.Несколько локальных процессов имеют один и тот же сокет

Я использую несколько локальных «клиентов» и локальный «сервер», используя протокол AF_INET.

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

Приведенный ниже код демонстрирует проблему независимо от любого кода сервера.

#include <iostream> 
#include <sys/socket.h> 

int main(int argc, char* argv[]) 
{ 
    int sockfd;  // socket file descriptor 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    std::cout<<"socket is "<<sockfd<<std::endl; 

    /* perform various i/o tasks */ 

    return 0; 
} 

Розетка здесь не всегда 3 независимо от того, сколько из этих процессов работает.

Ожидается ли это? Если да, то что может быть лучшим способом заниматься такими вещами, как я хотел бы использовать интернет-протокол, чтобы обеспечить такую ​​же функциональность по локальной сети или в Интернете.

+2

'socket' возвращает дескриптор файла, который по умолчанию всегда исключает процесс. Это нормально и не влияет на количество соединений, которые вы можете выполнить на интерфейсе loopback. –

+0

_ «когда я пытаюсь и всех клиентов на сервере» _? _ "они, кажется, соединяются в одном сокете, делая чтение из одного бессмысленного" _? –

ответ

3

Да, ожидается; file descriptors — по крайней мере, POSIX-совместимый те — будут потрачены на вашей операционную систему на основе каждого процесса:

Вообще, файловый дескриптор является индексом для записи в ядро ​​резидентных структур данных массива, содержащих сведения о открытых файлах. В POSIX эта структура данных называется файловой дескрипторной таблицей, и каждый процесс имеет свою собственную файловую дескрипторную таблицу. Процесс передает дескриптор файла в ядро ​​через системный вызов, и ядро ​​будет обращаться к файлу от имени процесса. Сам процесс не может напрямую считывать или записывать таблицу дескриптора файла.

В Linux набор файловых дескрипторов, открытых в процессе, можно получить через путь/proc/PID/fd /, где PID - это идентификатор процесса.

В Unix-подобных системах файловые дескрипторы могут ссылаться на любой тип файла Unix, названный в файловой системе. Помимо обычных файлов, это включает в себя каталоги, блок и символьные устройства (также называемые «специальные файлы»), сокеты домена Unix и именованные каналы. Файловые дескрипторы также могут ссылаться на другие объекты, которые обычно не существуют в файловой системе, такие как анонимные каналы и сетевые сокеты.

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

  • 0 стандартного ввода
  • 1 STDOUT
  • 2 STDERR

Так первый вы сами спрашиваете, 3.

Вам не нужно беспокоиться об этом вообще. FD 3 на этапе 1100 полностью отличается от FD 3 процесса 1101. Это не вызовет проблем для вашего кода или вашей системы клиент/сервер. Вероятно, вы могли бы просто проверить это.

+0

Это то, что я часто забываю на POSIX, спасибо за напоминание. Похоже, что у меня есть другие несвязанные проблемы, вызывающие мою проблему. – foips

1

Номер, возвращаемый socket, является не номер сокета, это просто непрозрачный указатель в таблице, поддерживаемой ОС и/или языковой версией.Каждый процесс будет иметь свою собственную таблицу, поэтому для этих чисел это нормально, и не о чем беспокоиться.

Вы можете использовать getsockname, чтобы получить расширенную информацию о самом сокете, таком как номер порта.

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