C言語でサーバープログラムを作る方法とは?

このQ&Aのポイント
  • C言語でサーバープログラムを作ろうと思っている方に、構造やデータの送信方法についての質問です。
  • Webサーバを例に挙げて、HTTPプロトコルにおけるデータの送信方法を説明しました。
  • 他のクライアントが同時にリクエストを送った場合のデータの送信方法についても疑問を持っているようです。
回答を見る
  • ベストアンサー

サーバープログラム

C言語でサーバープログラムを作ろうと思っているのですが まだ、一行も書いてない(書けないですが) 構造がよくわからないのです。 例えばWebサーバで言うと Apacheなどが有名ですが、HTTPプロトコル(正確にはHTTプロトコルですが)で、 データを5回にわけて送信するとき Cをクライアント、Sをサーバとすると C >>> S リクエスト S >>> C データ1 ... S >>> C データ5 ですが、途中で他のクライアントが来た場合 C1 >>> S リクエスト S >>> C1 データ1 S >>> C1 データ2 C2 >>> S リクエスト S >>> C1 データ3 S >>> C2 データ1 S >>> C1 ...データ5 S >>> C2 ...データ5 とこのように交互に送信されるのでしょうか? それともデータ送信中のリクエストは後回しにして C1へ全部送りきってからC2へ送るのでしょうか? わかりにくくてすみません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> データを5回にわけて送信するとき ひょっとして、パケットの分割のことを仰っていますか? パケットはもっと下のレイヤーで分割されるので、サーバプログラムで意識することはありません。 ご質問の例が1Requestに限られていますが、Requestも複数パケットに分割されることがあるのはご存知と思います。下位層では全てのパケットを受信した後にアプリケーション層にそれらを1Requestとして通知します。 同様に、Responseも1Responseが電文としては複数パケットに分割されますが、アプリケーション層での基本は1Request/1Responseです。

knoppixer
質問者

お礼

回答ありがとうございます。 Etherealでパケットを見ていてパケットは複数回に わかれて送受信されているからサーバはそれに 対応しないといけないと、すごい勘違いをしていたみたいです。 ありがとうございました。

