• 締切済み

C言語でソケットを使った通信をやっているのですが、ファイル転送で…

C言語でwinsockを使いファイル転送をしたいのですが、 パケットでやりとりをしたいと考えています。 パケットの構成を調べたのですが、いろいろ細かくてよくわかりません。サーバーとクライアントのシーケンス図を書きたいのですが、どんな感じになるのですか。パケットとシーケンス図についてアドバイスお願いいたします。

みんなの回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

TCPの通信アプリをよく書く者です。 TCPのソケット通信では、TCPパケットの構成は気にする必要がありません。 =TCPヘッダの構成は気にする必要がありません。 普段仕事ではこんなノリでシーケンス図を描いてます。 (だいぶはしょってますが) ・クライアント       ・サーバ |             |ソケット作成 |ソケット作成       | |Connect          | |-------------|Accept |ファイルサイズ送信    | |-------------|サイズ受信 |ファイル送信       | |-------------|データ受信 |ソケット切断       |ソケット切断 TCPのSynとかAckを描いたシーケンス図は、TCPの解説本などに 任せてしまうものだと思っています。 上記の図で、たとえば自前実装の認証などがある場合、それは書きます。 あくまでTCP層のパケットは書かないのです。 # 上図ではサイズ送信も冗長ですが、雰囲気を出すために入れてみました。

zoo_k2940
質問者

お礼

丁寧な回答ありがとうございます。 書いていただいたシーケンス図を参考に 自分でも書いてみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

socket プログラミング でネットを検索してください。 多くはLinuxなどのUNIX系の例ですが、先人が作成されたサンプル例が見つかります。 ここでの一問一答で初心者さんに教えられるほど簡単な内容ではありませんので、まずそちらを見ることをお奨めします。 ただ、できればTCP/IPネットワーキングの知識の方を先に書籍などで得ておいたほうがいいかと思います。

zoo_k2940
質問者

お礼

アドバイスありがとうございます。 調べてみます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>パケットでやりとりをしたいと考えています。 UDPですか? TCPの場合はストリームになりますので、「パケット」という概念は不要ですが。 TCP/IP以外を使う…ということでしょうか?

zoo_k2940
質問者

補足

