これは決してうまくいかないでしょう。ファイル記述子は、同じプロセス(およびその子プロセス)内でのみ有効です。
ソケットを作成する必要があります(これは所有して使用できるファイル記述子を取得します)、それをエンドポイントに接続します(もちろん開かれていなければなりません)。それ。 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()です。それでも、自分のプロセスでファイル記述子を取得するためのソケットを作成し、どこでリッスンしたいかを知る必要があります。他の人に自分の回答に基づいて、だから、
与えられたプロセスの特定のソケットID(send()の最初のパラメータ)を持って、DLLの注入を行うことなくアプリケーションから送信できますか? –
例を続行してください。マシンのすべてのリスニングポートに "ABC"を送信したい場合は、そのコードをループに貼り付けてください。初期化されていないソケットでsendを呼び出すのではなく、PORTだけをインクリメントしてください。また、 "foobar.com"を "localhost"に変更するか、接続するマシンの名前を変更してください。また、出口を単純なものに変更します。それはポート0から10000までループし、接続しようとし、成功した接続では "ABC"を送信します(argv [1]を "ABC"に置き換えると仮定します)。また、接続を閉じることを忘れないでください:close(sd); –
すべてのリスニングポートに送信したくありません。私はアプリケーションXの既に作成された接続にそれを送ろうとしています。 –