関連するQ&A

  • HTTPサーバプログラム

    C言語でHTTPサーバを作ろうとしています。 大方動くのですが、Java Applet(Jarファイル)を埋め込んだWebページをクライアント側のブラウザに表示させようとすると、エラー(ClassNotFoundError)が発生してしまいます。 ※GIFファイルなどの表示はうまく動いています。 パケットキャプチャソフトなどを活用して色々調べてみると、サーバ側からクライアント側へJarデータを送信する処理が上手く動いていないようです。 今のHTTPサーバの制約で、データ送信関数で一度に送信できるサイズが32KB程度になっています。 Jarファイルがこの最大サイズ(32KB)以下であれば問題なくクライアント側でJava Appletが起動するのですが、このサイズを超えるJarファイルの場合に先のエラーが発生してしまいます。 ※例えばJarファイルサイズが50KBの場合は、データ送信関数を2度呼び出す処理になります(1回目は32KB送信、2回目は残りの18KBを送信します)。 パケットキャプチャソフトでデータの流れを確認すると、50KBのJarファイル・データはクライアント側へちゃんと送信されているように見えるのですが、Jarファイル・データがクライアント側へ送信された後、(恐らく、クライアント側でJarファイルが正しく受信されなかったと認識されているため)クライアント側はClassファイルをサーバ側へリクエストしに行っています。 ※<applet archive="test.jar" code="test.class">としている場合は、"test.jar"ファイルのデータ送信後、クライアント側から"test.class"をサーバ側へリクエストしに行っています。 50KB程度のGIFファイルなどは、分割送信処理を用いてちゃんとクライアント側のブラウザで表示できているのですが…Jarファイルはなぜ上手くいかないのか分かりません。 Jarファイル・データ送信時には何か特別な制約があるのでしょうか? どなたか詳しい方がおられましたらお教えいただきたく存じます。

  • DBサーバー(A)とDBサーバー(B)を双方向のバッチ処理で更新させよ

    DBサーバー(A)とDBサーバー(B)を双方向のバッチ処理で更新させようと思っています。 ですが、そもそもAのDBからBのDBにデータを送るにはどうしたら良いかがわかりません。 httpプロトコルでバッチ処理をやることになっているのですが、 サーバーが違うしWEB SessionやHTTP リクエストを受け取れるのだろうか? そもそも大量のデータを一括で遅れるのだろうかと疑問があります。 HTTPリクエストだと「アドレス?パラメータ」の形でデータを送信して 受けとるというのがスタンダードなやり方ですが、大量のデータは難しいと思ってしまいます。 こういった形でデータ授受を行う場合、 ロジック的にはどういうふうになるのでしょうか。 またhttpプロトコルで大量のデータを送るにはどうすれば良いのでしょうか。

    • ベストアンサー
    • Java
  • apacheのrequest_recについてです。

    お世話になってます。 最近C言語でapache モジュールを触り始めました。 開幕躓いたので質問をしにきました。。。orz apache request_recについて質問です。 apacheのrequest_recからURLのプロトコルの部分を 取得するのは、可能でしょうか? request_recから「protocol」で「HTTP1.1」の ような値は取得できたのですが、実際に取得したいのは 「http://www.google.co.jp/」の「http」の部分です。 (できればURLすべて取得できたらうれしいです) どなたかご教授願えると助かります。

  • Proxyサーバの提供するプロトコルについて

    【Proxyサーバの提供するプロトコルについて】 公開Proxyサーバのアドレスをネットでよく見るんですが、 ***.***.****.****:8080(←待ち受けポート)こんな風に書いてあります。 これはクライアントPCからの要求はFTPもHTTPもPOPなども全てこのProxyサーバは 8080の1つのポートで待ち受けるのでしょうか? それとも8080とだけ書かれているProxyサーバはHTTP(WEB)だけしかアプリケーションデータを 見ませんよって意味ですか? 勘違いしていたらすみません。ご教授のほどよろしくお願い致します。

  • Proxyの動作について

    初歩的なことだとは思うのですが、お知恵をお貸しください。 Proxyを挟んだ場合、クライアント端末-Proxy-Webサーバ間でどのような処理の流れになるかを調べているのですが、 TCPDUMPで確認したところクライアントからのHTTPプロトコルが確認できず、クライアント端末とProxyサーバ間では3WAYハンドシェークしか行っていない様でした。 当初はクライアントからのHTTPリクエストをProxyサーバが受け、ProxyサーバがWebにさらにリクエストをし、、、という流れを行うと考えていたのですが、 実際のところとしてProxyサーバをはさんだ場合の一連の流れとしてはどのようになるのでしょうか? クライアント端末とProxyサーバは同一セグメント内に設置している構成です。 よろしくお願いします。

  • HTTPリクエスト

    JSPのクライアントからサーブレットにHTTPリクエストを送信する部分について、質問させていただきたく思います。 [実現したいこと] ・クライアント側からのHTTPリクエストのヘッダの内容を、任意のものに書き換えてサーブレットに送信。 [環境] WEB APサーバー:Web Sphere Aprication Server HTTPヘッダを読み取って、ヘッダ内のクライアント情報を元にクライアント別の処理を振り分ける機能を作ったのですが、そこの機能をテストするのに上の機能を使いたいと思ってます。。。 皆様のお知恵を拝借できればと思います。 よろしくお願いいたします。

  • C言語でHTTP1.1のキープアライブを使用したい

    ご存知であればお知恵を貸してください。 C言語のソケットプログラムで、HTTP1.1のキープアライブを有効にする方法を調べています。 経緯としては、Unix(SystemV系)のC言語でHTTPクライアントを作成しました。 GET(またはPOST)メソッドのHTTPリクエストを発行して、そのレスポンスをコンソールに表示するような一般的なソケットプログラムです。 (socket() → connect() → send() → recv()と言った流れです) 連続してリクエストする場合があるので、connect()で作成したコネクションをプログラム中で使用し続けたいのですが、一度のリクエスト、レスポンスでコネクションが切断されてしまいます。(HTTPの仕様) HTTP1.1で定義されているキープアライブを使用すればよいと考え、ソースコードにおいて以下の対応を追加しました。 ・setsockopt()でSO_KEEPALIVEを有効にする。(socket()とconnect()の間で呼び出し) ・送信するHTTPヘッダのプロトコルバージョンを1.1として、Host:ホスト名、Connection: Keep-Aliveを設定 HTTP1.1でキープアライブを有効にしている自宅のApache2.2がターゲットなのですが、上記対応後もコネクションが切断されてしまいます。 Apacheについては、環境変数の出力結果からHTTP1.1でキープアライブが有効になっていることは確認済みです。 HTTPクライアントプログラムについては、都度コネクションを張れば問題なく動作するので基本部分は間違っていないと考えています。 HTTPクライアントプログラムで、キープアライブを有効にするための何かが欠けているのだと推測しているのですが、どなたか何かお気づきのことはございませんでしょうか? #手元にソースコードがないために、掲載できないので漠然とした質問になってしまいました。すみません。

  • サーバーから時間がきたらメールを送るプログラム

    独学プログラマーです。 レンタルサーバーを利用して簡単な社内向けシステムを作っています。 今回、例えば10時になったら社員数名にメールを自動で送るというシステムを作りたいと思います。 現在、「送信ボタン」みたいなのを押せば自動でメール内容を生成し送信することはできます。 さて、クライアントになるパソコンがその時に立ち上がっていない可能性があるという前提で、レンタルサーバー内でphpに自動でリクエストをできる方法はないでしょうか?

  • HTTPとFTPの違い

    vectorなどのソフトをダウンロードするときHTTPダウンロードとFTPダウンロードを選んでダウンロードしますが、 HTTPダウンロードの場合はHTTPプロトコルでwwwサーバとやりとりをして、その後wwwサーバがデータベースサーバに問い合わせをして、目的のデータをwwwサーバーに返しクライアントに80番ポートで転送するのでしょうか? またFTPダウンロードの場合はFTPプロトコルでanonymous認証してからFTPサーバとやりとりをして、その後FTPサーバがデータベースサーバに問い合わせをして目的のデータをwwwサーバに返しクライアントに20番ポートでデータを転送してるのでしょうか? ちょっとわからなくなったので、間違えていたら教えて下さい。 よろしくお願いします。

  • UDPを使って帯域測定プログラムを作りたいのですが

    Java eclipse3.5を使っています。 UDP通信を使って帯域測定プログラムを作りたいと思っています。 動作の流れは、 1.クライアント側で送信データ(1MB,5MB,10MBのバイト)を作成し、それをサーバに送信する。 2.サーバ側では、送られた各データを受け取る(読み取る?)時間をそれぞれ計測し、計測時間をクライアント側に送信する。 3.クライアント側で、送信データ÷計測時間で通信速度を計算する。 4.それを表示する。 という感じにしたいと考えています。 頭では、こうしたいという構造はあるのですが、プログラムを書くとなると、どう書けばよいか分かりません。 どなたか、アドバイスをいただけないでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう