• 締切済み

一般的なソケット通信プログラム

ソケットを用いてシステムを考えておりまして、設計に悩んでおります。まだ知識がないもので、情報をいただければと思っております。 まず基本的にはサーバ1に対してクライアントはN台を考えております。サーバからクライアントに対して、メッセージを送信し、それに応じてクライアントで処理を行います。メッセージ数(クライアントの処理の数)は今のところ3種類を考えてます。 そこで、一般的にはどのようにするのが普通なのかということをまず知りたいのですが、これだけで何か情報をいただけないでしょうか。 いろいろ情報をいただければと思っております。よろしくお願いします。

みんなの回答

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

No.1 の回答が > コネクションを確立させるプロセスと実際に送信するプロセスを別にする場合 の手順、そのままですけど? もっとも、UNIX系列のOS前堤の話なので、そうじゃないならシステムを明らかにする必要がありますね。

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.1

基本的な流れを説明します。 サーバ側は socket() ~ bind() ~ listen() してaccept() ループに入ります。 accept() から帰ったら fork() して子はリクエストを処理して exit() し、親はディスクリプタをclose()してからループを継続して再度 accept() に戻ります。 fork()の代わりにMTを用いてもよいでしょう。 クライアント側は socket() ~ connect() してから通信を行います。終わったら close() しましょう。 以上の説明が分からなければ、、、専門の書籍を参照された方がよいと思います。残念ながらここに書ききれるような情報ではありません。

hiko758
質問者

補足

ありがとうございます。 書籍等も見ながらやっているんですが、一般的にシステムで利用するときには、コネクション型で通信を行うのが普通なのでしょうか。 もしコネクション型でする場合、コネクションを確立させるプロセスと実際に送信するプロセスを別にする場合、どのようにすればよろしいのでしょうか。 よろしくお願いいたします。

