2009-08-22 23 views
0

これはうまくいかない理由はありますか?ソケットお問い合わせ

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

は、私たちは異なるソケットの多くによって理論的には渡していない、0から10000までのすべての数によって、「ABC」を送信するために、意味ですか? 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); 
} 

コインの反対側には、接続を受信するリスニングソケットを(何をすべきかのサーバー)を作成することです。プロセスは似ていますが、呼び出しは変更され、socket()、bind()、listen()、accept()です。それでも、自分のプロセスでファイル記述子を取得するためのソケットを作成し、どこでリッスンしたいかを知る必要があります。他の人に自分の回答に基づいて、だから、

+0

与えられたプロセスの特定のソケットID(send()の最初のパラメータ)を持って、DLLの注入を行うことなくアプリケーションから送信できますか? –

+0

例を続行してください。マシンのすべてのリスニングポートに "ABC"を送信したい場合は、そのコードをループに貼り付けてください。初期化されていないソケットでsendを呼び出すのではなく、PORTだけをインクリメントしてください。また、 "foobar.com"を "localhost"に変更するか、接続するマシンの名前を変更してください。また、出口を単純なものに変更します。それはポート0から10000までループし、接続しようとし、成功した接続では "ABC"を送信します(argv [1]を "ABC"に置き換えると仮定します)。また、接続を閉じることを忘れないでください:close(sd); –

+0

すべてのリスニングポートに送信したくありません。私はアプリケーションXの既に作成された接続にそれを送ろうとしています。 –

2

これは機能しません。プロセス内のファイル記述子0は、他のアプリケーションのプロセスではファイル記述子0にアクセスできません。

あなたの次の質問に答えるには:ソケットIDは各プロセスのローカルです。それらはファイル記述子のように多く動作します。一度に多くのプロセスが実行されます。もちろん、オペレーティングシステムは、どのプロセスにどのファイルが開いているかを把握しています。しかし、各プロセス内では、ファイル記述子 0,1および2はそれぞれ独自のプライベート、stdin、stdout、およびstderrストリームを参照します。 ソケットが作成されると、そのソケットに割り当てられているファイル記述子にも、そのプロセス内からのみアクセスできます。

+0

実際にどのように機能するのか少し説明してください。あるプロセスでメモリに書き込まれたものは、他のプロセスによって(少なくともWrite/ReadProcessMemoryなしで)アクセスすることはできません。しかし、例えば私が正しいソケットIDを取得するためにソケットを使用しているアプリケーションをフックする場合、私が私からそれを試してもうまくいかないでしょうか?つまり、ソケットIDはプロセスのローカル(そのメモリに常駐している)か、グローバルか、共有されたウィンドウメモリ内にあるのでしょうか? –

0

、...

あなたがプログラムのどこかで実行することができ、いくつかの他のプログラムB、へのソケット接続をオープンしたマシン上で実行しています。しかし、これらのプログラムのどちらもあなたがここで書くことを試みているものではありません。プログラムAのソケット接続を介してプログラムBにデータを送信できるようにしたいと考えています。

これはおおよそ実行しようとしている場合、おそらく実行できません。少なくともプログラムAのプロセスに入るためにはdll注入は必要ありません。

さらに、プログラムAのソケットを送信する方法が見つかったとしても、プログラムAの通信プロトコルの詳細を知る必要がありますとBが使用しています。もしあなたがそうしなければ、予期しないプログラムBにデータを送るリスクを冒すでしょう。その場合、それは書かれた方法に応じて接続を切断したり、クラッシュしたり、 。

あなたが本当に単一のプログラムAだけでなく、ソケット接続が開いているコンピュータ上のすべてのプログラムを通じて特定のデータを送信しようとしている場合は、今説明したことに遭遇する可能性が非常に高いです。送信したいデータがある特定のプログラムで動作しても、他のプログラムはほとんど完全に異なる通信プロトコルを使用しているため、データの処理に問題が発生する可能性があります。

あなたが本当に達成しようとしていることを知らずに、あなたの目標が単に複雑で時間のかかるものになるかどうか、やろうとしている。しかし、それが何であれ、私は、別のプログラムのソケットを介してデータを送信しようとするよりも、違ったやり方を見つけることをお勧めします。

関連する問題