- 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/
- 730 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 05:08:26 ]
- bitmask?よくわからん?
- 731 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 20:55:45 ]
- あきらめたほうがいいね
- 732 名前:デフォルトの名無しさん [2008/01/22(火) 21:06:04 ]
- ソケットでの通信を行うときのバッファサイズについてなのですが、
イーサネットのフレームは最大1518バイトらしいので バッファは1600バイト程度取っておけばいいんでしょうか?
- 733 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:15:05 ]
- >>732
TCPのウィンドウバッファはもっと大きいよ。
- 734 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 17:41:26 ]
- どのくらい取っておくのが普通?
- 735 名前:デフォルトの名無しさん [2008/01/23(水) 18:27:41 ]
- >>734
TCPとかイーサネットとかの仕様は考えなくて良い。 自分で設計したプロトコルに基づいてバッファを決めるのが普通。 どうせ、recvでまとめて受信したり、分割して受信したりするんだから。
- 736 名前:デフォルトの名無しさん [2008/01/24(木) 14:50:24 ]
- 質問す。
ソケット繋がった状態で、LANケーブル抜いて、すぐ差し直して、まだソケット繋がったまま。 何故切断されない?
- 737 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:55:48 ]
- TCPは送ったパケットが届かなくても何度か再試行するから、そのときに届けば問題なし
- 738 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:05:32 ]
- >>736
そもそも下のレイヤの信頼性を補うためのプロトコルがTCPだ…
- 739 名前:736 mailto:sage [2008/01/24(木) 15:12:29 ]
- >>737 >>738
あー、そっか・・・いいこという。
- 740 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:28:30 ]
- WindowsでLANケーブル抜くと断線扱いで
まさに>>736のときネットワークが落とされるんだが これはどうしたらいいかね
- 741 名前:736 mailto:sage [2008/01/24(木) 15:40:46 ]
- >>740
それは回線切断を検知したというか、 LANケーブルが抜けたことを検知した、ってことかな。
- 742 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:19:21 ]
- >>740
Windows で TCP/IP のメディア検出機能を無効にする方法 support.microsoft.com/kb/239924/ja
- 743 名前:デフォルトの名無しさん [2008/01/27(日) 15:31:55 ]
- accept関数の宣言は /include/sys/socket.hでされてるのは分かったのですが
externされてて中身がどこで表記されてるのかが分かりませんでした。 どこに表記されているか教えてもらえないでしょうか…。
- 744 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:46:25 ]
- UNIX系統なら、acceptの中身はシステムコール叩いてるだけだから、
カーネルに実体がある、といった方が良いのかな。
- 745 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:53:00 ]
- 詳解TCP/IP Vol.2だと、uipc_syscalls.cを見てるね。
- 746 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 08:04:18 ]
- チャットプログラムを作ろうとしているんだけど
同時に複数のデータを送りたい場合はどういうやり方が常道なんだろう 具体的には発言者、発言内容、文字色のデータがあるとして 適当にカンマ区切りとかにして一回で送信するか それぞれで三回送信した方がいいのか
- 747 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 12:03:48 ]
- TCPなら3回に分けて送信したって区切りの代わりにはならんぞ
10バイトを3回送信しても30バイト一度に受信するかもしれんし1バイトずつ30回受信するかもしれんし 区切り文字でもいいけどデータサイズを前に付ける方がたぶん楽 カンマ区切りにするなら発言内容にカンマ含んでるときのことも忘れずに
- 748 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 12:38:43 ]
- isprint()な文字しか投稿不可能なんだろうから、
ヌル終端に決めといて、最大サイズ制限あり。 発言者\0発言内容\0文字色\0 が簡単と思う。 送られたデータサイズは疑う必要があるから、 (分散システムでは、完全性の仮定レベルをかなり低くする必要がある) データサイズが送られても、結局は同じ様なコードになる。 バッファ管理とか、タイムアウト処理とか。
- 749 名前:デフォルトの名無しさん [2008/01/28(月) 12:53:24 ]
- 質問なんですが、
select使って多重処理のサーバ作ってるのですが、 A、Bという二つのクライアントがサーバに繋がってるとして Aから送った文字列に対してのレスポンスをAだけでなくBにも返す時ってどうすればいいんですか? アドバイスだけでもお願いしますorz
- 750 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:02:15 ]
- AとBの両方に同じものをsendすれば?
- 751 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:07:13 ]
- ある装置で、クライアントで接続するTCPポートxxxxxと、サーバーで接続するTCPポートxxxxx + 1があって
装置から接続先に送るものを、クライアントとして接続したポートで送信し、接続先から装置に対して受信 するものをサーバーとして接続したポートで受信する仕様で通信しているのですが。 種類と発生タイミングの違う複数のデータに対して同じポートで送受信しないといけません。 送信するデータは応答を返すのですが、送信するポートと別のポートで応答を受信するような感じです。 糞仕様にしか思えないのですが、こういうのもありなんでしょうか?
- 752 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:44:57 ]
- SYNパケットはどんな目的で使われるものですか?
- 753 名前:デフォルトの名無しさん [2008/01/28(月) 19:46:26 ]
- TCP3ウェイハンドシェイク
- 754 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:49:05 ]
- >>751
日本語でおk
- 755 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:54:22 ]
- >>751
読みづらい…。
- 756 名前:デフォルトの名無しさん [2008/01/28(月) 20:05:24 ]
- とんでもなく勘違いしているのかもしれんが
Winsockってacceptで処理がとまりませんか? どうしてもこれが気に入らないのですが、どうにかならないですか?
- 757 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:12:33 ]
- ノンブロッキングにすれば止まらない
- 758 名前:デフォルトの名無しさん [2008/01/28(月) 20:20:17 ]
- ありがとうございます!
- 759 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:44:28 ]
- 非同期にしても止まらない
- 760 名前:751 mailto:sage [2008/01/28(月) 21:40:17 ]
- 装置A→装置Bに(Aから見た)送信専用ソケットと、受信専用ソケットを2つ開いてデータのやりとりをする形式についてです。
@が装置Aから装置Bに送信するデータ Aが装置Bから装置Aに送信するデータ 装置A 装置B ソケット1 ソケット2 ソケット1’ ソケット2’ | | @ | | | +------------>| | | | @の応答 | | |<-------------------------------+ | | | | | | A | | |<-------------------------------+ | | Aの応答 | | | +------------> | データはいろいろな形式があって、それを送受信用ソケットでまとめて送る感じです。 Telnet, FTP 等のサービスを送受信用ソケットでやりとりするみたいなものは、どうなんだろうかと。。
- 761 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:40:54 ]
- ごめんずれちゃった。。
- 762 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:50:37 ]
- >>760
だれか解読ヨロシク。
- 763 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:53:03 ]
- 頭悪いPLC屋とか相手だと、TCP2コネクションで送受信回線が〜
とか言い出すな。
- 764 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:55:56 ]
- 俺は、これが気になる。
> Telnet, FTP 等のサービスを送受信用ソケットでやりとりする なんか、すごいこと考えてそうな予感... んなわけねーか。(w
- 765 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:58:00 ]
- Winsockを使ってSYNパケットを送信する事は可能ですか?
- 766 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:10 ]
- connect発行するんじゃなくて、生に「SYNだけ」送信する、
という話なら、おとなしくWinPCapとか入れて叩いた方がいいとおもう。
- 767 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:29:54 ]
- とりあえず効率や生産性を無視して動くものを作ってみろと言いたい
- 768 名前:デフォルトの名無しさん [2008/01/29(火) 02:11:03 ]
- sendで任意のホストに文字列を送信したいんですが どうも上手くいきません。
アクセプトしたときのsockaddrinのIPとポートを弄るだけでは駄目なんでしょうか? どうすれば送れるのでしょうか
- 769 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:45:16 ]
- いいからソース出せや
- 770 名前:デフォルトの名無しさん [2008/01/29(火) 03:03:22 ]
- とりあえずhost1から来た文をhost1,2に返すような感じのコードで
あらかじめfrom2にhost2のIPポートを入れておいて socket() bind() listen() while(1) { switch(select()) case -1:エラー処理 case 0:タイムアウト default: accept( struct sockaddr * &from) recv() send() if(fromがhost1の情報だったら){ from = from2 send()
- 771 名前:768 [2008/01/29(火) 03:09:06 ]
- >>769
あ・・途中でShift Enterで書き込んじゃいましたゴメンナサイorz コード的には>>770のような感じです。 後はクライアントが打ち込んだ文字列をそのままオウム返しするような感じです。 これで動かすとhost1で例えばAAABBBと打ち込むと host2には届かずに、host1だけにAAABBBと帰ってきます。 次にCCCDDDと打ち込んだ時に host1だけにもう一度AAABBBが帰ってきます。 次にEEEFFFと打ち込んだときに host1だけにCCCDDDが帰ってきます。 何かhost2に届かないばかりかワンテンポ遅れる+ダブって帰ってきてしまいます。
- 772 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 04:10:18 ]
- × 〜のような感じです
× 基本を無視 × 環境を書かない
- 773 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 05:14:02 ]
- AAABBBが2度返ってくる時点で、どう見ても自分のコードのバグだろうに。
ところで、一番重要な、acceptの返り値はどうしてるんだい?
- 774 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:58:05 ]
- tteいうか、
>from = from2 >send() まさかこれで from2 のどこかのポートに何か送れると思ってる?
- 775 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:02:08 ]
- 768は、TCPの「コネクション」というものについてもう一度考え直すように。
acceptの戻りのソケットは、そのIP:port専用で、from_addrを 書き換えたからと言ってもどうにもならない。
- 776 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:30:55 ]
- 気になったんですが、
WinPCap等はどうやって作られているんですか?
- 777 名前:760 mailto:sage [2008/01/29(火) 16:50:24 ]
- >>763
えーとPLC屋です。いわれてる通り、送信のみ、受信のみのコネクションをそれぞれもつ感じです。 Telnet, FTP というのは例えで、ネットワークの階層構造を考えたときに、トランスポート層のTCPとその上のサービスが 1:1じゃない実装になるのですが、ありなのかなと。
- 778 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:12:45 ]
- ありもなにも、TCP2回線つかって、TCPをもう一段建て増しに
するような真似は止めとけとしか言いようがない。
- 779 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:49:48 ]
- >>776
はいどーぞ、そういうときはドキュメント読んでね ttp://dog.tele.jp/winpcap/html/main.html
- 780 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 02:01:22 ]
- >>776
たんにドライバに渡されるEthernetパケットのコピーを横取りしてるだけ。
- 781 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 14:03:09 ]
- TCPのTIME_WAIT状態に関してRFCでは2MSL時間とあり、OSの実装によって 30〜240 秒取られているのですが。
a.2MSLまたないで同じポートを使用した場合、ルーター等で貯めこんでいた以前のパ ケットを受信することで、シーケンスの順序がおかしくなりRSTフラグが飛び交う。 なのでTIME_WAITは必要? b.TIME_WAITはクライアント側に必要で、サーバー側は無視してよい。通信用とは別の Listen用ソケットを使用するとしても、通信用でTIME_WAITは無視してよい。 c.TIME_WAITと比較してごく短い間隔で接続を繰り返すアプリがあると、利用できないポ ートが増え続けいずれ通信できない状態になる。こういう時TIME_WAITは短くして良い? それともアプリが間違っている?
- 782 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:22:22 ]
- >>781
TIME_WAIT は TCP パケットの順序解決を保証するもの。 同一 IP/port 同士が一度コネクションを切り、新たに コネクションを貼ったときにネットワーク内に同じシー ケンスIDが登場しないことを保証している(新旧のパケッ トが混ざらないことを保証している)。 要するに世界中のネットワークから通信に使ったパケッ トが消えてなくなるのに 2MSL 待てばまぁいいんじゃね? ということ。 たとえば、サーバ側で過去 2MSL 間に接続した相手の IP/port のリストをローカルな port 毎に管理していて、 接続要求に来たクライアントの IP/port がリスト内に 無ければ 2MSL 待たずに接続して良い(似たような話が RFC にあったはず)。
- 783 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:15:06 ]
- アプリケーション層でプロトコルの設計、送受信処理の仕方を
勉強したいのですが、おすすめの書籍やサイトはないでしょうか? やっぱり、RFCやオープンソースのコード読むのが一番?
- 784 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:53:01 ]
- ミドルウェアの解説本読んでみたら?
- 785 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 01:41:45 ]
- >>781
クライアントとかサーバとかじゃなくて、TIME_WAITは基本的に「先にcloseを発行」 したほうに生じる。んで、TIME_WAITが必要な理由は、教科書に書いてある通り。 a.TIME_WAITは必要だが、どの程度にするかは実装依存 b.最初に書いたとおり、クライアントかサーバは関係ない c.アプリは間違っていない。TIME_WAIT時間を減らすか、HW資源を増やすかはアナタしだい
- 786 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:05:23 ]
- >>783
ここはどうかな? 「ネットワークプログラミングの基礎知識」 ttp://x68000.q-e-d.net/~68user/net/ サンプルコードがあって解りやすかった。
- 787 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:06:19 ]
- >>786
いい加減にしろ!
- 788 名前:デフォルトの名無しさん [2008/01/31(木) 21:09:16 ]
- 教えてください。
VC++ WinSock でサーバプログラムをしているのですが、複数クライアントからのデータ受信で難航しております。 仮に、サーバAがポート3000で待ちうけ状態の時、クライアントB及びCと接続、B、Cから同時にデータが送信された時、Aのrecvプロセスでデータがごちゃごちゃになります。 クライアントに対してのrecvはそれぞれスレッドで処理をしてるのですが、Bの受信イベントでCのデータも受信されてしまいます。 同一ポートでもacceptしたそれぞれのソケットで送受信できないのでしょうか? 考え方自体間違っていますか? お願いいたします。
- 789 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:31:55 ]
- >>788
>recvプロセスでデータがごちゃごちゃになります ありえない動作だから、あなたのプログラムがバグってる。 acceptって書いてるし、たぶんTCPの話だよな? ソースみせてみ。
- 790 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:36:41 ]
- >Bの受信イベントでCのデータも受信されてしまいます。
TCPだろ、そんな訳あるか。acceptで戻ってきたソケットは、 そのピア専用になるに決まってるだろ。 あるいはひょっとして電波が届いたけど、acceptの戻りを上書きして、 スレッドB.CでどっちもソケットCを待ってるとかいうオチじゃないだろうな。
- 791 名前:788 mailto:sage [2008/01/31(木) 22:00:11 ]
- はいTCPです。ざっとですが、こんな感じです。
通信ソケットはクラス化しています。 CServerSock{ SOCKET m_Sock; recvfunc(); }; CServerSock SvSock[2]; AcceptFunc() { int cnt = 0; while( 1 ){ socket = accept(litensock,...); SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て CreateThread(〜)で各m_Sock用のrecvスレッド(recvfunc)を生成。 } } CServerSock::recvfunc() { char buf[2048]; while( 1 ){ ret = recive( m_Sock, buf, len, 0 ); // このrecive後のbufの内容がB,Cごっちゃになります。 if( ret == 0 || ret == SOCKET_ERROR ) break; ::SendMessage( m_hWnd, m_wMsg, (WPARAM)len, (LPARAM)buf ); 親ウインドウへ通知 } } わかりずらいかもしれませんがよろしくお願いします。
- 792 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:08:22 ]
- > CServerSock SvSock[2];
> SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て 普通、コンパイルエラーになるだろ。 (そもそも、private なメンバ変数 m_Sock にアクセスできないし...。) C++ じゃない、俺の知らない言語かも知れんが。
- 793 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:09:06 ]
- あれ?
それってひょっとして、デバッガでブレークして確認したとかいわないよな?
- 794 名前:788 mailto:sage [2008/01/31(木) 22:12:51 ]
- >>789 >>790
そうですよね。 基本的にBが送信A処理、Cが送信A処理の順番だときっちりBのスレッド、Cのスレッドで処理が行われるので・・・。 >>792 すいません。publicメンバです。書き忘れました。 >>793 ブレークとm_Sockの番号等で確認しましたが・・・。
- 795 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:18:33 ]
- ネタだろこいつら
かまってほしいだけだよ
- 796 名前:788 mailto:sage [2008/01/31(木) 22:59:26 ]
- >>795
残念ながらネタではないんですよ。 とりあえず、同一ポートでacceptした個々のSocketで送受信は問題なさそうなので、他でアホなことしてないかもう一度見直してみます。 すみません&ありがとうございました。
- 797 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:16:34 ]
- AcceptFuncのwhileでSvSock.m_Sock[cnt++] = socketのようにせず、
CServerSockのコンストラクタでsocketを受け取るようにしてみては? Socketの受け渡しが面倒だけど、オレはそうやって処理してる。
- 798 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:31:49 ]
- >>794
> すいません。publicメンバです。書き忘れました。 public でも、 > SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て は通らんだろ。(SvSock[cnt++].m_Sock = socket; ならわかるが。) ネタじゃないなら、情報細切れに出さずに、ソースをそのまま載せるなり、 どっかにアップしろよ。
- 799 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 10:56:19 ]
- なにをもってごっちゃと判断してるの?
- 800 名前:781 mailto:sage [2008/02/01(金) 10:59:33 ]
- >>782,785
なるほど、大変参考になりました。 ついでに、もう一つ質問・・ クライアント側で TIME-WAIT を発生させないようにする為、サーバー側は待ちうけ用の listen ソケットを用意し、クライアント側から切断する時はサーバーに切断用の制御電文 を送信し、必ずサーバー側から Close を発行するのは大丈夫でしょうか?
- 801 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:12:48 ]
- 待ちうけ用のlistenソケットを用意って、すでにあるacceptしてるやつとは別に?なんのために?
- 802 名前:781 mailto:801 [2008/02/01(金) 12:37:36 ]
- えーと、listen で待つソケットと accept したソケットが同一の場合の実装もあると考えて、そうではないという意味で書きました。
- 803 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:53:21 ]
- そんなのあるのか?
- 804 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 18:23:08 ]
- 今、UPnPを使いポートマッピングを行うプログラムを組んでいるんですが、
はじめはポートマッピングに成功するんですが、突然成功しなくなります。 それについて、どういった理由が挙げられるでしょうか。 どなたかご教授下さい。
- 805 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 18:32:20 ]
- >>791
>SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て cntはローカル変数なんだし、acceptされるたびに'SvSock.m_Sock[1]' になるのでは?
- 806 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 18:57:24 ]
- あげ
- 807 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:08:31 ]
- ローカルだけど、while(1)でその関数抜けないならずっと生きてるんじゃないの。
- 808 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:18:41 ]
- Winsockでhtmlファイルを1024パイトずつ取得し、
calloc等により動的に記憶域を確保 そこに全て入れてからURLを抽出する、 という方法を考えているんですが、 何か、良い方法はありますか?
- 809 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:21:17 ]
- 良い方法、というのは、たとえば、Perlでも使っとけ、みたいな話?
- 810 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 19:22:22 ]
- >>807
確かによく見たらbreak処理が無いな。 え。無限ループって事は配列オーバーしないかい? あと、Acceptfunc()が呼ばれるタイミングもいまいちわかんないね。FD_ACCEPT直下?
- 811 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:27:03 ]
- それもスレッドから呼ばれるんじゃないの?知らないけど。
Main,Accept, 送受信スレッド連中、みたいな。
- 812 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:36:32 ]
- >>809
効率の良い方法、です。
- 813 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:37:58 ]
- マルチスレッド使ったことなす;・ω・)
ポートマッピングに詳しい人。 >>804をたのみます。
- 814 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:16:33 ]
- >>800
サーバからCloseを発行して、クライアント側ではrecvで0が返ったことを 確認してcloseすればクライアントはTIME_WAITには入らないから大丈夫。 ただし正常系はそれでいいが、例えばサーバが無応答になった場合など、 クライアントから切断せざるをえない場合も発生するよ。 切断用の電文は、>>801のいうように切断したい接続上でやりとりすれば いいと俺も思う。バイナリを大量に転送中で中断が難しいような場合だと、 転送用の接続と、コマンド用の接続を分けるというのも確かにやるけど(FTPみたいに)。
- 815 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:36:51 ]
- >>804
理由はあまりに多すぎて、いちいちあげる気にならない。 パケットログか、ソースをアップしてくれ。
- 816 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 21:54:53 ]
- >>815
プログラムはほぼ www.bosuke.mine.nu/neta/upnp.shtml を参考にしました。ってか、ここのサンプルでもあけられないです。 処理ではWANIPを取得する際に失敗するようです。 ちなみに、二重ルータなんですが、ルータのIPは192.168.xxx.1ではなかったです。 '1'の部分が百いくつだったはず…ここでミスってるんですかね? ソースはサンプルプログラムのinvoke関数です。 XMLとかわかんないんであまりうまく調べられて無いような感じです。
- 817 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:19:14 ]
- >>816
>'1'の部分が百いくつだったはず…ここでミスってるんですかね? UPnPは、IPアドレス情報も含めてプロトコル上でやり取りして、自動設定してくれる。 だから、ここは関係ない(はず)。
- 818 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:22:00 ]
- >>816
とりあえずinvoke関数の中のどこでエラーが返ってるかログしこむなりして、 調べれ。
- 819 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:22:05 ]
- 二重ルータ?
- 820 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:36:01 ]
- >>817
なるほど >>819 モデム(ルータ機能付き)>ルータ>★自分&他複数PC ________________>ルータ>複数PC こんな感じです。 とりあえず、環境と離れるんで invoke関数の調査は週明けにでもやります。
- 821 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:39:37 ]
- UPnPはエラーならエラーコードがわかるはず
- 822 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:49:50 ]
- >>820
ルータ(1)>ルータ(2)>設定を実行するPC という環境であるとして、設定したいルータが「ルータ(1)」ならそもそも できない可能性がある。UPnPはマルチキャストを使ってるのだが、 ルータ(2)がマルチキャストルータでないと、PCで発行した マルチキャストパケットは、ルータ(2)を超えられない。 で、個人用の安価なルータがマルチキャストルータということは まずない。 ルータ(2)がマルチキャストルータで、マルチキャストパケットが ルータ(1)まで届いたとしても、同一ネットワークからじゃないと UPnPのSOAPリクエストにたいして応答を返さないようなルータっ ていうのは存在する。 でも、「出来るときと、出来ないときがある。」って書いてあるから、 ちがうのかもだが。
- 823 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:52:52 ]
- あーそれからルータをこえてマルチキャストパケットを届けたいなら、
IGMPメッセージを発行する必要がある。これはUDPソケットに対して、 IGMP_JOINなどをAPI経由で発行する。 やってるかもしれんが。
- 824 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:53:50 ]
- マルチキャストはルータ発見時しか使わないから、
そこをたとえば手動で設定すれば良いんじゃないかな。 ルータ1と2で同じポートを開けないとイケナイのがアレだけど。
- 825 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:03:41 ]
- >>824
おまえアタマイイナ
- 826 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:05:02 ]
- でもなーんか、UPnP使う意味がない気がしてきたな。。。w
- 827 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:09:02 ]
- 余談だが、これ気をつけろよ。
「Flashを悪用してUPnP経由でルータの設定を変更する攻撃は、これまでに報告 されたルータ攻撃方法に比べて何百倍も危険性が高いとSymantec。」 www.itmedia.co.jp/news/articles/0801/22/news075.html
- 828 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:09:07 ]
- recvで1024ずつ一つのhtmlファイルを取得する場合
htmlファイル合計バイト分の記憶域を確保するためにはどうすればいいですかね?
- 829 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:20:50 ]
- 最初に1024バイトのバッファを用意してそこに書いていって、足りなくなったら
reallocすればいいやん。
- 830 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:48:07 ]
- C++なもので
|

|