- 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/
- 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 ]
- なぜって、非同期だからさ
バカみたいだろ? おとなしく同期ソケット使っとけ
- 276 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 15:29:06 ]
- >>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。 キーワードは「継続」だ。 まあ、この程度なら別にコルーチンを使うまでもないがな。
- 277 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:12:58 ]
- サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?
- 278 名前:デフォルトの名無しさん [2007/10/20(土) 18:08:48 ]
- すいません。
初心者のくだらない質問を受けてください。 javascriptをHTMLの中に記述して様々なことができるのは、何となく わかりましたが、第三者に見られてはいけないプログラムはどうやって行って いるのでしょうか? つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが 定義されていて、命令されているのはわかりますが、googleで例えると 肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー の厳重な管理の中で動いているわけですよね? それが見れないのは当然でわかっているのですが、HTMLのソースに記述 するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は 記述しないのでしょうか? またgoogleの検索プログラムもやはりjavaやphpなんですか? それともC言語系とかなんでしょうか? 何が言いたいのか自分でもわからなくなりましたが、どなたか教えて ください。
- 279 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:13:07 ]
- >>278
WebProg板へいってこい
- 280 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:30:30 ]
- >>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる もまいの要求はブラウザから見れないプログラムなのだから WebProg板へいってこい
- 281 名前:デフォルトの名無しさん [2007/10/20(土) 18:50:18 ]
- >>280
ありがとうございました。 そういうことでしたか。
- 282 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 22:56:16 ]
- サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると いうことをします。 この時、サーバにデータ保存する保証方法なんか みんなどうしていますか?RAID以外にどんな技術 組み合わせる?
- 283 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 01:01:25 ]
- 信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな データが改ざんされてないか調べるならハッシュ関数つかうけどな
- 284 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:49:11 ]
- winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど 複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの? 例えば10レコードのデータを送信する時など ループで10回実行するか、1回だけ実行するかで効率が変わるのかな? OSが勝手に送信バッファをいい具合に設定してくれる? 言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く
- 285 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:34:53 ]
- >>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。 Unixでいうwritev()。 そうできるんなら、配列使ったほうが効率はいいはずだ。 writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。 MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。
- 286 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 20:54:22 ]
- 0バイトのデータをsendする方法はありますか?
- 287 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:32:07 ]
- 0バイトのデータをsendすることに何の意味が?
- 288 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 22:32:57 ]
- ping代わり?
- 289 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 23:16:08 ]
- connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認 したいの・・・
- 290 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 02:31:33 ]
- 0byte送って確認するのか。
斬新なアイディアだ。
- 291 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:19:40 ]
- いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。
- 292 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:51:28 ]
- >>289
connectでwrite可能になったというのは3way handshakeがとりあえず 成功した訳だから改めて接続を確認する必要もないんじゃない? >>290 tcp keepalive
- 293 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 05:02:20 ]
- >>292
write可能であっても成功したとは限らないの・・・
- 294 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 08:58:35 ]
- >>293
connect時の最後のackが届かなかった場合? 最初のsendでエラー処理をするんじゃダメなんだろうか?
- 295 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:48:51 ]
- そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?
- 296 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:52:08 ]
- そんなことは聞く前にソケットFAQ読め。
- 297 名前:292 mailto:sage [2007/10/24(水) 10:14:48 ]
- >>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。
- 298 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 10:59:21 ]
- FAQくらい理解してから、人にアドバイスしよう。
www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html 3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?
- 299 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:05:01 ]
- >>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。
- 300 名前:デフォルトの名無しさん [2007/10/25(木) 00:56:29 ]
- サーバー用のソケットは
socketでソケット作成 bindでポート番号とかに結びつける listenで聞く??? acceptでクライアント接続を待ちの後 交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?
- 301 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 06:54:40 ]
- ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・ 要は一気に接続要求が来たときに待ってもらう数な。
- 302 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 10:23:58 ]
- データを送信した時に全データが送られないってことがあるじゃないですか。
これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか? どんな設定をしたらいいですかね? setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・ 全データ遅れなかった時の動作が確認できないんです・・・
- 303 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:47:12 ]
- >>300
listen で実際にサーバのポートを開く。 socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。
- 304 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:50:48 ]
- >>302
受信側の受信バッファも小さくしてみたら? あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。 1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。
- 305 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 11:52:46 ]
- >>304
回答ありがとうございます ちょうど今自己解決しました 送信データを1バイトずつSendしたらなりました
- 306 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 15:37:11 ]
- nagleを切ればいいだろ
- 307 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:17:23 ]
- >>306
やっぱり、全然無理でした。 どうやったらできるんだろ? カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ? 送信バッファ 30バイト、送信データ100バイトとした時 send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?
- 308 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:19:18 ]
- ちなみに
サーバをIOCPで実装しています。WSASend, WSARecvを実行しています
- 309 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:19:54 ]
- だから正確にはsend関数は使ってません
- 310 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 23:37:18 ]
- TCPのチェックサムって計算
仮想ヘッダ+TCPヘッダ+ペイロードだよね? 仮想ヘッダとTCPヘッダはいいけど ペイロードってどこまでなの? HTTPとかTCPの下になんかプロトコル付く場合 だけ計算みする
- 311 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 23:45:01 ]
- >>310
> ペイロードってどこまでなの? 全部(もしデータが奇数だったら1バイトの0x00を付加)
- 312 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 03:14:59 ]
- >>307
TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは あんまりあてにならない。
- 313 名前:デフォルトの名無しさん [2007/11/02(金) 15:00:24 ]
- winsockでTCPでプログラミングをしているのですが、
たまに接続が上手くいかない時があります。 connect()を実行しても、タイムアウトになってしまいます。 一度プログラムを終了して、再度connect()したら普通に接続できます。 上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?
- 314 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:07:17 ]
- たまたまサーバや回線が混雑してて繋がらなかったとかじゃないか
WSAGetLastErrorでエラーの詳細を確認しる
- 315 名前:デフォルトの名無しさん [2007/11/02(金) 15:16:06 ]
- >>314
connect()のエラーは10060でした。 多分タイムアウトだと思うのですが・・・。 while(SOKET_ERROR){ connect(); } のような感じにしていて、常に10060が返って来ます。 ネットは色んなHPを見て回れるので混雑してるとかではないと思います。 ↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、 普通に接続が出来たので、サーバが原因ではない事は分かってます。
- 316 名前:デフォルトの名無しさん [2007/11/02(金) 15:31:53 ]
- connectに失敗した場合、closesocketをして、再度ソケットを作成、サーバのアドレスの設定等を行い、
その後またconnect()を実行する事で、サーバに接続する事は出来ました。 しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。 connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・ 一体何が原因なのでしょうか・・・。
- 317 名前:デフォルトの名無しさん mailto:age [2007/11/02(金) 15:43:53 ]
- videointroplayer.web.fc2.com/?qNwShNJEoik147%+mLB7Dx21F8r143%+4xdtm5JqwQi401%+m85hSceZi1I563%+8f5dPn0_ZJL484%+@1@_AutomaticPlay
- 318 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:28:53 ]
- サーバは何?誰がどうやって作ったもの?
- 319 名前:デフォルトの名無しさん [2007/11/03(土) 18:07:41 ]
- サーバは自分で作りました。これもC、Winsockで作ってます。
- 320 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:35:35 ]
- >>316
connectのエラーコードは何だよ。それくらい書けばいいのに。
- 321 名前:デフォルトの名無しさん [2007/11/03(土) 19:50:06 ]
- >>320
>>315
- 322 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 19:59:43 ]
- >> 316
九割九分九厘名無氏作蟲
- 323 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 20:09:08 ]
- >>316
タイムアウトだから、>>314が言っているような感じなんじゃね? 起きている事象として把握できているのが、10060だけだと考えるのはキツイかも。 回線の種別(loopback、外部への接続)とか、connectの頻度とか、 connectがエラーになる接続先は常に同一なのかとか、その辺はどうなのだろう? あと、クライアントとサーバと両方を自分で作っているのなら、connectと acceptの数や時刻をログ出力して比較してみるとか。 いくつか考えうる要因をピックアップして調べてみては?
- 324 名前:デフォルトの名無しさん [2007/11/03(土) 20:25:01 ]
- >>323
しかし、connect()に失敗したら再度connect()を実行するような設計にしています。 回線の混雑が理由だったら、いつかは接続できそうな気が・・・。実際はこの状態になるといつまでも10060を返し続けます。 また、10060を返してる間に、他のクライアントプログラムを実行しサーバの同じポートにconnect()を実行したら普通に接続できました。 もちろん同じPCからです。また、10060を返した後にソケット破棄⇒再生成してconnect()を実行すると接続できるので、 どうもネットワークの混雑という理由は考えにくいような気がします。とはいえ、ネットワークの問題は原因が特定しにくいので、 完全にそうではないとは言い切れないです。 connectの頻度はそう多くないのですが、まずサーバに接続し、その直後にもう一つ接続を作ります。 この2つ目の接続でconnect()エラーが発生します。2つ目の接続はファイルの送受信用のソケットで、スレッドを立ててそちらで処理しています。 なのでacceptとconnectの数は2回ですね。
- 325 名前:デフォルトの名無しさん [2007/11/03(土) 20:40:58 ]
- もしかして、connect()を短い間隔で2回やってるのが原因なのかなと思って、
2回目のconnect()をする前にSleep(200)を挟んで何度か実行したところ、 connect()でのエラーはなくなったように思えます。(まだ試行回数が多くないので分からないですが) 短い時間で連続してconnect()を実行した場合、何が起こるんですかね・・・?
- 326 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:14:09 ]
- 2MSL だろ
- 327 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:19:35 ]
- サーバのOSはWinXP ProとかHomeだったりするのかい
- 328 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 21:24:36 ]
- >>325
ファイアウォールのログは確認しておいてね。
- 329 名前:デフォルトの名無しさん [2007/11/03(土) 22:26:00 ]
- >>326
winsockの仕様というよりも、TCPの仕様ですか・・・。 でも通信をクローズしてないのに関係あるんですかね? 全然詳しくないので何ともいえないですが・・・ >>327 OSはWinXP HomeEdition ver.2002 SP2です。 >>328 火壁のログの確認・・・ググってきます
- 330 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:37:40 ]
- >>324
まずは、ネットワークトレースを見てからだ。 10060なら、syn、syn-ackがどうなっているか確かめようぜ。
- 331 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 22:45:35 ]
- Linux使いなのでコード等よくわからんが、
ネットワークプログラミングのデバッグならパケットキャプチャだ。 WindowsならWiresharkがあるはず
- 332 名前:デフォルトの名無しさん [2007/11/03(土) 22:54:04 ]
- Wiresharkだったらこの間入れたはず。
でも、英語だらけで使い方がよく分からずに放置した記憶が・・・! syn、ackってTCPの3wayHandshakeとかの話ですよね? そんなところまで見れるとはなんと便利なソフトなのだろうか。 とりあえず使い方から調べなおしてちゃんと根本から問題解決するか・・・
- 333 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:15:51 ]
- 333ゲット
- 334 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:22:26 ]
- ところでみなさんGUIのネットワークプログラムを作るときは
非同期ソケットでスレッド1本派 同期ソケットでマルチスレッド派 のどっちですか?
- 335 名前:デフォルトの名無しさん [2007/11/03(土) 23:34:09 ]
- なんとかパケットキャプチャは出来たけど、実際見てもよく分からないという現実!
kjm.kir.jp/pc/?p=45801.png No.10-12が多分最初の接続ですね。その後のポート5000がファイル送受信用の接続です。 ポート番号については突っ込まないで下さい>< 最後の方で色々とsynとackを送りまくってますが、ここら辺がソケット破棄して再設定してconnect()してるあたりですかね・・・。 俺の知識じゃ、これ見て でっていう レベルなんですが・・・
- 336 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 23:41:58 ]
- よくわからんがNo.30とNo.50の 192.168.0.185:3739 -> 192.168.0.186:5000
に185が応答していないように見えるが。 ファイル送受信用、と言われても・・・そんなの話に出てきてないから・・・
- 337 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:01:32 ]
- XP Homeはサーバ用途が制限されていたような
- 338 名前:デフォルトの名無しさん [2007/11/04(日) 00:01:49 ]
- >>336
>>324で一応書いたつもりでしたが、ちょっとゴチャゴチャして見にくかったですねm(_ _)m 多分34、50、63のSYNを送ってサーバからの応答がないままタイムアウトになって、 ソケット破棄、ソケットの再生成と再設定⇒connect()が67で、その後の応答とかが68、69で 接続が確立してるっぽいですね。それ以降のものはファイル送受信のパケットだと思います。 見る限り、サーバからのACKが返ってこないようですが、クライアントからのSYNは送られてるんですよね。。。 サーバにそれが届いてないか、サーバに届いてるけど、サーバが送り返してくるSYN,ACKが途中でパケットロスしてるのか・・・。
- 339 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:11:49 ]
- >>338
ポート5000からの応答が無いな。そっちを調べるしかないだろ。
- 340 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:13:42 ]
- >>335
ポート5000ってのはナンダヨ。サーバー側のプログラムが悪いんじゃないのか。
- 341 名前:デフォルトの名無しさん [2007/11/04(日) 00:29:10 ]
- >>340
ん、どういう事ですか?あまり49151以下の予約済みポートは使わない方がいいって事ですか? とりあえずサーバ側のプログラムを再度見直してみます。
- 342 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 00:34:25 ]
- >>334
ケースバイケースだろ。
- 343 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 01:49:58 ]
- netlinkの使い方を日本語で詳しく説明してるサイトないかな?
Manpage of NETLINK以外で
- 344 名前:デフォルトの名無しさん [2007/11/04(日) 06:18:34 ]
- サーバ側が、50000番の接続要求に反応しない理由を調べたほうがいい。
1.サーバ上で、50000番への接続受付が満杯 2.サーバ上で、50000番がまだ再利用可能ではない(サーバ上で、netstatして50000番の状態を調べれ) 4.サーバが再起動した 3.パケットロスが発生してる(ローカルネットワークじゃ考えにくいと思う) 1,2,3,4の順で可能性は高いと思う
- 345 名前:323&328 mailto:sage [2007/11/04(日) 07:14:35 ]
- >>341
ファイアウォールのログは見てみた? SYN floodか何かに判定されてコネクション要求がファイアウォールで破棄されていないかな、 と思ったんだが。 …もしかして、俺、考えている方向ずれてる? そうだとしたら、すまん。 クライアントとサーバのプログラムにログ出力を付け加えて、コネクションの確立の 様子を見るのもあり。connectやacceptの前後といった場所に、printf()で良いから 付け加えて、クライアントとサーバの両方の処理がどのように、どこまで出来ているのか 確認するってことで。
- 346 名前:デフォルトの名無しさん mailto:age [2007/11/04(日) 07:56:09 ]
- youtubetv.atspace.com/?Lof5N8D6NMI0747@TokyoDisneySeaBraviseamoHDV
- 347 名前:デフォルトの名無しさん [2007/11/04(日) 09:14:42 ]
- FreeBSD上でプログラムを組んでいて不思議な事に出くわしたので相談します。
IPアドレスを入力し、そのアドレスのネットマスクを取得するプログラムを組んでいますが、 ICMP_MASKREQを使って取得しています。しかし、AlliedTelesisのL3スイッチではきちんとICMP_MASKREPLY が返ってくるのに、CISCOのルータやPCだと応答がまったく返ってきません。 これはプログラムミスか、単にCISCOのルータがRFCに準拠していないのか・・・ どうでしょうか?意見をお願いします。
- 348 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 10:52:27 ]
- >>347
> CISCOのルータ Firewallで捨てられてるとか? ルーターのicmpカウンタをチェック。 > PCだと ホストは必ずしも答える義務無し。
- 349 名前:デフォルトの名無しさん [2007/11/04(日) 11:22:08 ]
- >>348
ヒントありがとうございます、CISCOルータにて、ip mask-reply コマンドでMASKREPLY を有効にしたところ期待通りにプログラムが動きました、デフォルトでno ip mask-reply になっているようです。 PCでは答える義務無しですか、残念。 SNMP以外でネットマスクを取得する手段を考えていたのですが・・・ 考え直してきます。
- 350 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:48:20 ]
- >>349
> SNMP以外でネットマスクを取得する手段 MASKREQUESTって聞いているホストが使うべきマスクを問い合わせるのに 使うのでしょう? 問い合わされたホストのマスクを返すのではなくて。 昨今はDHCPで取得される情報なのでほとんど使われない機能。
- 351 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 11:52:28 ]
- RFC1812はデフォルトで答える事をMUSTにしてるので、お前が設定したのだろう。
- 352 名前:デフォルトの名無しさん [2007/11/04(日) 12:23:40 ]
- すれ違いで申し訳ないんですが、
googleでXXXを検索。 のように、webページに引数を渡す?みたいな事ってどうやればうまく できますか?
|

|