2009-08-22 5 views
0

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

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

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

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

ответ

2

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

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

Для example:

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); 
} 

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

+0

Есть ли способ, имеющий заданный идентификатор сокета (первый параметр send()) данного процесса, отправить его через мое приложение, не выполняя инъекцию dll? –

+0

Итак, чтобы продолжить пример. Если вы хотите отправить «ABC» на каждый прослушивающий порт на вашем компьютере, возьмите этот код и вставьте его в свой цикл. Только увеличивайте PORT вместо того, чтобы пытаться вызвать send с неинициализированным сокетом. Также измените «foobar.com» на «localhost» или на имя любого компьютера, к которому вы хотите подключиться. Также измените выход на простой. Это будет проходить через порт от 0 до 10000, попытаться подключиться к нему, и при успешном соединении отправьте «ABC» (если вы замените argv [1] на «ABC»). Также не забудьте закрыть соединение: close (sd); –

+0

Я не хочу отправлять его на каждый прослушивающий порт. Я хочу отправить его уже созданному соединению приложения X. –

2

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

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

+0

Не могли бы вы немного объяснить, как это работает? Я знаю, что то, что записано в памяти в одном процессе, невозможно получить (по крайней мере, без Write/ReadProcessMemory) другими процессами. Но если, например, я подключаю приложение, использующее сокет, чтобы получить правильный идентификатор сокета, не должен ли он работать, если я попробовал его у себя? Я имею в виду, является ли идентификатор сокета локальным для процесса (находящимся в его памяти) или глобальным, находящимся в общей памяти Windows? –

0

Таким образом, на основе ваших ответов на других людей ...

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

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

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

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

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