• 締切済み

ソケット通信処理について

現在、下記のようなクライアント、サーバ通信を行っております。 [クライアント] (a)WSAStartup (b)socket (c)connect (d)send(サーバへの要求送信) (e)recv(サーバからの応答受信) (f)shutdown (g)closesocket (1)プロセスは、常駐している (2)(a)は初回起動時1回のみ (3)通常(d)~(e)を周期的に行う (4)(e)にて一定時間経過した場合、5秒待ち6回リトライし、それでもだめな場合は、(f)(g)を実施後(b)から処理を行う。この後、WSACleanupを行っていない。プロセス終了(exit)もしていない。 [サーバ] (a)socket (b)bind (c)listen (d)accept (e)子プロセス生成 以下子プロセス処理 (f)select (g)recv(クライアントからの要求受信) (h)send(クライアントへの応答送信) (1)親プロセス((a)~(e)を行うプロセス)は常駐している。子プロセス起動後、(d)でconnect待ちとなる。(クライアント側からの再接続待ち) (2)子プロセスは、通常(f)~(h)の処理を行い、(f)又は(g)の異常時にexitする。 この処理で、クライアント処理(e)の一定時間経過後の再接続が正常に動作しない場合があります。 詳細情報を取得していませんが(現実的にすぐに詳細情報を取得することができない状況)(c)にて異常が発生していると思われます。 一度その状態になると二度と再接続できなくなり、マシン再起動(プロセス再起動)で復旧させることになります。 (実際は、マシン再起動後に再接続が正常になることを確認しています。(プロセス単体の再起動での確認はしていません。)) そこで質問ですが、 (1)再接続時、WSACleanupを行っていないが、問題ないか(処理の順番:(f)→(g)→(b)) (2)再接続前にプロセス終了(exit)していないが、問題ないか (3)上記の作りで考えられる要因として、何があるか ご教示して頂きたく、宜しくお願い致します。

  • IKJ
  • お礼率9% (1/11)

みんなの回答

  • circuit
  • ベストアンサー率72% (13/18)
回答No.2

WSAStartup()およびWSACleanup()は、プログラム中で1度呼び出せばOKです。 最初は上手く動くが、途中でこの状況に陥るということですか? まず、クライアントかサーバのどちらで異常が発生しているのかを突き止めなければなりません。 クライアント側 ・正しくclosesocketが行えているか? ・connect時にどんなエラーが帰っているのか?  WSAGetLastErrorで調べる サーバ側 ・正しくclosesocketが行えているか? ・子プロセスは正常終了しているか?  recvあたりでブロッキングされていないか。 http://www.usay.jp/ このサイトに、Socketerという通信エミュレートソフトがあります。 これを使ってサーバ、クライアントをエミュレートしてみてください。 また、エラーが発生していそうな部分で、WSAGetLastErrorを使ってエラーコードを取得してみてください。 参考URL:Winsock Error Code

参考URL:
http://homepage1.nifty.com/yito/anhttpd/winsock_error.html
  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

あまり自身はないのですが、向学のために回答させていただきます。 サーバー側のsocket Closeの記載がありませんが、子プロセス が終了のたびにCloseしているかどうかが少し気になります。

IKJ
質問者

補足

回答ありがとうございます。 記載するのを忘れました。サーバ側は、子プロセス終了する度にcloseを行っております。