TCPの場合なのですが… 初心者なので言葉足らずな質問ですみません。 引き続き関連事項のヒント・アドバイス等 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Winsockの通信処理にてファイル転送方法?

    環境:Windows2000とUNIXサーバ 開発:VisualStadioVer6.0 言語:C言語 やりたいこと:    クライアントからサーバにファイル送信を行う。 ただし、FTP通信を使わないで、別ポートにて、Winsockの send等でFTPもどきのファイル送信を行いたい。 ソケット通信はデータ送信なのは知っているのですが、 どうしても実現したいので、知ってる方は教えてください。

  • TCPによるファイル転送

    質問です。よろしくお願いします。 いま、winsockでクライアントからサーバにバイナリファイルを転送するプログラムを組んでいます。内容は、サーバ側を待機の状態にし、クライアントからの要求があった時点で新たにソケットを作ってそこからデータのやり取りをするというものです。 しかし、ソケットを使った通信がサーバからクライアントの一方通行になってしまっていて、データを送ることが出来ません。(クライアントから送ったデータは0になっているようにも思われます) ソケットは一方通行なのでしょうか?参考にしている本のサンプルではお互いにやり取りをしていたと思うので、そのようなことはないと思うのですが・・・。 内容分かりにくければご質問ください。 回答お待ちしています。

  • 異なる言語間でのソケット通信について

    簡単なネットワークプログラムを作成して、ソケット通信の確認をしています。 クライアントとサーバが両方ともにC++の場合と、両方ともにJavaの場合で、正常に通信が行われていることは確認しました。 そこで、クライアントでC++のプログラムを動かし、サーバでJavaのプログラムを動かしてみたのですが、うまくいきませんでした。 (ポート番号を合わせたので、相互接続は出来てるみたいですが、データが渡ってきませんでした。OSはクライアント/サーバともに、Windowsです。) 言語が異なる場合の、ソケット通信について良いサイトをご存知でしたら、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • C言語でのソケット通信のclose

    C言語でソケット通信をするプログラムの見本は、大体がサーバのプログラム内でサーバとクライアントのファイルディスクリプタを、クライアントのプログラム内でクライアントのファイルディスクリプタをcloseしてから終了しています。 でも、プログラムを終了させる時にopenしているファイルディスクリプタは自動的にcloseされるのだから、わざわざ明示的にcloseする必要がないと思います。 「明示的にcloseするのがマナーだから」という理由しか、調べても出てきませんでした。 明示的に全てのファイルディスクリプタをcloseする理由をご存知の方、教えてください。

  • Java(クライアント)とC言語(サーバ)間のソケット通信 サーバ再起動時のbindエラー

    サーバ側がC言語(Linux)、クライアント側がJavaのソケット通信プログラムを書いているのですが、いきなりつまづいてしまったため質問失礼します。 ソースとしては以下の2つのソースをテストとして利用させて頂きました。 ローカルネットワーク内の2台にそれぞれを設置し、それにあわせてIPとポートは変更してあります。 http://www.aihara.co.jp/~junt/program/socket/inet_server.c http://www.hellohiro.com/src/HelloWorldSocketClient.java サーバプログラムを少し変更し(http://oshiete1.goo.ne.jp/qa5565926.html)、サーバ起動→クライアント起動でサーバクライアント間通信を行えることを確認しました。 しかし、もう一度テストしてみようと直後にサーバプログラムを起動すると、bindでエラーを吐いてしまい接続待機状態にできませんでした。 少し待ってから起動したりポートを変えて実行すると正常に待機状態にできるため、プログラム終了時のソケットのクロージングが正常に行われずポートの競合が起きていることが原因だとは思うのですが、ソケットのcloseはサーバもクライアントも書いてあるため自分には解決方法が思いつきませんでした。 ちなみに、サーバプログラムのソースと併せて公開されているC言語クライアントプログラムを用いた場合は再起動してもbindエラーが出ることはありませんでした。 この問題の原因と考えられることと解決案をアドバイス願えませんでしょうか。よろしくお願いします。 以下、開発環境です。 ■C言語 OS:Fedora 12 エディタ:一応VisualC++2008(Linux用に書いているので実質ただのテキストエディタ) コンパイラ:標準gcc ■Java OS:Windows XP SP3 エディタ・コンパイラ:eclipse ※実装先の都合上、winsockによるサーバに変えるや言語の変更はできません。

  • winsockでファイル転送

    教えてください。 windockを使いファイルをサーバ側からクライアント側に転送したいのですが、テキストファイルfgetsで一行ずつ読み込んで、それをsendで転送し、クライアントでrecvで読み取り、テキストファイルに書き出す。 という一連の流れより、もっと簡単に、ファイルを転送する方法又はMFCの関数等ありますか? [環境] visual C++ 6.0 MFC

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • Java(クライアント)とC言語(サーバ)間のソケット通信 文字列送受信の不具合

    サーバ側がC言語(Linux)、クライアント側がJavaのソケット通信プログラムを書いているのですが、いきなりつまづいてしまったため質問失礼します。 ソースとしては以下の2つのソースをテストとして利用させて頂きました。 ローカルネットワーク内の2台にそれぞれを設置し、それにあわせてIPとポートは変更してあります。 http://www.aihara.co.jp/~junt/program/socket/inet_server.c http://www.hellohiro.com/src/HelloWorldSocketClient.java クライアントのJavaプログラムから"Hello World"をサーバのCプログラムに送ると"Hello World"とは標準されるものの、出力された後ろに文字化けしたような文字が少し出てしまいました。加えて、直後にもう一度試してみようとサーバプログラムを立ち上げるとbindでエラーを吐いてしまいました。 recvの結果(rc)をprintfで確認してみたところ、13となり2文字多く送られていることを確認しました。 そこで、Javaのprintlnの自動改行周りが原因かと思いprintfに変えてた試してみました。 しかし、recvの結果は11となったものの文字化けと直後のbindエラーはなおりませんでした。(文字化けの種類が変わりましたが) この問題の原因と考えられることと解決案をアドバイス願えませんでしょうか。よろしくお願いします。 以下、開発環境です。 ■C言語 OS:Fedora 12 エディタ:一応VisualC++2008(Linux用に書いているので実質ただのテキストエディタ) コンパイラ:標準gcc ■Java OS:Windows XP SP3 エディタ・コンパイラ:eclipse ※実装先の都合上、winsockによるサーバに変えるや言語の変更はできません。

    • ベストアンサー
    • Java
  • HTTPでファイル転送させるには?

    質問1 HTTPでのファイル転送 以下のようなことを考えています。 1)多数のクライアントから、サーバに対してテキストファイルをある周期で転送します。 2)クライアントには固定IPアドレスが割り振られています。 3)クライアントはWindows2000/XPです。 4)サーバはWindowsServer2003かUNIX(メーカ未定)を導入予定です。 5)クライアントとサーバの間にはセグメント越えが必要な場合があり、HTTPのみ利用可能です。 6)ファイル転送のソフト(もしくはコマンド)はクライアント側にあり、クライアントからサーバにファイルをPUSHします。(サーバからPULLするのではありません) こういった上記の要件の場合、HTTPでテキストファイルをサーバに転送させることは可能でしょうか? 質問2 ファイル転送の結果を検証する ファイル転送後に、確実に送信できたかどうかを知る方法を教えてください。FTPだと、ファイルリスト、ファイルサイズ、タイムスタンプなどを確認してチェックするという方法が思いつくのですが、HTTPの場合はどうなんでしょうか? 以上、2つの質問に対して、可能であるならば、 ・こういうコマンドを利用すればよいよ ・こういう関数があるよ ・こういうソフトがあるよ など、どんなささいな情報でも結構ですので、情報をいただけると大変幸いです。

  • WinsockでN対N通信のプログラミング

    WinsockでN対N通信のプログラミング VC++2008、Windows7(32bit)を使用しています。 便宜的にマシンをS0、C1、C2、C3、C4とあるとして、 S0をサーバー、Ciをクライアントとした1対4の通信は確立できました。 この時、C1からC2にデータを受け渡すときにはアプリケーションとしてC1→S0→C2とデータを転送させているのですが、C3→C1、C4→C2と他にもクライアント間やサーバー・クライアント間に大きなデータの転送があり、S0の負荷が大きくなることが懸念となっています。クライアントの数ももう少し増えていく予定ですが、サーバーを通信専門のマシンにすることは好ましくない状況です。 クライアント同士での直接的データのやり取りによるN対Nの通信の確立方法(、または、サーバーを通すけれど負荷的に問題がなくなるようなやりかた)をどなたかご教授頂けるでしょうか?

このQ&Aのポイント
  • 古いパソコンのCPUをCorei5 3210Mに交換したが、Windowsが立ち上がらない問題について解決方法を教えてください。
  • CPUを元に戻すと正常に起動するため、マザーボードの故障は考えられません。どなたか解決策を教えていただけませんか?
  • 富士通FMVのah30Gを使っている古いパソコンで、CPU交換後に起動しない問題が発生しています。Windowsの立ち上がりに関してアドバイスをお願いします。
回答を見る