VC++でストリーム型のネットワークアプリケーションを作成しています。
サーバソケット、クライアントソケットを作成し、Connectしようとしているのですが、WSAEWOULDBLOCKエラーが出てきてしまいます。
いったい何が原因なのでしょう・・・。
調べているのですが手がかりがつかめません。
なにか心あたりのある方、教えてください。
よろしくお願いします。

A 回答 (5件)

>OnAccept()はすぐ帰ってくるのですが、、、



んー。サーバー側の動きですが
Listen() -> OnAccept() -> Accept() となりますが
Accept()する時 new した新しい CAsyncSocket に割り当ててますよね? Listenするソケットと実際に通信するソケットは異なるのが普通です。

情報が少ないので、ちょっとよく分かりません。

この回答への補足

ありがとうございます。

>Listenするソケットと実際に通信するソケットは異なるのが普通です。
ここに気付いていませんでした・・。

うまく状況を説明できて居らず、スイマセン。
STREAM型(TCP/IP接続で)のネットワークアプリケーションを作りたいのです。
もう一度、教えていただいた方法で試してみます。

補足日時:2001/10/30 23:36
    • good
    • 0
この回答へのお礼

いろいろご教授ありがとうございました。
接続できるようになりました・・・。

しかし、相手が受信したことを確認できるアプリケーションにはまだ遠いようです。
STREAM型を使えばできると思っていたのですが・・・。
何かほかにご存知でしたら知らせてください。

本当にどうもありがとうございました。

お礼日時:2001/10/31 15:14

>同じマシン上でも理論上は可能ですよね??



理論上というか、全然問題ないです。

>しかし、なかなかOnConnect()に帰ってこないのですよね。。

ん?同じマシンですよね?
一瞬のうちにつながりませんか?
なかなか返ってこないというのは、返ってくるけど遅いということですか?

この回答への補足

解答ありがとございます。
助かっています。
すぐ返ってこないというのは、何か致命的なエラーがあるのでしょうか・・・・。
OnAccept()はすぐ帰ってくるのですが、、、
流れとしては、現在クライアントがConnectしたら、サーバがOnAccept→Accept
、そこで動きは止まってしまいます。
もしかしたら非同期式になっていないのでしょうか・・・・。
なんだか不安なのですが。

スイマセン、ご面倒お掛けしています・・。

補足日時:2001/10/30 21:18
    • good
    • 0
この回答へのお礼

大変ありがとうございました。
エラーコード拾えました;;;;;;

すいません。
本当にお世話になりました。

お礼日時:2001/10/31 15:34

非ブロッキングモードなら、デフォルトで


WSAEWOULDBLOCK
が返ってきますので、エラーと判断することはないですよ。
正常動作です。

つまり、getLastErrorを実行しても、
WSAEWOULDBLOCK以外が返ってきた場合を
エラーとしてあげて、
WSAEWOULDBLOCKが戻った場合は、以降の処理をして構いません。
    • good
    • 0
この回答へのお礼

ありがとうございました。
繋がりました。。。

お礼日時:2001/10/31 15:37

MFCだったらおそらく CAsyncSocket で接続されているのだと思いますが、非ブロッキングソケットの場合は Connect を呼び出してもその時点では接続しない(接続するまで関数がブロックしない)のでこのWSAEWOULDBLOCKが返ってきます。



この場合WSAEWOULDBLOCKが返るのは正常な動作です。このエラーコードだけは無視すればいいです。そのうち接続結果が OnConnect() に返ってきますのでそこで接続結果を判断しましょう。