関連するQ&A

  • ソケット通信でチャットプログラム(unix c言語)

    c言語のソケット通信でチャットプログラムを作り中です 仕様:あるクライアントからメッセージがサーバに送信された時点でサーバは接続されたいる全てのクライアントにメッセージを送信する。 以下のようにクライアントからの接続(accept)がある度に、その返り値であるファイルディスクリプタにに対するreadと全クライアントに対するwriteの処理を行うchild関数をforkで起動します。これだとforkが起動した時点での全てのファイルディスクリプタ(接続されている全クライアント)の情報をchild関数に渡せますが、それ以降増え続けていくファイルディスクリプタの情報をchild関数に渡せないので、最初の方に接続したクライアントからのメッセージをそれ以降接続した他のクライアントに送信できないという状態です。 main() {   socket()   bind()   listen()     while(1){       accept()       if(fork()==0) {        child()       }     } } child() {   select()   if(FD_ISSET()) {     read()     write()   } } ※forkやソケット通信に関してかなり初心者なので、ソースや説明分が意味不明かもしれませんがよろしくお願いします。

  • ソケット通信について

    VC++6.0MFCでソケット通信のプログラムを作成しようとしています。勉強始めたばかりなので、やっと普通に通信するプログラムは理解できたところです。 そこで応用していろいろ考えているのですが、方法がわからないところがありますので教えていただければと思ってます。 サーバ側の接続待ちはいつでも受けれるようにして、接続してきたクライアントに対して送信したいと考えております。ソケットの接続情報を保持しておいて、別プロセスの送信プログラムが接続クライアントに対して送信したいと考えてます。その送信プログラムが複数ある場合も同じ接続情報を利用したいと考えてるのですが、可能でしょうか。 説明が下手で申し訳ありません。補足はいたしますので、アドバイスお願いいたします。

  • ソケット通信の送受信遅延

    MFCのCAsyncSockを使ってクライアントとサーバでメッセージの送受信をしています サーバからsend()でメッセージを送信し クライアントはOnReceive()の中でreceive()し メッセージを受信後、応答をsend()で返信します これを10msec間隔で行っているのですが ランダムに送信か受信で300msec前後の遅延が発生します なぜでしょうか? ちなみにソケットオプションで「TCP_NODELAY」を設定しています かなり困っています 気になることでも何でもいいので是非アドバイスをお願いします

  • c# ソケット非同期通信プログラム

    C#でソケット非同期通信プログラムを作りたいと思い勉強しております。ちなみにソケット通信はc言語ではやっておりました。 今作りたいと思ってるプログラム ・ラジオボタンで接続形態(サーバー・クライアント)を選択。 ・送信ボタンを押した時は送信 ・受信した時は受信データをテキストボックスに表示 ・コネクション数は1つで送受信を行う お手数ではございますが、参考になる様なサイトやアドバイス等があれば宜しくお願い致します。

  • ソケット通信について

    自分はJAVAで、クライアント・サーバ形式の ネットワークゲームを作ろうとしているのですが、 チャットシステムで BufferedReader NetInput; // ネットワーク経由入力ストリーム PrintStream NetOutput; // ネットワーク経由出力ストリーム Socket socket; // ソケット ChatServer chatserver; // ChatServerオブジェクト int clientnumber; // クライアント番号 ChatClient(Socket socket, ChatServer chatserver, int clientnumber) { this.socket = socket; this.chatserver = chatserver; this.clientnumber = clientnumber; try { InputStream inputstream = socket.getInputStream( ); NetInput = new BufferedReader(new InputStreamReader(inputstream)); OutputStream outputstream = socket.getOutputStream( ); NetOutput = new PrintStream(outputstream); } catch(Exception e) { System.out.println("->" + e); } } // メッセージ送信 ------------------------ synchronized void sendMessage(String message) { NetOutput.println(message); // サーバからクライアントに送信 NetOutput.flush( ); } とString型の文字列messageを送受信し合う様に、 int型の配列や、boolean型の配列を送受信する方法があったら 教えていただきたいです。

  • C#でソケット通信

    初歩的な質問ですみません。 クラアント側とサーバー側にそれぞれC#で作ったプログラムをインストールし、 クライアントからサーバーにデータを繰り返し送信したいとき、 そのプログラム内でソケット接続して送ることはできるでしょうか? できるとして、どのような手順でソケット接続し、データを送ればいいのでしょうか? まったくの初心者です。 よろしくお願いします。

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • ソケットを使ってメッセージを回す

    ソケットを使ってメッセージをリング状に回す通信を考えています。クライアントを一台指定し、サーバを複数立ち上げます。クライアントからメッセージを受け取ったサーバが別のサーバに送ることができません。その時BindExceptionError Address Already in use.とエラー表示されます。ソケット通信で、別のIPとポート番号を新しく生成して送ることができないのでしょうか。プログラム等を記述してもらえたら幸いです。どうかよろしくお願いします。

  • UDP通信での受信方法について

    MFCでUDPプロトコルを使ったサーバー・クライアントをソケットプログラムで書いております。 ソフトの内容は、クライアントから送信されたの文字列のコマンドをサーバで処理をするだけです。 サーバー側での受信の仕方は WSAAsyncSelect()関数を使ってソケットイベントが発生するごとに親ウィンドウに自作のメッセージ(WM_MY_MSG)が送られるように設定する ↓ WM_MY_MSGのメッセージハンドラ内でrecvfrom()関数を使って受信する。 という方法を用いています。クライアント2台ぐらいであれば正常に動きます。 質問1: まだ試したことはないのですが(というより試す環境がない)、ほぼ同時ぐらいに複数(10台ぐらい)のクライアントからコマンドが送信された場合、それを全部正確に受信できるものなのでしょうか?要するに一つのコマンドを処理中に別のコマンドが送られてきた場合の動作はどうなるのでしょうか? 質問2: UDP通信での受信をする場合の何かもっとスタンダードな方法があるのでしょうか? よろしくお願いします。

  • ソケット:書き出しをソケット経由で読み込みできない

    お世話になります。 今、Javaでのソケットプログラミングについて学習をはじめて、はじめてのサンプルプログラムが失敗しました。 そこでもうちょっと簡単にしてみたのですが(一部の抜粋が以下のソースです)、またまたうまくいきません。 エコーサーバのテストなのですが、client : after send messageと表示されたところで処理が止まってしまいます。 結果は最下位に貼り付けてあります。 どうかよろしくお願いします。 // reader/writerの取得 BufferedWriter clientWriter = new BufferedWriter( new OutputStreamWriter(sockClient.getOutputStream()), BUFFERSIZE); BufferedReader clientReader = new BufferedReader( new InputStreamReader(sockClient.getInputStream()), BUFFERSIZE); BufferedWriter serverWriter = new BufferedWriter( new OutputStreamWriter(sockServer.getOutputStream()), BUFFERSIZE); BufferedReader serverReader = new BufferedReader( new InputStreamReader(sockServer.getInputStream()), BUFFERSIZE); // サーバのローカルとクライアントの接続先が同じことの確認 System.out.println("client port : " + sockClient.getPort()); System.out.println("client addr : " + sockClient.getInetAddress().getHostAddress()); System.out.println("server port : " + sockServer.getLocalPort()); System.out.println("server addr : " + sockServer.getLocalAddress().getHostAddress()); // クライアント→サーバー→クライアントの順にmaaaaaいうえおを送信 String strMessage = "maaaaaいうえお"; System.out.println("client : send message : " + strMessage); clientWriter.write(strMessage); System.out.println("client : after send message"); String msgGet = serverReader.readLine(); System.out.println("server : got : " + msgGet); serverWriter.write(msgGet); System.out.println("client : got : " + clientReader.readLine()); ------------以下が結果------------- client port : 4544 client addr : 127.0.0.1 server port : 4544 server addr : 127.0.0.1 client : send message : maaaaaいうえお client : after send message

    • ベストアンサー
    • Java

専門家に質問してみよう