トップページ⇒tech
1001コメント348KB

ネットワークプログラミング相談室 Port20

■ このスレッドは過去ログ倉庫に格納されています
0001ftp-data2007/08/07(火) 01:47:35
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port19
http://pc10.2ch.net/test/read.cgi/tech/1159692799/

関連スレ
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
01591502007/09/25(火) 02:08:20
>>156
とりあえず、やってみます。beginthreadexは調べておきます。

>>157
その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、
listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。
listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて
わからない状態です。

>>158
サーバーはまぁ、色々と事情が…;
でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは
OS以外のことだと思うんです。
私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして
使用した際に何か違いってあるんでしょうか?
0160デフォルトの名無しさん2007/09/25(火) 02:15:11
>>159
そう思うなら、Linux入れて同じハードでほぼ等価の
コード作ってためせ

たぶんおきねーからw

0161デフォルトの名無しさん2007/09/25(火) 03:29:59
>>159
XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。
1,環境が良く分からない。サーバーはマルチプロセッサマシンなの?
2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?
0162デフォルトの名無しさん2007/09/25(火) 06:32:30
>>159
最小限のソース晒してくれ
時間の無駄だ
0163デフォルトの名無しさん2007/09/26(水) 09:14:56
無線LANに接続しているPCの数を取得するにはどうすればよいのでしょう?
0164デフォルトの名無しさん2007/09/26(水) 10:12:09
>>150
acceptの処理時間とか無関係。
サーバのOSでTIME_WAITでポートが枯渇してるだけ。
TIME_WAITについて深くしりたけりゃぐぐれ。
めんどくさけりゃSO_REUSEADDR。
0165デフォルトの名無しさん2007/09/26(水) 10:15:56
>>163
a. 無線LANのWebからステータスを得る
b. SNMP,MIBでぐぐーる
0166デフォルトの名無しさん2007/09/26(水) 11:33:20
サーバ側のポートが枯渇するの?
サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
0167デフォルトの名無しさん2007/09/26(水) 11:43:38
ちゃんとした通信手順を踏めば即座にポートを解放してくれる
行儀の悪い通信をすると TIME_OUT まで待ってから解放される
TCP/IP の仕様だから Linux でも Windows でも同じコードなら
やっぱり通信数に制限が出るような気がする
0168デフォルトの名無しさん2007/09/26(水) 11:53:21
>>164
> ポートが枯渇してるだけ。

馬鹿丸出し。
0169デフォルトの名無しさん2007/09/26(水) 11:59:52
SO_REUSEADDRは再びbindするときの話だっけ。
>>150とは関係なさそうだな。
0170デフォルトの名無しさん2007/09/26(水) 13:16:22
acceptを終了するにはどうしたらいいの?
acceptで待機中の時に別スレッドからsocketcloseを呼び出したら
WSAEINTR (10004)
? 意味 : 関数呼び出しに割り込みがありました。
? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。
が呼ばれるんだけど、acceptの終了方法はこれであってるの?

winsocket2.2
0171デフォルトの名無しさん2007/09/26(水) 13:36:14
>>170
WinsockならそれでOKのはず
0172デフォルトの名無しさん2007/09/26(水) 14:01:34
>>171
そうなんだ
ありがとう〜
0173デフォルトの名無しさん2007/09/26(水) 15:53:48
>>166
>サーバ側のポートが枯渇するの?
>サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?

その通り、枯渇するのはクライアント側のポートだった。
↓あたり。
ttp://www.softlab.ece.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7
ttp://mikilab.doshisha.ac.jp/dia/research/report/2002/0408/005/report20020408005.html
ttp://d.hatena.ne.jp/Kazzz/20070207

ま、結論としてはSO_REUSEADDR。
0174デフォルトの名無しさん2007/09/26(水) 16:42:19
ということはconnect内部のbindで失敗するとWSAECONNREFUSEDが返ってきちゃうのか。
原因に気づき辛そうで厄介だなあ。
0175デフォルトの名無しさん2007/09/26(水) 20:06:08
>>173
クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
0176デフォルトの名無しさん2007/09/27(木) 00:13:10
おまえら, なんかトラブったときに TCP のステートダイアグラム
見ないでプログラム修正とかしてるのか?
01771502007/09/27(木) 10:53:38
一向に解決しなかったけど、今の状態で妥協する形になりました。
助言くれたかたサンクスです。