昔悩んだ記憶があります。(^^;

この回答への補足

ありがとうございます。
しかし、なかなかOnConnect()に帰ってこないのですよね。。
同じマシン上でも理論上は可能ですよね??

補足日時:2001/10/30 18:42
    • good
    • 0

非ブロッキングモードとブロッキングモードのどちらでソケット処理を


しているのでしょうか?

非ブロッキングモードでソケットを生成している場合、
必ずこの値が戻るようです。

非ブロッキングモードの場合は、接続完了イベントがコールバックされた以降に
送受信処理をすればできると思います。

ブロッキングモードは特定の理由がない限り、処理がとまってしまうので
使用しないほうがいいかと思います。→これはうそかも。

ちなみに私が以前作成したときは、非ブロッキングモードで送受信処理を
おこないました。

参考URL:http://www.microsoft.com/japan/developer/library …

この回答への補足

すばやい解答ありがとうございます。
非ブロッキングモードでソケット処理を行っています。
すいません、接続完了イベントはOnConnectを使うのでしょうか???
知識が危ういもので。。。
接続が完了していなくてもサーバのAccept、クライアントのSendはエラーが起きていないのです。
ただ、サーバのReceiveで接続されていないというエラーが出てくるのです。
なにかご存知でしたら教えてください。

補足日時:2001/10/30 11:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q404ERROR の 意味の統一はいつからですか?

こんばんは~! ネットワークのカテゴリーのエキスパートな方々!回答宜しく~^^

質問はタイトルの通りなのですが、『404 ERROR』はいつ頃から共通に利用されてるのですか?
仮に最初に統一した人がいるのなら、使用許諾や使用に当っての利点若しくは、お金が来てるの?

Aベストアンサー

HTTPエラーコード404。
Not Found:要求されたURIに対するマッチする情報が見つからない(RFC1945)
通信規約上の約束です。

RFC(Request For Comment:ご意見お待ちしてます)はインターネット標準案と標準規約を記述したメモで、誰でも参照して利用することが出来ます。

いつから?と問われればRFC1945に制定されたメモが発表された1996年からです。

QVC++6で作成したDLLをVC++.NET2003から呼び出せますか

現在、VC++.NET2003で作成しています。あるメーカから提供されているDLLがあるのですが、そのDLLとのリンクまではできたのですが、実行するとエラーになってしまいます。
(プログラムが異常終了するのではないのですが、そのDLLからの戻り値がエラーになり、期待した結果が得られません。)
そのDLLはVC++6で作成したものらしく、マニュアルには、VC++6で作成したアプリケーションからの呼び出し方法が、記述されていました。
VC++6でアプリを作成すれば、正常に呼び出せることは明白なのですが、いかんせん、VC++.NET2003での開発が、ある程度進んでしまっていますので、いまからVC++6に切り替えるわけにもいきません。
それで、一般論として、確認したいのですが、VC++6で作成したDLLをVC++.NET2003で使用することは、出来ないのでしょうか。(これから、メーカにも確認する予定ですが、まずは、こちらで確認したく、投稿した次第です)

Aベストアンサー

> もし、原理的にVC++6のDLLをVC++.NETでも呼び出し可能なら、

呼び出すだけなら原理的には可能ですが、作り方次第では正しく動作しないと思います。
典型的なまずい例は、DLL側でmallocやnewなどで割付けたオブジェクトを呼び出し側で解放させる、またはその逆です。

結局のところ、DLLの作り方に強く依存しますので、想像だけではこれ以上分かりません。

Q404 Error Not Found と出てしまします

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わかりません^^;

もう一つ質問ですが、無料素材屋さんから、画像をダウンロードして、
「名前をつけて保存」と書いてあったので、例えば「鉢植え」と保存しました。「HETEMULU」で画像の挿入をクリックすると、「鉢植え」の後ろに.gifと付き、問題ないように思っているのですが、日本語で保存しているから、404 Error Not Found と出てしまうのでしょうか?それともそれはまったく関係ないのでしょうか?
慣れていらっしゃる方にはおバカな質問かもしれませんが、どうかどなたか教えて下さい!説明が足りなければ補足しますので、どうかよろしくお願いします!!!

初めてホームページを作ろうとしている者なので、専門用語ではなく、わかりやすく教えて下さいませm(__)m
「HETEMULU」を使って、ホームページを作り、半年かけて、やっと完成しました^^;
そして、無料だと聞いたので、「忍者ホームページ」サイトで、
「NINJA TOOLS」?という所で、IDやパスワードを取得し、なんとか出来たと思ったのですが、

登録されているあなたのURL

とい所をクリックすると、

404 Error Not Found と出てしまします。

何故ですか??

色々触ってみたけど、わか...続きを読む

Aベストアンサー

作成したHTMLファイルをサーバーにアップロード(転送)済みで
しょうか?
トップページは必ず「index.html」または「index.htm」である
必要があります。
「index.htm」にする場合は、元からある「index.html」を削除
(※下記ページ参照)
http://www.ninja.co.jp/faq/a/37/

おすすめのFTPソフト
「FFFTP」
http://www2.biglobe.ne.jp/~sota/

日本語ファイルは表示されない場合もあるので、英数字のファイル名
が推奨されています。
http://www.ninja.co.jp/faq/a/79/

Qクライアント サーバ(Win2000)間ソケット通信について

クライアントの通信APLをDebugするのに、仮のサーバ(Win2000)に接続するのですが、サーバ側の通信APを
どう開発していいのか?本等にはUNIXのAPのサンプルは
あるのですが、WINサーバのサンプルがありません。
教えてください。

Aベストアンサー

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。

「コマンドプロンプトからコマンドを発行」が何を指しているかが分かりませんが、
acceptが即時リターンされ、EWOULDBLOCKなどが返ってきているのであれば
非同期ソケットとして動いているのでしょう。

> サーバ側のAPなのですが、VisualStadioVer6.0にてWin32Applicationにて作成したのですが、
> WinMain()で書きださないとリンク時にエラーになります。

WinMain関数は、いわゆるWin32アプリケーションにおける
main関数だと思ってください。

printf等の標準入出力を使いたいのであれば、
プロジェクトの新規作成→Win32 Console Application で、
HelloWorldアプリケーションをスケルトンに選択すれば分かりやすいと思います。

> telnet (サーバ側のIP) (19485)
> 接続中: xxx.xx.x.xxx...ホストへ接続できませんでした ポート番号 19485 : 接続に失敗しました
> と出力されます。

サーバ側APのbindが、ポート19485で正しくできていないのだと思います。

> 気になるのは、サーバ側でAPをコマンドプロンプトからコマンドを発行してるのですが、
> 入力プロンプトが直ぐに返ってきます。ただ、 タスクマネージャーで見るとプロセスが起動されています。
> 非同期なのですか?

同期/非同期は、アプリの実装に依存します。
...続きを読む

Q教えて下さい!なぜ【WebApp: Error 404】のページが出る?

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:8080/examples/jsp/index.html
【JSP Samples】のページが出ます。

(4 問題点)
http://localhost/examples/jsp/index.html
【WebApp: Error 404】のページが出ます。
希望 → (3)と同じページが出る。

起動は tomcat → apache の順です。

なぜ【WebApp: Error 404】のページが出るのでしょうか?
教えて下さい。
お願いします。
(初心者なので出来ればわかりやすくお願いします)

JDK + apache + mod_webapp.so + tomcat + PostgreSQLをインストール・設定しました。

JDK     j2sdk-1_3_1_11-linux-i586
apache    apache1.3.31
mod_webapp.so
tomcat    jakarta-tomcat-4.1.30
PostgreSQL    postgresql-7.2.3

(1)
http://localhost:8080/index.jsp
【tomcat】のページが出ます。

(2)
http://localhost/
【あなたの予想に反して、このページが見えているでしょうか?】のページが出ます。

(3)
http://localhost:...続きを読む

Aベストアンサー

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule>
------------------------------------------------------

3.tomcatのserver.xmlに以下を記述している。
------------------------------------------------------
<Service name="Tomcat-Apache">

<Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true" appBase="webapps"
acceptCount="10" debug="0"/>

<Engine className="org.apache.catalina.connector.warp.WarpEngine"
name="Apache" debug="0">

<Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log." suffix=".txt"
timestamp="true"/>

<Realm className="org.apache.catalina.realm.MemoryRealm" />

</Engine>

</Service>
------------------------------------------------------

4.tomcat、apacheの順で再起動

どう?

設定内容が書いていないので
いかんともあれなんですが。。。(^^;
以下の手順をご確認下さい。

1.mod_webapp.soをapacheのlibexecに配置している。

2.apacheのhttpd.confに以下を記述している。
------------------------------------------------------
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c

<IfModule mod_webapp.c>
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples
WebAppInfo info
</IfModule...続きを読む

Qソケットとそれに基づくストリームは1対1でしょうか。

ソケット通信で、接続してきた
クライアント(TcpClient tempclient)から、
NetworkStream,StreamReader,StreamWriterなどを
作っています。

Class A

while(true){
tcpclient=server.AcceptClient();
networkstream=tcpclient.getStream();
streamreder=new StreamReader(networkstream...);
mythread=new Mythread(tcpclient);
//
networkstream.close()
streamreader.close()
//これらを加えると、下の、/* */でエラーになります。
}

MyThread B

{
Public Mythread(TcpCLient tcpclient){
/*
ns=tcpclient.Getstream
sr=...
*/
}

このクライアントを、別のスレッドで使うため、
mythread=new MyThread(tcpclient)などとして、
別のクラスにもっていき、
そこでも、新たに、NetworkStream,StreamReaderを
作ったとします。
この場合、1つのクライアントにつき、2つの
ストリームができるのでしょうか。
経験上、ストリームを作成するコードは
問題なく動きます。
しかし、新たにストリームを得たので、古いのを
クローズすると、エラーになります。
新たに作ったストリームは、実は、古いストリームを、
使いまわしていることになるのでしょうか。

少し、分かりづらいかもしれませんが、
何か分かる人がいましたら、よろしくお願いします。

ソケット通信で、接続してきた
クライアント(TcpClient tempclient)から、
NetworkStream,StreamReader,StreamWriterなどを
作っています。

Class A

while(true){
tcpclient=server.AcceptClient();
networkstream=tcpclient.getStream();
streamreder=new StreamReader(networkstream...);
mythread=new Mythread(tcpclient);
//
networkstream.close()
streamreader.close()
//これらを加えると、下の、/* */でエラーになります。
}

MyThread B

{
Public Mythread(TcpCLient ...続きを読む

Aベストアンサー

具体的にどんなクラスを使っているのかよく分かりませんが、常識的な実装をしているならストリームをクローズするときには対応するソケットを破棄しているでしょう。ストリームをクローズせずに廃棄(delete)すると上手くいくかもしれませんが、デストラクタがクローズすることも考えられるので上手くいく保証はありません。
使っているストリームクラスにソケットとの関係を切断する機能が実装されていれば良いですが、そうでなければソケットとストリームは一対一で使うことが前提になると思います。

QError!! HTTP status code=404

Error!! HTTP status code=404

いつもお知恵拝借、ありがとうございますm(_ _)m

さて、最近当社で中古XP (prof.)パソコンを2台導入しました。sp3にupしております。

取引先のサイトにアクセスし、IDとpasswordでログインして「取引明細」をダウンロードしようとしましたが、ファイルのアイコンをクリックしたら上記のようなエラーメッセージが出ます。

2台とも同じエラーが出ます。

「教えてgoo」や他のサイトで検索してもなかなか、コレというページが見あたりません。

以前からあるもう一台のXPからはアクセスでき、見ること・プリントすることが出来ます。

アクセスしようとしたファイルは拡張子が".ilf"で、検索の結果どうやら電子帳票のファイルのようです。

このようなトラブルは初体験なので、皆さんのお知恵を是非拝借したいと思います。どうかよろしくお願いいたしますm(_ _)m

Aベストアンサー

ILFのことについてはわかりませんが、単純にHTTP のエラーコード404は、
Not Foundですね。

要するに、指定のページやファイルが見当たらないということ。

先方のシステム内で、指定されたファイルがないということではないですか?
それを先方のWEBサーバーと連携したILFのシステムが応えていると・・・

先方の担当者に聞いた方がいいと思いますが。
特定のシステム内のことですので、担当者以外は本当のことはわかりません。

QVC6.0ソケット通信プログラムについて

お世話になります。

VC6.0でソケット通信の社内の既存のプログラムを改善しております。

クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。
NETSTATコマンドで確認したところ、
サーバ側では、CLOSE_WAITが大量に出力されており
クライアント側では、FIN_WAIT_2が大量に出力されます。
クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。
サーバ側のEXEを再起動すると、CLOSE_WAITは消えます。

サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。

コードを以下に記述致します。

WINAPI K010cListener{
/*Winsock初期化*/
WSAStartup(wVersionRequested,&wsaData);
/*SOCKET作成*/
fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

/*ポートの設定*/
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_family = AF_INET;
addr.sin_port = htons(usPortNo);
addrlen = sizeof(addr);
/*BIND*/
bind(fd,(struct sockaddr*)&addr,addrlen)

/*LISTEN*/
listen(fd,0)

while(1){
/*ACCEPT*/
fd2 = accept(fd,(struct sockaddr*)&addr,&addrlen)

//データ受信
waitReceiveThread(fd2, &rcv_msg);

//DBオープン
ConnectDB()
//DB登録
AddTable(&rcv_msg)
//DBクローズ
CloseDB()
}

/*Winsock終了*/
WSACleanup();
}

void waitReceiveThread(SOCKET fd, SockRcvMsg *rcv_msg) {

while (1) {
/*データ受信待ち*/
rcvSize = recv(fd,rcvBuf,sizeof(rcvBuf),0);
if (rcvSize <= 0) {
continue;
}
else {
/* 返信電文の準備 */
memset(sndBuf,0x20,sizeof(sndBuf));
memcpy(sndBuf ,"RCMORDER00004800000000",22);

/* 返信電文の送信 */
send(fd,(char*)sndBuf,sizeof(sndBuf),0);

/* バッファの初期化 */
bufsize=0;
memset(buf,'\0',sizeof(buf));

break;/*ループを抜ける*/


}
}
}

恐れ入りますが、ご教授いただければ幸いです。
宜しくお願い申し上げます。

お世話になります。

VC6.0でソケット通信の社内の既存のプログラムを改善しております。

クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。
NETSTATコマンドで確認したところ、
サーバ側では、CLOSE_WAITが大量に出力されており
クライアント側では、FIN_WAIT_2が大量に出力されます。
クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。
サーバ側のEXEを再起動すると、CLOSE_WAITは消...続きを読む

Aベストアンサー

waitReceiveThread()においてrecv()の戻り値rcvSizeが0以下の場合、そのコネクションは切断された物として処理するのが妥当だと思います。origin_93様の書かれたプログラムでは無理やりcontinueしてrecv()を繰り返しいるため、切断後の正常動作は期待出来ません。

かなり大雑把ですが、一般的なサーバの動作は下記の流れの様になります。

 while (TRUE) {
  socket();
  bind();
  listen();

  while (TRUE) {
   accept();

   while (TRUE) {
    ret = recv();
    if (ret <= 0) break;
    else {
     受信処理
    }
   }
  }
 }

一番外側のループは要らないかもしれませんが、socket()等の戻り値がエラーだった場合を考慮しています。
複数のクライアントが接続するならば、acceptの後で受信スレッドを生成し、そのままループします。acceptで取得したレシーブソケットは受信処理のループを抜けた所でクローズして構いません。

waitReceiveThread()においてrecv()の戻り値rcvSizeが0以下の場合、そのコネクションは切断された物として処理するのが妥当だと思います。origin_93様の書かれたプログラムでは無理やりcontinueしてrecv()を繰り返しいるため、切断後の正常動作は期待出来ません。

かなり大雑把ですが、一般的なサーバの動作は下記の流れの様になります。

 while (TRUE) {
  socket();
  bind();
  listen();

  while (TRUE) {
   accept();

   while (TRUE) {
    ret = recv();
    if...続きを読む

QHTTP 404 error

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web.xml
...
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>chapter2.login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
...
(4)webapps/apress/WEB-INF/classes/chapter2/login.java
package chapter2;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class login extends HttpServlet {
private String target = "/welcome.jsp";
private String getUser(String username, String password) {
// Just return a statice name
// If this was reality, we would perform a SQL lookup
return "Bob";
}
....
(4)現象:
http://xxx.xxx.xxx.xxxx:8080/apress/login.jsp
でsubmit action 後、次のエラーが出てきました:
HTTP 404 error,
The requested resource (/apress/servlet/chapter2.login) is not available.

この問題はどこにあるでしょうか教えてください。

Vine Linux,Tomcat5で
(1)webapps/conf/server.xml
...
<HOST>
<Context path="/apress" docBase="apress" debug="0" reloadable="true" />
...
(2)webbapps/apress/login.jsp
...
<table width="500" border="0" cellspacing="0" cellpadding="0">
<form name="loginForm" method="post" action="servlet/chapter2.login">
<tr><td width="402"><div align="right">User Name: </div></td>
<td width="399"><input type="text" name="username"></td>
</tr>
...
(3)webapps/apress/WEB-INF/web....続きを読む

Aベストアンサー

パスの指定が間違ってるからだと思いますが。

/apress/servlet/chapter2.login

このパスにちゃんと存在してますか?

QVC++ 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つのソケットが必要になるのでしょうか?

ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが
回答よろしくお願いします。

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の...続きを読む

Aベストアンサー

>Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは
>(1)Aからの受信を行う(待つ)ソケット
>(2)Cへ送信を行うソケット
>(3)Cからの受信を行う(待つ)ソケット
>(4)Aへ送信を行うソケット
>の4つのソケットが必要になるのでしょうか?

TCPなら対Aと対Cの2つでOKなんじゃないでしょうか?
ただし…A⇒CとC⇒Aで別々のソケットを使うなら、それぞれ必要になりますから4つ…ということになりますが。
A<>CでTCP接続した場合、同一のソケットで送受信可能である。ということは理解されています?
# プログラムは面倒かも知れませんが…。プロトコル次第でしょうかね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報