1 名前:ftp-data mailto:sage [2007/08/07(火) 01:47:35 ] 主にソケットに関しての質疑応答スレッドです。 Programming UNIX Socket FAQ (日本語訳) www.kt.rim.or.jp/~ksk/sock-faq/indexj.html Winsock Programmer's FAQ (日本語訳) www.kt.rim.or.jp/~ksk/wskfaq-ja/ 関連リンクは>>2-10 辺り 足りなかったら適当に付け足してね 前スレ ネットワークプログラミング相談室 Port19 pc10.2ch.net/test/read.cgi/tech/1159692799/ 関連スレ Java ネットワークプログラミング 【教えて!】 pc11.2ch.net/test/read.cgi/tech/1086238859/
175 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 20:06:08 ] >>173 クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
176 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:13:10 ] おまえら, なんかトラブったときに TCP のステートダイアグラム 見ないでプログラム修正とかしてるのか?
177 名前:150 mailto:sage [2007/09/27(木) 10:53:38 ] 一向に解決しなかったけど、今の状態で妥協する形になりました。 助言くれたかたサンクスです。 >>176 TCP のステートダイアグラム とは?
178 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 11:12:53 ] www5d.biglobe.ne.jp/~stssk/rfc/rfc793j.html Figure 6. TCP Connection State Diagram
179 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:06:29 ] tools.ietf.org/html/rfc793#section-3.2 か、あるいは簡略化されているが↓のも見やすいよ www.atmarkit.co.jp/fwin2k/network/baswinlan016/baswinlan016_03.html
180 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 08:29:23 ] >>179 > 簡略化されているが あかんやん
181 名前:デフォルトの名無しさん [2007/09/30(日) 07:42:09 ] 複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを オープンしたいのですが、方法はありますか? Windows XP SP2
182 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:21:40 ] bind
183 名前:デフォルトの名無しさん [2007/09/30(日) 10:03:51 ] すいませんclient側の話なんです。 bindってサーバ側ですよね。 NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス) を指定して通信させたいのです。
184 名前:デフォルトの名無しさん [2007/09/30(日) 10:07:03 ] 特定のNICのIPアドレスを使ってconnectしたいという事ですね。
185 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:40:39 ] >NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス) >を指定して通信させたいのです。 それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は 全部bind。
186 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:41:32 ] >>183 は思い込み激しす
187 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:47:51 ] 初学者は誰だって勘違いすることがある。 めげずにがんばれ。
188 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:52:24 ] 才能内から真だ ほうがいいと思うけどね こんなのもしマジでプロジェクトに 混じってたらすげーこえーしw
189 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:59:37 ] >>188 あんたの部下は死にまくりだな
190 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:24:52 ] bindできました!
191 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 16:05:22 ] ム板でプロジェクトうんぬん云ってるDQNはマ板に逝け
192 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 18:36:43 ] >>188 お前の部下になりたくない。
193 名前:デフォルトの名無しさん mailto:sage [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/www.kt.rim.or.jp/~ksk/wskfaq-ja/
194 名前:デフォルトの名無しさん [2007/10/01(月) 23:26:27 ] 質問があるのですが、友達の家から私の家まで通信実験を行いたいと思っています。 家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。 どういった方法があるのでしょうか。質問よろしくお願いします。
195 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 23:41:12 ] お使いのプロバイダに訊け
196 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:12:02 ] 使ってるプロバイダとかあなたの家や友達の家のネットワーク構成によるけれど、 自宅までグローバルIPが割り当てられてる可能性は高いと思う 家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう たぶんルータを挟んでるんじゃないかね ルータにはグローバルIPが割り当てられてるかもしれんよ ルータの設定画面かなんかで確認してみ
197 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:32:22 ] >>195-196 意地悪だなぁ。ちゃんと質問してやれよ。
198 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:35:47 ] >>194 板違い
199 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:39:06 ] >>194 実験ならば どこかのCGIを読むようにするのが一番楽だよ ちなみにどんな実験? 速度の検証とか? 接続確認のテストならばテストになってないが??
200 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:46:01 ] ちょいと教えて 接続するクライアントソケットは データーの種類によって分けた方が良い? たとえば データーと制御データーがあった場合 1) ポートも分ける 2) ポートは同一だけどソケットを別にする (受信・送信バッファを個別に取られる事を期待) 3) ポートもソケットも同一で2つのデーターをプロトコルで分ける (ソケット別にしても内部的には同じ信号で扱われるから 1,2は 効果なし)
201 名前:デフォルトの名無しさん [2007/10/02(火) 00:51:31 ] あと関連して もう1つごめん 2つのデーターは A,Bの2つのデーターが有った場合 1)大きなデーターAをそのまま送ると Bのデーターは Aが処理されるので MTUを参考に分割してBのデーターを 混ぜて送る 2)極端な例で無い限りオーバーヘッドが大きくなるので 気にしない これはケースバイケースですが考え方としては?
202 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:53:47 ] ごめん タイプミス 1)大きなデーターAをそのまま送ると Bのデーターは Aが処理されるので MTUを参考に分割してBのデーターを 混ぜて送る ↓ 1)・・ Bのデーターは Aが処理されるまで待たされるので・・
203 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 00:54:04 ] 理学部ktkr まず目的を書け。 それと質問を推敲しろ。
204 名前:200 mailto:sage [2007/10/02(火) 01:15:38 ] ごめん分りにくかったね 通信の効率化をしたいわけなんだけど 早い話 内容の違うデーターを そのまま送受信するか ある程度切って送るかです たしか内部的には以下の処理を行っているはずですので なにも考えずに送っても ある程度は効率化しているはずですが みなさんはどうしてます? ■小さいデーターは優先されて送信する(ルーター依存?) ■送信データーはMTU値に切断され送信される
205 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 01:23:15 ] 実際に効率上の問題に直面してから考えればいいと思われ
206 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 01:26:30 ] >>204 > ■小さいデーターは優先されて送信する(ルーター依存?) どこの星の話ですか?
207 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 01:27:30 ] まずはタイミングの門をくぐって セキュリティ地獄に逝くのじゃ。
208 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 01:27:18 ] >>204 0x20以上で構成してSTXとETXではさむ。
209 名前:200 mailto:sage [2007/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を混ぜて送信
210 名前:200 mailto:sage [2007/10/02(火) 01:39:03 ] >>206 どこかで読んだ事あるんだけど どこの星の話かは忘れた Yahoo,OCNとかだと IPフォンのパケットは優先されてる らしいから それと勘違いかな?
211 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 01:59:17 ] >>193 復活してるみたい。
212 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 02:16:57 ] >>210 そりゃQoSだな。
213 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 09:20:09 ] >>209 なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い ところで、それなんてスパイウェア?
214 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 10:34:05 ] 新手のwinny用黴菌つくってんのかも
215 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 11:05:45 ] 劣化VNC
216 名前:200 mailto:sage [2007/10/02(火) 12:02:31 ] >>213 だからあくまでも例だって・・・・ そもそも通信効率以前の問題だし 劣化 VNC画面・マウスの送る方向違うし >>212 にあるような仕組みを自前で実装してるのか 聞きたかった
217 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 12:13:16 ] >>216 失せろ厨房
218 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 12:50:02 ] >>216 やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。 後は、多重化を自前でやるかTCP/IPスタックにやらせるか。 >1)Socketを分ける・分けない ← 私的には意味無いと思ってる 意味無くない。 >2)データーをMTU毎(または適当なサイズ)に切って > A,Bを混ぜて送信 この程度でMTUなんか無関係。 小賢しいこと考える前に手を動かせ。 他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。
219 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:21:23 ] VNCやRDPを調べればいい。
220 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:30:42 ] >>216 簡単に高速かする方法あるよ? FPGAで作ればいいんだよw
221 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 00:26:23 ] 鯖よりボードの方が高いw
222 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 03:58:44 ] > (内部的に遅延されるので実際は2K程度) よくわからんけど Nagle を止めれば済む話?
223 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 12:18:04 ] その手の通信ってトンネリンングさせるかも知らんし、 生パケットがどう飛ぶかなんて議論は意味ない気がする。 画面データはアイドル状態待ってから飛ばせばいいし、 移動系メッセージなら100命令飛ばすんじゃなくて 1命令にまとめる事でも考えた方が。 pcAnywhereは反応重かったな。
224 名前:デフォルトの名無しさん [2007/10/03(水) 19:44:50 ] ネットワークプログラミング初学者です。 サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、 通信実験のデバッグを簡単に行える方法ないですか? 今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。 といった面倒なデバッグ方法です。>< よろしくお願いします。
225 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:47:49 ] 両方ともメインPCで動かす
226 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:23:41 ] VMware/VirtualPC/Paralles/VirtualBoxで仮想PCを用意する。
227 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:32:58 ] ネットワーク上繋がってるPCなのにUSBメモリでコピーって意味わからん
228 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 13:46:58 ] ネットワークの共有も知らんでネットワークプログラミングとか大丈夫?
229 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:55:35 ] C#.NETでストリーミングデータの受信のプログラムを 作成しているのですが、Socket.Selectが思った通りに動作していません… ストリーミングのデータ形式は ヘッダ2バイト サイズ2バイト 以下データ このような形式なのですが、受信をしていくうちに、サーバー側の 送信に追いついてしまい、サイズ2バイトで指定されたデータが 読めない状態になってます Socket.Select( SocketList. null, null, 100 ); でリードできることは確認しているのですが、 sock.Receiveでデータの部分が数バイトしか読めない状態です ソケットはブロッキングで別スレッドで読み込みをしています PerlやWinsockのSelectとは動作が違うのでしょうか? 基本的な質問で申し訳ないですが、よろしくお願いします
230 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 17:05:16 ] >>229 selectはあくまで「データがあるかどうか」を調べるだけ。 何バイトあるかなんて知らん。 ・データがあれば読み込んでローカルのバッファに溜める ・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始 を独立に行えばいい。 複数データが一度にreadできてしまうこともちゃんと考えとけよ。
231 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 17:12:55 ] >>229 ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。 そういう前提で扱う必要がある。 100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。
232 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:39:37 ] >>230 >>231 ありがとうございました。そのように実装したいと思います
233 名前:デフォルトの名無しさん [2007/10/04(木) 23:26:47 ] すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、 TELNETを使用しHTTPの勉強をしております Yahooファイナンスから企業の情報を集めたいと思っています。 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="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に情報がありそうなのですが charge.quote.yahoo.co.jp/q?s=1301&d=t の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか
234 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:41:13 ] >>233 quote.yahoo.co.jp/q?s=1301&d=t レスポンスに書いてるじゃん。 このドキュメントはquote 〜〜にうつってますよ、って。
235 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 00:07:57 ] >>234 ありがとうございます 恥ずかしい、、、、、申し訳ないです
236 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 01:19:53 ] てゆーかさ、GETをHTTP/0.9でやってるから レスポンスヘッダが付かなくて 302なレスポンスであってもLocation等で判断できないんだけど わかってるのかね。
237 名前:デフォルトの名無しさん mailto:age [2007/10/05(金) 23:31:07 ] FORMのPOSTをGETでアクセスできない事があるんですが?
238 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:15:33 ] そうですか。
239 名前:デフォルトの名無しさん mailto:age [2007/10/06(土) 02:43:09 ] www.premiumtv.12gbfree.com/?X3/?RTV+4277/NicoVideo1000
240 名前:デフォルトの名無しさん [2007/10/07(日) 00:22:02 ] ノンブロックなソケットディスクリプタでサーバにコネクトするときに そのコネクトがコンプリートしたかのステータスをゲットしたい。 ミーは何をドゥーすればいいの?
241 名前:240 mailto:sage [2007/10/07(日) 00:23:57 ] ミーがユーズしてるOSはLinuxです
242 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 00:24:10 ] たしかselectで書き込み可能が帰ってきたらコネクト完了
243 名前:240 mailto:sage [2007/10/07(日) 00:27:21 ] >>242 ハリーなアンサー サンキューです。 バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。 ワンモアトライしてみます。
244 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:18:17 ] getpeername(2)がENOTCONを返さなくなった時がcomplete
245 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:46:13 ] write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって 非同期モードですか? 環境はWindows 2000 XPです。
246 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 06:52:08 ] というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。 「ソケットの送信バッファに空きができたことを通知」とのことですが、 一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。
247 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 07:20:42 ] >>246 接続確立時に一回だけFD_WRITEの通知がきた気がする その後は、バッファに空きのない状態→空きのできた状態、になったとき、 つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。
248 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 08:49:42 ] 納得いきました。 ありがとうございます。
249 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 16:39:49 ] lingerがよくわからないんだけど 今の理解は ・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。 そこで質問は ・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない? ・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする と言うのであってるんですかね?
250 名前:デフォルトの名無しさん mailto:sage [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
251 名前:デフォルトの名無しさん [2007/10/12(金) 16:12:26 ] 日本信号の改札機はなぜ起動しなかったのでしょうか?
252 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 17:48:09 ] スレ違いだったらすみません。 DirectShowで動画再生するソフトを作ったんですけど 現在は再生する動画はローカルにある動画のみなので これをストリーミングに対応させたいと思っています。 ストリーミングについてRTPなどのプロトコルも調べたんですが Winsockを用いての実装手順がいまいち分かりません。 RTPのパケットを自分で実装して、データを入れる領域に 動画のフレーム、音声データを入れる形でしょうか。 動画ファイル自体をバイナリデータとして送り、ファイル出力された 動画ファイルを再生することなら出来るんですけど、ストリーミング の実装は実際にはどのような手順で行えばよいでしょうか。
253 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 18:15:36 ] 動画ファイルの種類に寄る。 動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。 AVIファイルをストリーミングさせるってのはナシな。
254 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 14:05:15 ] >>252 ファイル出力が完了しなくても再生をはじめれば?
255 名前:デフォルトの名無しさん mailto:sage [2007/10/14(日) 22:58:38 ] YahooファイナンスってKeep-Alive使えないんですかね 毎回接続し直すの面倒なんですけど…
256 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 06:32:25 ] ぇ
257 名前:デフォルトの名無しさん [2007/10/19(金) 09:02:36 ] TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。 非同期において送信する場合どのように設計すればいいのかイマイチわかりません。 やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。 ファイルの送信要求メッセージを受信 ファイルをバイナリモードでオープン 4096バイトずつ読み込んでsend() ファイルをクローズ ファイルを送信した後も継続して通信は行います。 sendもノンブロッキングになってるため、 while(ファイル読み込みが終わるまで){ send() } だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると WOULDBLOCKという現象が起こって送信できない事があるとの事です。 FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。 どなたかご教授願いますm(_ _)m
258 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:23:05 ] >>257 WOULDBLOCKならあとで続きを送信する
259 名前:デフォルトの名無しさん [2007/10/20(土) 00:07:00 ] >>257 sendも非同期ですべてやればOK。 自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在 何バイト送ったのか全部管理しる。
260 名前:デフォルトの名無しさん [2007/10/20(土) 00:09:54 ] Linuxネットワークプログラミングを勉強したいのですけど、このページの下で紹介されている本でいいのでしょうか。 ttp://www.geekpage.jp/programming/linux-network/ もっといい本があったら紹介していただけないでしょうか
261 名前:デフォルトの名無しさん [2007/10/20(土) 04:31:18 ] >>258-259 えっと、同期ならこんな感じの送信です。 while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){ send(sock, sendbuf, read_byte, 0); memset(sendbuf, NULL, sizeof(sendbuf)); } WOULDBLOCKなら後で続きを送信するというのはこういう事でしょうか? while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){ if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){ while( WSAGetLastError()==WOULDBLOCK ){ send(sock, sendbuf, read_byte, 0); } } memset(sendbuf, NULL, sizeof(sendbuf)); } あまり非同期っぽい書き方じゃないですが・・・。>>259 さんのはちょっと理解が出来ないです。 send待ちとはどういう状況の事を言うのでしょうか?
262 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 05:32:52 ] UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて 総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが 難しいので2冊目の本として考えておいた方がよいとおもいます 言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7) がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。 内容もわかりやすく、本も薄めなので挫折する心配も少ない。
263 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:34:53 ] >>261 同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数) 非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。
264 名前:デフォルトの名無しさん [2007/10/20(土) 08:47:52 ] >>263 てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか? // 送信可能フラグをたてる case FD_WRITE: send_flag = TRUE; return 0; // ファイル送信スレッド while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){ send_flag = FALSE; if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){ while( WSAGetLastError()==WOULDBLOCK ){ while( send_flag == FALSE ) Sleep(100); send(sock, sendbuf, read_byte, 0); } } memset(sendbuf, NULL, sizeof(sendbuf)); } こんな感じでいいのかな・・・?
265 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:59:55 ] >>264 何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。 WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて www.amazon.co.jp/exec/obidos/ASIN/4797330449/ 猫でもわかるネットワークプログラミング 第2版 www.amazon.co.jp/exec/obidos/ASIN/4797334797/
266 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:03:16 ] >>264 それじゃ、下のwhileループ群が同期になってしまうよー 慣れないうちは送信用のキューを用意すると良いかも。 キューに追加するのは自分の好きなタイミングで行い、 実際のsendやFD_WRITEの処理部分と分ける。 >>265 も書いてる通り、適当なサンプル眺めれば見えてくるかもね。
267 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:47:26 ] e1000の改造について詳しいドキュメントちょうだい
268 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:56:35 ] >>265 ん〜書籍を買うのに金銭的余裕が・・・。 月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。 >>266 色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。 FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか? FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。 キューを実装するということは、こういう感じで実装するということですかね・・・ while( fread(buf) ){ push(buf); } PostMessage(,,FD_WRITE,); FD_WRITE: if( キューにメッセージがあれば ){ sendbuf = pup(); send(sock, sendbuf, sizeof(sendbuf), 0); } return 0;
269 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 09:57:20 ] pushとかpopとかこれじゃスタックっぽいですね。 脳内でキューに変換してくださいm(_ _)m
270 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 10:04:25 ] >>268 FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。 (自分でPostするものではない) つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。 キューへのpushは好きなようにすればい。 サンプルもネットに転がってるはずだから調べよう。
271 名前:260 mailto:sage [2007/10/20(土) 10:15:22 ] >>262 情報ありがとうございました。探してみます
272 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:36:48 ] >>262 横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。
273 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 13:57:44 ] >>268 >FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか? >FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。 「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。 send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。 FD_WRITE が来たら、覚えておいたデータを改めて送信する。 そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。 ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。 あと、send は渡したデータをすべて送信できる保証はない。 例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。 何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。
274 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 14:52:02 ] なぜそんなに面倒なんですか バカみたいですね
275 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:04:36 ] なぜって、非同期だからさ バカみたいだろ? おとなしく同期ソケット使っとけ