>>176
TCP のステートダイアグラム
とは?
0178デフォルトの名無しさん2007/09/27(木) 11:12:53
http://www5d.biglobe.ne.jp/~stssk/rfc/rfc793j.html
Figure 6. TCP Connection State Diagram
0179デフォルトの名無しさん2007/09/28(金) 00:06:29
http://tools.ietf.org/html/rfc793#section-3.2
か、あるいは簡略化されているが↓のも見やすいよ
http://www.atmarkit.co.jp/fwin2k/network/baswinlan016/baswinlan016_03.html
0180デフォルトの名無しさん2007/09/28(金) 08:29:23
>>179
> 簡略化されているが

あかんやん
0181デフォルトの名無しさん2007/09/30(日) 07:42:09
複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを
オープンしたいのですが、方法はありますか?

Windows XP SP2
0182デフォルトの名無しさん2007/09/30(日) 08:21:40
bind
0183デフォルトの名無しさん2007/09/30(日) 10:03:51
すいませんclient側の話なんです。
bindってサーバ側ですよね。

NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
を指定して通信させたいのです。
0184デフォルトの名無しさん2007/09/30(日) 10:07:03
特定のNICのIPアドレスを使ってconnectしたいという事ですね。
0185デフォルトの名無しさん2007/09/30(日) 10:40:39
>NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
>を指定して通信させたいのです。

それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は
全部bind。
0186デフォルトの名無しさん2007/09/30(日) 10:41:32
>>183は思い込み激しす
0187デフォルトの名無しさん2007/09/30(日) 10:47:51
初学者は誰だって勘違いすることがある。
めげずにがんばれ。
0188デフォルトの名無しさん2007/09/30(日) 10:52:24
才能内から真だ
ほうがいいと思うけどね
こんなのもしマジでプロジェクトに
混じってたらすげーこえーしw

0189デフォルトの名無しさん2007/09/30(日) 10:59:37
>>188
あんたの部下は死にまくりだな
0190デフォルトの名無しさん2007/09/30(日) 11:24:52
bindできました!
0191デフォルトの名無しさん2007/09/30(日) 16:05:22
ム板でプロジェクトうんぬん云ってるDQNはマ板に逝け
0192デフォルトの名無しさん2007/09/30(日) 18:36:43
>>188
お前の部下になりたくない。
0193デフォルトの名無しさん2007/10/01(月) 02:24:15
>>1のFAQが404のためweb archiveのキャッシュのアドレスを張り。
リンク先を開くときはエンコード種類としてISO-2022-JPを選択する。
ttp://web.archive.org/web/20070624075248/www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
ttp://web.archive.org/web/20070703070513/http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
0194デフォルトの名無しさん2007/10/01(月) 23:26:27
質問があるのですが、友達の家から私の家まで通信実験を行いたいと思っています。
家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。
どういった方法があるのでしょうか。質問よろしくお願いします。
0195デフォルトの名無しさん2007/10/01(月) 23:41:12
お使いのプロバイダに訊け
0196デフォルトの名無しさん2007/10/02(火) 00:12:02
使ってるプロバイダとかあなたの家や友達の家のネットワーク構成によるけれど、
自宅までグローバルIPが割り当てられてる可能性は高いと思う
家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう
たぶんルータを挟んでるんじゃないかね
ルータにはグローバルIPが割り当てられてるかもしれんよ
ルータの設定画面かなんかで確認してみ
0197デフォルトの名無しさん2007/10/02(火) 00:32:22
>>195-196
意地悪だなぁ。ちゃんと質問してやれよ。
0198デフォルトの名無しさん2007/10/02(火) 00:35:47
>>194
板違い
0199デフォルトの名無しさん2007/10/02(火) 00:39:06
>>194
実験ならば どこかのCGIを読むようにするのが一番楽だよ
ちなみにどんな実験? 速度の検証とか?
接続確認のテストならばテストになってないが??
0200デフォルトの名無しさん2007/10/02(火) 00:46:01
ちょいと教えて
接続するクライアントソケットは
データーの種類によって分けた方が良い?