関連するQ&A

  • WinSockのクライアント処理

    WinSockについてお尋ねしたいのですが、 クライアントからのサーバへ1頁分のデータを要求しそれを画面に表示する プログラムを作成していますが、 一ページ分の要求毎に、以下の一連の処理を行っています。 WSAStartup socket connect send recv closesocket WSACleanup この為か、netstrtで確認すると"TIME_WAIT"が多数発生しポートが あふれてしまう事があります。 そこで、私は、 WSAStartupとWSACleanup を、クライアント起動時に行う。 (いろいろ調べると、これは絶対修正すべきという事がわかりました。) もうひとつ、 "TIME_WAIT"への対処として、 socket connect も、クライアント起動時に行う事を考えています。 私の考えは適切なのでしょうか? "TIME_WAIT"への一般的な対処などお教えください。 宜しくお願いいたします。

  • WinSockでのソケット通信

    早速質問ですが、 今、クライアントからの要求をサーバに投げ、 ページ事のデータをサーバから取得し、 クライアントに表示する。と言うシステムを作成中ですが、 1ページ目の処理中に次の要求を行なうと、 (一度目のrecv()を追い越して二回目のsend()を行なう?) ポートを掴んだままになってしまい処理の続行が出来なくなってしまっています。 色々調べましたが、非ブロッキングには設定していない(ioctlsocket関数をコールしていない) と思われます。 このような状況についてご存知の方がいらっしゃったら、是非お力をお貸し下さい。

  • ソケット通信異常

    クライアントがソケットを接続した状態でサーバープロセスがいきなりDownした場合、クライアント側でlisten()から抜けてきません。 OSのパッチ等あるのでしょうか?

  • サーバプロセスとクライアントプロセスの通信

    サーバプロセスとクライアントプロセスの通信がどのように行われているのか確認させてください。 現在、以下の認識でいます。 (1)TCPコネクション  サーバ側ポート番号【23】と、それぞれのクライアント側ポート番号【****】との間に確立する。   (2)通信処理  クライアント側のプロセスAは、サーバ側のプロセスA(子)  クライアント側のプロセスBは、サーバ側のプロセスB(子)  クライアント側のプロセスCは、サーバ側のプロセスC(子)  との間で通信を行う。 ※添付の図も参照ください。 認識に相違ないでしょうか。 サーバプロセスとクライアントプロセスの通信を行う際、プロセス間(ポート間?)の通信には、IPアドレスとポート番号を組み合わせたソケットを用いるため、サーバ側ではソケット【192.168.0.1:23】を1個作成し、クライアント側ではソケット【192.168.0.2:****】をプロセス分作成すると考えています。 このとき、クライアントプロセスAはサーバプロセスA(子)と通信を行いますが、サーバ側で作成されているソケットは1つであるため、どの子プロセスに対してデータをせばいいのか判別できないのではないかと考えています。 ※クライアントプロセス(A、B、C)はソケット(サーバ側)【192.168.0.1:23】に対して送信されるため。 上記について、何らかの仕組みがあるのでしょうか。 よろしくお願いします。

  • ソケット通信について

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

  • ソケット通信におけるコントローラの作成

    こんにちは.いつもお世話になっています. 質問なのですが,現在ソケット通信でサーバプログラム,クライアントプログラムで通信し,文字列をやり取りするプログラムを作成しました. このクライアントプログラムは3つあり,3つのプログラムすべてがサーバに接続されるとサーバが文字列を返す仕組みになっています. そこで,この三つのプログラムが別々のPC上に乗っている場合に三つのプログラムを一つのコントローラプログラム(一台のPC)上から起動あるいは通信させられるようにプログラムを作りたいと思っています. 例えばコントローラプログラムを起動すると,1:プログラムAを起動,2:プログラムBを起動,3:プログラムCを起動,という選択肢が表示され,1を選択すると別PC上のプログラムAが起動する,という方式です.実際にはプログラムAの起動は手作業で行って,通信の開始だけをコントロールできる方式でも構いません. 考えとしてはクライアントプログラムが定期的にサーバプログラムと通信を行っていて,サーバプログラムがコントローラプログラムから命令を受け取ったらフラグを立て,そのフラグをみてクライアントプログラムが通信を開始する,というものなのですがどうもうまくいきません.(定期通信が実現できません) どうすればこのような構成を実現できるでしょうか? ご教授お願いします.

  • 数学(数的処理) 整数

    毎度毎度ですが・・・ ヨロシクお願いします。 【問題】 次の(1)~(5)の関係式があるとき,gの最大値はいくつか。 (1)a,b,c,d,e,f,gはすべて自然数である。 (2)a,b,c,d,e,f,gはすべて異なるとは限らない。 (3)a,b,cはこの順に連続である。 (4)d+e+f+g=10 (5)a+d+e=b+e+f=c+d+f 【私の考え】 (3)よりa=b-1,c=b+1に置き換えたほうがいいということまでは分かるのですが・・・ どこを目標にして式を立てていけばいいのかが分かりません。 アドバイス・解法をよろしくお願いします。 ちなみに正解は「4」となります。

  • ODBC経由の処理が遅い

    サーバAとクライアントBがあります。同じセグメント。 10MBで接続されています。 この状態であれば、速度低下は感じられないのですが、 サーバAとクライアントBを離れた場所に設置し、間を1Mb/sで接続した場合、システムの動作がとても遅くなってしまいます。調べるとODBC経由で処理しているところが遅くなっているようです。 例えサーバAとクライアントBを光で接続しても 速度に改善が見られないようなので ODBC経由の接続に限界でもあるのでしょうか。 うまく伝えることができないのですが、 どなたか何か分かりませんでしょうか。

  • Javaのソケット通信について初歩的な質問です

    私はいま、独学でJava言語の勉強をしています。 おそらく初歩的な質問ですが、いくら検索をしても見つからなかったため、質問させていただきます。 JavaでTCPを使ってソケット通信をする際の質問です。 WiFiのアクセスポイントAとアクセスポイントBがあるとします。 クライアントのアプリケーションが、アクセスポイントAからインターネットに接続し、サーバのIPアドレスとポート番号を使ってソケットを作り、サーバとTCP通信をしているとします。 このとき、クライアントが動いて、アクセスポイントBに接続したとします(接続が自動で切り替わる)。 このような場合でも、サーバとクライアントのコネクションは保っていられるのでしょうか? もしくは、このような場合でもコネクションを保つ方法はあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • プロセスを指定してsend??

    先日から引き続きなのですが、またIPCでつまってしまいました。 現在プロセス間でデータをお互いにやり取りをしているのですが、 serverからclientにデータを送ったときは正しく送れているのに、 その後clientで処理をして、再びserverに返すときには、うまく返りません。 client側は送っているようなのですが、 serverが受け取っていません。 clientが自分自身に送ってしまっている可能性があるようです。 現在は同一マシン内で作業しているので、 二つともIPアドレスが同じだからだと思うのですが、 これを解決する方法はあるのでしょうか? send、recvするときにプロセスを指定することは可能でしょうか? 教えていただけるとありがたいです。

専門家に質問してみよう