Socket отправить вопрос - PullRequest
0 голосов
/ 22 августа 2009

Есть ли причина, по которой это не должно работать?

[PseudoCode]
    main() {
       for (int i = 0; i < 10000; ++i) {
          send(i, "abc", 3, 0);
       }
    }

Я имею в виду, что для отправки «abc» через каждое число от 0 до 10000, разве мы не передаем в теории множество разных сокетов? Большинство чисел от 0 до 10000 не будут соответствовать ни одному из сокетов, но некоторые будут. Это правильно?

edit: желаемой целью является отправка «abc» через каждое приложение с открытым сокетом.

Ответы [ 3 ]

2 голосов
/ 22 августа 2009

Это никогда не сработает. Файловые дескрипторы полезны только в рамках одного и того же процесса (и его дочерних элементов).

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

Для Пример :

struct sockaddr_in pin;
struct hostent *hp;

/* go find out about the desired host machine */
if ((hp = gethostbyname("foobar.com")) == 0) {
    exit(1);
}

/* fill in the socket structure with host information */
memset(&pin, 0, sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
pin.sin_port = htons(PORT);

/* grab an Internet domain socket: sd is the file descriptor */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    exit(1);
}

/* connect to PORT on HOST */
if (connect(sd,(struct sockaddr *)  &pin, sizeof(pin)) == -1) {
    exit(1);
}

/* send a message to the server PORT on machine HOST */
if (send(sd, argv[1], strlen(argv[1]), 0) == -1) {
    exit(1);
}

Другая сторона медали заключается в создании прослушивающего сокета (что делают серверы), который будет принимать соединения. Процесс похож, но вызовы меняются, это socket (), bind (), listen (), accept (). Тем не менее, вам нужно создать сокет, чтобы получить дескриптор файла в вашем собственном процессе и знать, куда вы хотите слушать или подключиться.

2 голосов
/ 22 августа 2009

Это не сработает. Файловый дескриптор 0 в вашем процессе не даст вам доступа к файловому дескриптору 0 в процессе другого приложения.

Чтобы ответить на ваши дополнительные вопросы: идентификаторы сокетов являются локальными для каждого процесса. Они ведут себя во многом как файловые дескрипторы - одновременно выполняется много процессов, и, конечно, операционная система отслеживает, у какого процесса какие файлы открыты. Но внутри каждого процесса файловые дескрипторы 0, 1 и 2 будут ссылаться на собственные потоки private, stdin, stdout и stderr соответственно. Когда сокет создан, дескриптор файла, которому он назначен, также доступен только из этого процесса.

0 голосов
/ 22 августа 2009

Итак, основываясь на ваших ответах другим людям ...

На вашем компьютере запущена программа A, которая открыла сокетное соединение с какой-либо другой программой B, которая может работать где угодно. Но ни одна из этих программ не является той, которую вы пытаетесь написать здесь. И поэтому вы хотите, чтобы ваша программа могла отправлять данные через соединение через сокет программы A с программой B.

Если это примерно то, что вы пытаетесь сделать, то нет, вы, вероятно, не можете этого сделать. По крайней мере, не без DLL-инъекции, чтобы попасть в процесс программы А.

Кроме того, даже если бы вы могли найти способ отправки через сокет программы A, вам нужно было бы знать точные детали протокола связи, который используют программы A и B. Если вы этого не сделаете, вы рискуете отправить данные в программу B, чего они не ожидают, и в этом случае это может привести к разрыву соединения, падению или выполнению любого количества плохих действий в зависимости от того, как они были записаны. .

И если вы действительно пытаетесь отправить определенный фрагмент данных не только через одну программу A, но и через каждую программу на компьютере с открытым соединением через сокет, то вы, скорее всего, столкнетесь с тем, что я только что описал. Даже если данные, которые вы хотите отправить, будут работать для одной конкретной программы, другие программы почти наверняка используют совершенно другие протоколы связи и, следовательно, скорее всего будут иметь проблемы с обработкой ваших данных.

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

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