たとえば データーと制御データーがあった場合
1) ポートも分ける
2) ポートは同一だけどソケットを別にする
   (受信・送信バッファを個別に取られる事を期待)
3) ポートもソケットも同一で2つのデーターをプロトコルで分ける
   (ソケット別にしても内部的には同じ信号で扱われるから 1,2は
    効果なし)

0201デフォルトの名無しさん2007/10/02(火) 00:51:31
あと関連して もう1つごめん
2つのデーターは

A,Bの2つのデーターが有った場合
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る
2)極端な例で無い限りオーバーヘッドが大きくなるので
  気にしない

これはケースバイケースですが考え方としては?
0202デフォルトの名無しさん2007/10/02(火) 00:53:47
ごめん タイプミス
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る

                   ↓

1)・・ Bのデーターは Aが処理されるまで待たされるので・・
0203デフォルトの名無しさん2007/10/02(火) 00:54:04
理学部ktkr
まず目的を書け。
それと質問を推敲しろ。
02042002007/10/02(火) 01:15:38
ごめん分りにくかったね
通信の効率化をしたいわけなんだけど
早い話

内容の違うデーターを そのまま送受信するか
ある程度切って送るかです

たしか内部的には以下の処理を行っているはずですので
なにも考えずに送っても ある程度は効率化しているはずですが
みなさんはどうしてます?

■小さいデーターは優先されて送信する(ルーター依存?)
■送信データーはMTU値に切断され送信される
0205デフォルトの名無しさん2007/10/02(火) 01:23:15
実際に効率上の問題に直面してから考えればいいと思われ
0206デフォルトの名無しさん2007/10/02(火) 01:26:30
>>204
> ■小さいデーターは優先されて送信する(ルーター依存?)

どこの星の話ですか?
0207デフォルトの名無しさん2007/10/02(火) 01:27:30
まずはタイミングの門をくぐって
セキュリティ地獄に逝くのじゃ。
0208デフォルトの名無しさん2007/10/02(火) 01:27:18
>>204
0x20以上で構成してSTXとETXではさむ。
02092002007/10/02(火) 01:36:26
>>205まあ実際はそうなんだけど・・・・
正直 通信よりもアプリの見直しの方が効果あるだろうし
ちょっと例を書いてみます

データーA
WM_MOUSEMOVEからのデーターを送信する
8Byte程度のデーターを1秒間に100個ほど送る
(内部的に遅延されるので実際は2K程度)
リアルタイム性重視

データーB
1秒間に1度画面をキャプチャーして送る
1027 X 768 X 3バイト

この場合はどうする?
当然 差分を送るとか根本的な事は無しで

1)Socketを分ける・分けない ← 私的には意味無いと思ってる
2)データーをMTU毎(または適当なサイズ)に切って
  A,Bを混ぜて送信
02102002007/10/02(火) 01:39:03
>>206どこかで読んだ事あるんだけど
どこの星の話かは忘れた
Yahoo,OCNとかだと IPフォンのパケットは優先されてる
らしいから それと勘違いかな?
0211デフォルトの名無しさん2007/10/02(火) 01:59:17
>>193
復活してるみたい。
0212デフォルトの名無しさん2007/10/02(火) 02:16:57
>>210
そりゃQoSだな。
0213デフォルトの名無しさん2007/10/02(火) 09:20:09
>>209
なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない
そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い

ところで、それなんてスパイウェア?
0214デフォルトの名無しさん2007/10/02(火) 10:34:05
新手のwinny用黴菌つくってんのかも
0215デフォルトの名無しさん2007/10/02(火) 11:05:45
劣化VNC
02162002007/10/02(火) 12:02:31
>>213
だからあくまでも例だって・・・・
そもそも通信効率以前の問題だし
劣化 VNC画面・マウスの送る方向違うし
>>212 にあるような仕組みを自前で実装してるのか
聞きたかった

