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/
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ページに引数を渡す?みたいな事ってどうやればうまく できますか?
353 名前:デフォルトの名無しさん [2007/11/04(日) 12:34:23 ] >>350 勘違いしていました、指摘ありがとうございます。 たしかにそうですね・・・、実験で確認がとれました。 MASKREQUESTで問い合わせたアドレスのネットマスクを取得する考えは根本から間違ってました。 >>351 ルータ初期化して試してみましたが、デフォルトでno ip masu-replyになってました。
354 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 12:37:34 ] ヒント:URI、クエリ、GET要求
355 名前:デフォルトの名無しさん [2007/11/04(日) 13:53:11 ] >>354 ヒントありがとうございます! 大変助かりました!
356 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:15:27 ] >>353 iosのバージョンとかにもよるんじゃないの。 デフォルトのイメージが書き換えられてる場合もあるし。
357 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:16:09 ] おまいら、IOSとかCiscoの製品使える? やっぱネットワーク系のプログラム組んでる人間としてCCNAぐらい取っておくべきかな?
358 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:19:54 ] そんな暇あったら、カマー本やスティーブンス本読破すれば? 基本的な知識あれば、ルータ設定くらい簡単だよ。
359 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:46:40 ] 自分の力に自信が無くて 資格を求めてるんだろ。 取るのを勧めてやるのが優しさだよ。 もっとも俺ならプログラムなんてもう辞めろと言うけどね。
360 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 20:27:40 ] >>351 RFC1812が書かれた当時とは実情が変わるなんて良くあること。 ciscoのマニュアルによると。 ip mask-reply To have the Cisco IOS software respond to Internet Control Message Protocol (ICMP) mask requests by sending ICMP mask reply messages, use the ip mask-reply command in interface configuration mode. To disable this function, use the no form of this command. Defaults Disabled <<<<<< コマンドが導入されたのはIOS 10.0。
361 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 22:27:16 ] プログラマからみたIOSっていうとXMLみたいなもんだからなぁ
362 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:17:05 ] 全然違うぞw
363 名前:デフォルトの名無しさん [2007/11/10(土) 13:29:28 ] IPv4かIPv6かわからないときgetaddrinfoを利用し調べる方法が ttp://ja.wikipedia.org/wiki/IPv6の下のほうに書いてありました Windowsではws2tcpip.hに宣言がありました getaddrinfoへ渡したaddrinfoのai_addrを利用し、IPv4かIPv6のアドレスを取得すると思われるのですが ai_addrの型はsockaddrでその定義はwinsock2.hにしかなくそれは以下のようになっていました struct sockaddr { u_short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; これだと8*14==112で、IPv6アドレスを表すための128bitに足りないような気がするのですが思い違いでしょうか?
364 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:37:49 ] sockaddr_in6にキャストしてつかうんじゃね?
365 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:41:07 ] sockaddr sockaddr_in sockaddr_in6 でググれ
366 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:44:34 ] FTPの同時接続数とレスポンスをまとめたサイト知ってる方います? 並列は3回線くらいがいいのかな・・・