0217デフォルトの名無しさん2007/10/02(火) 12:13:16
>>216 失せろ厨房
0218デフォルトの名無しさん2007/10/02(火) 12:50:02
>>216
やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。
後は、多重化を自前でやるかTCP/IPスタックにやらせるか。

>1)Socketを分ける・分けない ← 私的には意味無いと思ってる
意味無くない。
>2)データーをMTU毎(または適当なサイズ)に切って
>  A,Bを混ぜて送信
この程度でMTUなんか無関係。

小賢しいこと考える前に手を動かせ。
他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。
0219デフォルトの名無しさん2007/10/02(火) 13:21:23
VNCやRDPを調べればいい。
0220デフォルトの名無しさん2007/10/02(火) 23:30:42
>>216
簡単に高速かする方法あるよ?

FPGAで作ればいいんだよw
0221デフォルトの名無しさん2007/10/03(水) 00:26:23
鯖よりボードの方が高いw
0222デフォルトの名無しさん2007/10/03(水) 03:58:44
> (内部的に遅延されるので実際は2K程度)

よくわからんけど Nagle を止めれば済む話?
0223デフォルトの名無しさん2007/10/03(水) 12:18:04
その手の通信ってトンネリンングさせるかも知らんし、
生パケットがどう飛ぶかなんて議論は意味ない気がする。
画面データはアイドル状態待ってから飛ばせばいいし、
移動系メッセージなら100命令飛ばすんじゃなくて
1命令にまとめる事でも考えた方が。
pcAnywhereは反応重かったな。
0224デフォルトの名無しさん2007/10/03(水) 19:44:50
ネットワークプログラミング初学者です。
サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、
通信実験のデバッグを簡単に行える方法ないですか?
今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。
といった面倒なデバッグ方法です。><
よろしくお願いします。
0225デフォルトの名無しさん2007/10/03(水) 19:47:49
両方ともメインPCで動かす
0226デフォルトの名無しさん2007/10/03(水) 21:23:41
VMware/VirtualPC/Paralles/VirtualBoxで仮想PCを用意する。
0227デフォルトの名無しさん2007/10/03(水) 21:32:58
ネットワーク上繋がってるPCなのにUSBメモリでコピーって意味わからん
0228デフォルトの名無しさん2007/10/04(木) 13:46:58
ネットワークの共有も知らんでネットワークプログラミングとか大丈夫?
0229デフォルトの名無しさん2007/10/04(木) 16:55:35
C#.NETでストリーミングデータの受信のプログラムを
作成しているのですが、Socket.Selectが思った通りに動作していません…

ストリーミングのデータ形式は
ヘッダ2バイト
サイズ2バイト
以下データ
このような形式なのですが、受信をしていくうちに、サーバー側の
送信に追いついてしまい、サイズ2バイトで指定されたデータが
読めない状態になってます

Socket.Select( SocketList. null, null, 100 );
でリードできることは確認しているのですが、
sock.Receiveでデータの部分が数バイトしか読めない状態です
ソケットはブロッキングで別スレッドで読み込みをしています

PerlやWinsockのSelectとは動作が違うのでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします
0230デフォルトの名無しさん2007/10/04(木) 17:05:16
>>229
selectはあくまで「データがあるかどうか」を調べるだけ。
何バイトあるかなんて知らん。

・データがあれば読み込んでローカルのバッファに溜める
・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始

を独立に行えばいい。
複数データが一度にreadできてしまうこともちゃんと考えとけよ。
0231デフォルトの名無しさん2007/10/04(木) 17:12:55
>>229
ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。
0232デフォルトの名無しさん2007/10/04(木) 20:39:37
>>230 >>231
ありがとうございました。そのように実装したいと思います
0233デフォルトの名無しさん2007/10/04(木) 23:26:47
すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、
TELNETを使用しHTTPの勉強をしております
Yahooファイナンスから企業の情報を集めたいと思っています。

http://charge.quote.yahoo.co.jp/q?s=1301&d=t の情報を見たいとき
telnet charge.quote.yahoo.co.jp 80
Trying 124.83.147.185...
Connected to charge.quote.yahoo.co.jp.
Escape character is '^]'.
GET /q?s=1301&d=t
The document has moved <A HREF="http://quote.yahoo.co.jp/q?s=1301&;d=t">here</A>.<P>
<P>Additionally, a 302 Found
error was encountered while trying to use an ErrorDocument to handle the request.
となってしまい情報を見ることができないでいます
302なので/q?s=1301&d=t ←ここではないほかのURLに情報がありそうなのですが
http://charge.quote.yahoo.co.jp/q?s=1301&d=t の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか
0234デフォルトの名無しさん2007/10/04(木) 23:41:13
>>233
http://quote.yahoo.co.jp/q?s=1301&d=t

レスポンスに書いてるじゃん。
このドキュメントはhttp://quote〜〜にうつってますよ、って。
0235デフォルトの名無しさん2007/10/05(金) 00:07:57
>>234
ありがとうございます
恥ずかしい、、、、、申し訳ないです
0236デフォルトの名無しさん2007/10/05(金) 01:19:53
てゆーかさ、GETをHTTP/0.9でやってるから
レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。
0237デフォルトの名無しさん2007/10/05(金) 23:31:07
FORMのPOSTをGETでアクセスできない事があるんですが?
0238デフォルトの名無しさん2007/10/06(土) 00:15:33
そうですか。
0239デフォルトの名無しさん2007/10/06(土) 02:43:09
http://www.premiumtv.12gbfree.com/?X3/?RTV+4277/NicoVideo1000
0240デフォルトの名無しさん2007/10/07(日) 00:22:02
ノンブロックなソケットディスクリプタでサーバにコネクトするときに
そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?
02412402007/10/07(日) 00:23:57
ミーがユーズしてるOSはLinuxです
0242デフォルトの名無しさん2007/10/07(日) 00:24:10
たしかselectで書き込み可能が帰ってきたらコネクト完了
02432402007/10/07(日) 00:27:21
>>242
ハリーなアンサー サンキューです。

バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。
0244デフォルトの名無しさん2007/10/07(日) 06:18:17
getpeername(2)がENOTCONを返さなくなった時がcomplete
0245デフォルトの名無しさん2007/10/07(日) 06:46:13
write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって
非同期モードですか?

環境はWindows 2000 XPです。
0246デフォルトの名無しさん2007/10/07(日) 06:52:08
というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。
「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。
0247デフォルトの名無しさん2007/10/07(日) 07:20:42
>>246
接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。
0248デフォルトの名無しさん2007/10/07(日) 08:49:42
納得いきました。
ありがとうございます。
0249デフォルトの名無しさん2007/10/07(日) 16:39:49
lingerがよくわからないんだけど

今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。

そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする

と言うのであってるんですかね?
0250デフォルトの名無しさん2007/10/07(日) 17:43:11
タイムアウトが起きると送信放棄。shutdownのabortが起きる。
その他はまあそういうこと。

MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure
0251デフォルトの名無しさん2007/10/12(金) 16:12:26
日本信号の改札機はなぜ起動しなかったのでしょうか?
0252デフォルトの名無しさん2007/10/12(金) 17:48:09
スレ違いだったらすみません。

DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。

ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。

RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。

動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。
0253デフォルトの名無しさん2007/10/12(金) 18:15:36
動画ファイルの種類に寄る。
動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。
0254デフォルトの名無しさん2007/10/13(土) 14:05:15
>>252
ファイル出力が完了しなくても再生をはじめれば?
0255デフォルトの名無しさん2007/10/14(日) 22:58:38
YahooファイナンスってKeep-Alive使えないんですかね

毎回接続し直すの面倒なんですけど…
0256デフォルトの名無しさん2007/10/15(月) 06:32:25
ぇ
0257デフォルトの名無しさん2007/10/19(金) 09:02:36
TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。
非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。

ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ

ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、

while(ファイル読み込みが終わるまで){
  send()
}

だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m
0258デフォルトの名無しさん2007/10/19(金) 09:23:05
>>257
WOULDBLOCKならあとで続きを送信する
■ このスレッドは過去ログ倉庫に格納されています