2get pingください
乙枯惨
8 :
デフォルトの名無しさん :2006/01/01(日) 04:43:05
コンテンツデリバリーサーバーのソースコードとかってオンラインで公開されていますか? アカマイ等の商用のものはもちろんないでしょうが、、 よろしければ教えて下さい。
9 :
デフォルトの名無しさん :2006/01/02(月) 17:22:58
>>8 Apacheのソース見ていけば参考になるよ
HTTPにそって80番でポート開放してるだけだから
HTTPの仕様読んだ方が楽だと思うけど
>>10 もうちっと小さいソースを薦めようぜ
boaとかlighttpdとかあるだろ
shttpd.cで
ネットワークアダプタが複数存在するマシンで通信する デバイスを固定したい。Fedora4を使っているんだけど、 eth0〜eth3まである。ここで通信先をeth0に固定しようとして setsocketopt(sock, SOL_SOCKET, SO_BINDTODEVICE, EthName, sizeof(EthName)); こう書きました。sockは勿論のこと、EthNameにもデバイス名として 'eth0'と格納してる。コンパイルは通るけど実行時のログでは、 戻り値が-1でエラーは1(パラメタエラー)となる。 どーしてもわからないので教えて欲しいです。m(__)m
14 :
13 :2006/01/05(木) 18:47:13
1つ解決しました。権限がrootじゃないと駄目だったようです。 が、今度はエラーが19(そんなデバイス名は無い)と言われました。 eth0じゃなければ他に名前ってあるのでしょうか? すみませんが宜しくお願いします。
なんで、インターフェースのIPアドレスにbind(2)しないの?
>>13 'eth0'とかsetsocketoptとかいろいろ不安になる人ね。
sizeof(EthName) → strlen(EthName) or sizeof EthName - 1
17 :
デフォルトの名無しさん :2006/01/06(金) 18:41:28
>>16 EthName は char * だったりしてw
18 :
デフォルトの名無しさん :2006/01/06(金) 19:27:06
winsockでスレッド立てないで非同期でプロシージャに返さないで メインのループの中でもしメッセージがあったら受け取るって いうの作ろうかと思ったんですけどそういうのそもそも可能ですか? どこかにサンプルのソースとかあったら教えてください。
>>17 だったら"eth0"→4[=sizeof (char *)]でピッタリじゃん!
21 :
18 :2006/01/06(金) 21:35:25
昔、FIONREADを使ってたのを思い出した。
Echo サーバーを作ろうと思っています。 WSAAsyncSelect()関数にサーバ側のソケットを渡してイベントを待機します telnetから接続を試みるとFD_ACCEPTイベントが実行され 文字を送るとFD_READ、切断でFD_CLOSEのそれぞれのイベントが発生するのですが しかし、複数の接続が発生した場合どのクライアントからの受信なのかが判断付かない状態です。 接続要求があった際に各クライアントのソケットはリスト構造で一応確保しています。 WSAAsyncSelect()関数にそれぞれのクライアントを登録しておいても結局イベントが 発生した際にはどのクライアントのイベントが判断がつかない状態です・・・ 複数の接続を受け入れた状態でデータを受信した際に一体誰が送信したデータなのか? を判断する術をご教授ください。
>>22 WinsockのノンブロッキイングI/Oは要注意。2000以降はまともだけど。
>>23 selectで着信があったソケットを調べる、とか
クライアント側から通知してもらう、とか
token作るとかじゃないの?
28 :
デフォルトの名無しさん :2006/01/10(火) 23:45:43
質問です あるサイトの別々のページを連続で取得しようとすると、何ページが取得した後、 >ErrorCode #10054 >Connection reset by peer >既存の接続はリモート ホストに強制的に切断されました。 が出て、それ以降は、同一プロセスからは何度やっても別のページを取得しようとしても 取得できなくなります。 #10054を回避する方法を教えてください。
29 :
デフォルトの名無しさん :2006/01/10(火) 23:47:19
はじめまして!!c#について質問させてください。 私の家のパソコンにはC#のVisual Studio Net 2003がインストールされています。 ここで、プログラムを作って完成させたんですが・・・よく考えてみると大学では、 C#2005だったと思うんです。できたら、家だ作ったプログラムをコピーして大学 の授業でも使いたいと思っているんですが・・・この2つには互換性はあるのでしょうか? どなたか知っている方おられませんか??
30 :
デフォルトの名無しさん :2006/01/11(水) 03:47:29
新手のマルチか
パーソナルファイヤーウォールはポート番号から現在そのポートを開いている
アプリケーションを特定しているようですが、これはどうやればできるのでしょうか?
(Win2000)
>>28 サーバがコネクション数に制限かけてるだけだと思いますが。
連続で取得しないようにするしかないのでは。
>>32 どうもです。
ソースが公開されている netstatp ではXPのみのAPIを使っていますね・・・
2000でもできるTCPViewのソースは残念ながら後悔されていないようです。
x XPのみのAPIを使っていますね o XPのみのAPIを使って実現していますね
35 :
31 :2006/01/11(水) 16:26:10
36 :
28 :2006/01/11(水) 20:29:06
apatchというかcern httpdのソースって逝けてないよなあ。参考にしない方がいい。 マルチユーザでもうまく80番ポートを共有して、CGIみたいな手頃感でウェブアプリケーション組み込める鯖ソフトってできそうだけどね。 ところで、思わずパクりたくなるような出来のP2Pのソースってどこかにある? LimeWireとかCabosとか見てみたけど、Javaはいまいち好きになれない。。。 やっぱりネット処理だとパフォーマンス稼ぎたいからCがいい。
40 :
デフォルトの名無しさん :2006/01/12(木) 05:28:50
練習にFTPサーバを作ってみようと思ったのですが、疑問が出てきました。 PASSIVEモードでデータコネクションを張る前に、サーバ側が適当なポートを開けて待つことになると思うのですが、このとき、全く関係の無い接続があった場合の対処はどうすればよいのでしょうか? クライアントのIPアドレスで判断することも考えましたが、同一IPアドレスからイリーガルな接続が無いとも限らないので、不十分かと思います。 同様にACTIVEモードでは、クライアントがポートを開けて待つことになると思うのですが、やはり全く関係の無い接続にどう対処すればいいのでしょうか。 というか、FTPのこの仕組みって、セキュリティ上の問題が無いのでしょうか?
FTPにセキュリティ上の問題があるのはその仕組みだけじゃないから もう誰も使わなくなりつつある
42 :
28 :2006/01/12(木) 11:47:01
>>31 毎回 自ポート番号を変えることで回避できました。
43 :
40 :2006/01/12(木) 15:10:30
>>41 他のセキュリティ上の問題って、通信が暗号化されていないということですか?
他に問題があるのでしたら、参考までに教えてもらえないでしょうか。
で、自分が目指しているものは、ポートを1つしか使用しないFTPサーバが作ることです。
コントロールもデータも全部ポート21 への接続でまかないたい、ということです。
これは、ルータの内側にサーバを立てて、ポートフォワードして使用することを考えてのことで、できるだけフォワードするポートが少ないようにしたい、という希望があるからです。
なので、ポート21 に connect されたとき、それが
・データコネクションなのかコントロールコネクションなのか
・どのクライアントからの接続なのか
を判断する方法が欲しいのです。
1IPアドレス 1クライアントなら IPアドレスで判別することができるのですが、1IPアドレスから複数クライアントの接続がある場合、判別は困難となるわけです。
では、ポートをその都度割当てる場合(通常のFTP)ではどうなのかと考えてみると、開いたポートへの接続は目的のクライアントからのものである確率が高いということしか言えず、もしかしたらまったく別の、時には悪意を持った接続であるかもしれないわけです。
だからFTPサーバというものは、何らかの方法でクライアント接続の正しさを検証しているのではないかと考えました。
もしそのように接続がお目当てのクライアントからのものであることを判別する方法があるのであれば、自分の目的も達成できるのではないか、と思っているのですが、どんなもんでしょう?
これが適わないならば、せめてポートフォワードができるだけ少なくなるようないいアイディアは無いでしょうか。
FTPにはクッキーとか接続トークンとか無いの
ftpのサーバ間転送についてどう思う?
FTP自体がobsolete
48 :
デフォルトの名無しさん :2006/01/12(木) 21:41:38
Webサーバーにある文書ファイルを、ローカルPCで読み込んで、修正した後に、更新したいのですが、一番簡単な方法を教えてください。
>>45 そんなの10年前ほどに死滅したんじゃなかったの?
51 :
デフォルトの名無しさん :2006/01/12(木) 23:45:37
いま、PCを判断するためにMACアドレスを使おうとしています。 ところがPPPoEで接続している場合など、擬似的なネットワークインターフェースが作成されますよね? MACアドレスを列挙したときに、それらの擬似的なものも拾えてしまって困っています。 そういう擬似的なものを除外したいのですが、まったくやり方が見えません。 LANカード(PCIバスにさすとか、マザーボードに乗っている奴)のMACアドレスは08-・・・ のように0から始まるとか、そういう識別に使えるルールはあるのでしょうか?
>>54 すみませんが、もうちょっとヒントお願いします。
物分りが悪くてすみません。
57 :
デフォルトの名無しさん :2006/01/13(金) 00:18:30
WindowsXPから、Linux(fedora core3)のシェルのコマンドとか自作のプログラムを 実行する方法ご存知でしたら教えてください。
シェルのあるところにパスを通せばいいような・・・足りないか?
>>56 OS書き忘れてました。WindowsXPです。
インターフェース名でわかるのですが、MACアドレスをユーザーに申請してもらうので、
LANカードのMACアドレスをください、といっても通じない可能性があるもので。
(そこで、MACアドレスを列挙してあげるアプリを使わせます。そのアプリで擬似NICのアドレスをはじきたいわけです)
リンクありがとうございます。早速見させていただきます。
ssh使う
62 :
デフォルトの名無しさん :2006/01/13(金) 00:40:24
57です。 みなさん、アドバイスありがとうございます。 sshで出来そうなのは実はGoogleで少し調べてみて、情報は得られていたの ですが、sshはWindowsXPには標準では装備されていないようなんですが、 WindowsXP標準の機能で、実現する方法は無いでしょうか? というのは、自作のVC++のプログラムから、Linux上の自作プログラムを 起動したいのです。よろしく。
Fedoraでtelnetdなりrexecdなり動かしとけばいいじゃん ちなみにFedoraでの設定方法はスレ違いなので、ここで聞くなよ
CGIでできる事ならそっち使うな
65 :
56 :2006/01/13(金) 01:40:59
>>59 いや、プログラム内でインターフェース(アダプタ)の名前(wszName)見れば、
ほとんどの疑似インターフェースは弾けるんじゃないの?
dwTypeとか, dwDescrもあるよね。
GetIfTable/GetIfEntry
67 :
デフォルトの名無しさん :2006/01/13(金) 04:29:09
次のように定義される gethostbyname_r int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); name と ret は分かるんだけど、他の引数には何を指定したらいいの? NULL でいい?
69 :
67 :2006/01/13(金) 11:24:37
>>68 ありがとう。参考になりそう。
とどのつまり、NULLじゃいけないってことかな?案外面倒だね。
特に buf のことがよくわからないだけに、どう扱ったらいいのかよくわからないよ。
でもそのコードを見る限り、必須なんだろうね。
ところでそのサンプル、free が無いけどいいのかな?
gethostbyname_r の中で解放される?
/* Allocate buffer, remember to free it to avoid memory leakage. */
なんてコメントがあるけど。
自作のVC++のプログラムにssh組み込めばいいじゃん。 ライセンス回避もいろいろな手段が有るし、sshはソース有るよ。
サンプル程度ならプログラム終了時にOSが解放するからfree書かないことが多い クライアントアプリの場合も単発で終了するようなものなら書いてなくても動く サーバーアプリの様に長時間連続稼動するものは当然メモリリークが起こる
72 :
68 :2006/01/13(金) 16:53:15
>>69 > 特に buf のことがよくわからないだけに、どう扱ったらいいのかよくわからないよ。
MF-Safeにしたいから、gethostbyname_rを使うんだよね?
gethostbyname_rが利用するメモリを、gethostbyname_rを呼び出す側が用意する。
利用目的は帰り値の保存(hostent構造体には入りきらないもの)。
MF-Safeなインターフェースのメモリ管理には、
・メモリを呼び出す側が用意する。gethostbyname_r(glibc版)
・freeする関数も準備してある。getaddrinfo/freeaddrinfo
・スレッド固有メモリを使う。gethostbyname_r(一引数版)
などのパターンがある。
buf, ret, h_name, h_alise, h_addr_listを%dで出力してみれ
73 :
デフォルトの名無しさん :2006/01/13(金) 16:57:03
>63 rexecでできました。 ただし、rexec実行後に毎回passwordを聞いてくるので、それを無しに したいのですが。
> ちなみにFedoraでの設定方法はスレ違いなので、ここで聞くなよ
もしかすると既出の質問かもしれないのですが 開発を主にUnix(solaris)で行い、運用も同OSで行うようなもので しかし時々Win2000 or XPでも使用するソフトをつくる予定です その際に悩んでいることがあるのでおねがいします Unixのソケット関数とWin32のAPIで明らかに仕様が違うため 共通で使うことができません Javaを仕様すればソケット部分も含めて同じにできますが C++を使用したいのでそれはできません このような場合にはどう対処するのがただしいのでしょうか?
違うところだけ、汎用インターフェースを持つモジュールにまとめる。
#ifdef
78 :
デフォルトの名無しさん :2006/01/13(金) 20:28:23
>>72 > MF-Safe
MT-Safeのこと?
80 :
72 :2006/01/13(金) 20:31:31
そう(w 寝転びながらタイプしていたから、Tまで指が届かなかったようだ…
2つのPCをLANクロスケーブルで接続して 通信速度を計測したいと思いいろいろ考えているのですが、 スタンダードな方法ってありますか?
wwwのhtmlに接続して内容を保存したいんだけど
LAN自体の測定はスマートビットとか使うけどね。 PCで測定すると、PCのベンチにも成ってしまう。 C++で動くヲレラッパーライブラリ作ればいいじゃん。 普通は有料フレームワークとかで吸収したりするけどね。
86 :
デフォルトの名無しさん :2006/01/16(月) 01:55:57
このスレでよいかわかりませんが、質問させていただきます。
WinSockのVer2.2で、RAWソケットを用いたファイルの
送信ツールを作成しています。
>>6 の一番下のリンク先のIP PACKET MAKERのIP,UDPをそのまま利用
して、送信するものをファイルから読み込ませるようにしました。
しかし、送信するファイルが大きいと、途中でエラーが発生してしまいます。
「途中」というのは次のような様子です。単位はバイトです。
パケット長 1000 ファイルサイズ 4721898 送信バイト 2266000
パケット長 1200 ファイルサイズ 4721898 送信バイト 2360400
パケット長 1000 ファイルサイズ 292739076 送信バイト 148693000
またエラー発生箇所は、
make_udp_packet(&pPacket_udp->udp, src_ip, m_Sport, dst_ip, m_Dport, PacketLen-20, data_buf);
という、udpソケット生成関数内の
(make_udp_packet(struct udp* udp, UINT src_ip, USHORT src_port, UINT dst_ip,
USHORT dst_port, USHORT len, char* read_buf)
という形式の関数です。)
wsprintf((LPTSTR)udp->udp_data, read_buf); //ソケットデータ部にデータ書き出し
という部分のようです。もちろんこの前のほうが原因かもしれません。
わかりにくい説明だと思いますが、何かわかる方いましたら
よろしくお願いいたします。
ちなみに、IPレベルもいじれるファイル送信ツールを作ろうとしています。
そのようなツールをご存知ならば教えてください
どんなエラーが起きるのかくらい書けこの呆けなすが
winsock2で、サーバに繋がっているクライアントのLANケーブルを 引っこ抜いた直後にクライアントからsend()を実行すると戻り値が正常な 送信バイト数で戻ってきます これを失敗扱いにしたいのですが、良い方法(ソケットの状態を取得でき る関数等)ないでしょうか send()の前にselect()を駆使するとできるのでしょうか
89 :
デフォルトの名無しさん :2006/01/16(月) 13:58:13
回線速度の変化をシミュレートするためのサーバー (クライアントとサーバーの間に配置しする)を プログラミングしたいと思っているのですが、 参考にできるようなページはないでしょうか
altqとかそう言う話?
91 :
魚チョコ :2006/01/16(月) 21:43:09
>>88 ケーブルをすっこ抜いたのか……。そこまで試したことねえなあ。
ケーブル切れてんのに正常に戻ってくるってことは、
send() が送信バファーに送信データーをコピーしただけで戻ってきたってことでしょ。
select() を使っても、送信に関しては、そのソケットが正常に connect され、
送信バファーに空きがあって送信可能であるということしか分からない。
それに、送信データーがそのコンピューターから「出た」ことだけ把握しても、
相手との間に中継サーバーが介在してる場合、途中で握りつぶされて届かない
こともあるわけで、あまり意味がない。
確実に送信成功を検知するには、相手側に「受信完了」通知を出させるしかない。
エラーに関しては、たいてい send() 以外のソケット関数を呼んでるだろうから、
どれかがエラーを報告したら、WSAGetLastError() でも呼んで確かめればいいのでは。
92 :
魚チョコ :2006/01/16(月) 21:51:43
>>89 要するに遅さ可変のプロックシーを作りたいということなのかね?
クライアントとの間に適当なプロコトルを定めて接続先を指定させ、
もたもた受信してもたもた送信――送受信バファーの分だけどばっ
と通信してあとおひるねするようなことになるだろうなあ。スィリアル
ポートを経由するようにすれば遅くできるけど遅すぎるかな。あとは
10BASE/T しかない旧式コンピューターを調達するとか。
>>89 参考にするって言ったって、受けたパケットを他のイン
ターフェースに流すだけだからなぁ。
Cisco の Web でもみてネットワークスイッチの勉強
とかした方がいいと思う。
あと何のためにそんなもん作ってるのかわからんけど、
インターネット回線の擬似テストとかなら、てきとーに
パケットをロストするとか、パケットの順序を変えると
かの機能を入れておくといいかも。
94 :
89 :2006/01/16(月) 22:51:07
回答ありがとうございます
95 :
86 :2006/01/16(月) 23:07:34
書き忘れていました。遅れてすみません。 エラーですが、 pctmkr.exe の 0x7c950370 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x0025795a を読み込み中にアクセス違反が発生しました。 。 という形で出ています。 OSはWindowsXP、また、VisualStudio7.1を使用しています。 よろしくお願いいたします。
96 :
デフォルトの名無しさん :2006/01/16(月) 23:27:20
もしご存知の方がいたら教えてください。 Linuxのiptablesではパケットのアドレスやポートの情報をDNATやSNATで自由に書換えられますが、 同じことをWindowsで実現する方法はあるのでしょうか? よろしくお願いします。
>>86 > wsprintf((LPTSTR)udp->udp_data, read_buf); //ソケットデータ部にデータ書き出し
>>95 > : 0xC0000005: 場所 0x0025795a を読み込み中
> にアクセス違反が発生しました。 。
read_buf の内容に '%' が含まれてるに一票。
>>88 ソケットはそもそもそういう物理的な障害等を隠蔽するよ
うに作られてるからなぁ...。
何でそんなことしたいのか書いたほうがいいと思う。
>>96 ある。
やり方は知らない。
>>97 ソケットというかInernetだな。
電話みたいな強い接続指向のネットワークなら、切れたら分かるからね。
> Inernet < Internet orz
Innernet を hack しよう。
×Innernet ○Inernet
ワラタ
103 :
88 :2006/01/17(火) 01:49:33
>>91 >>87 レスどうもです。
クライアントは、ある装置からRS232Cで信号を不定期に受信します
その信号をサーバに送信しなければならず、信号の送信漏れは許され
ないシステムなんです
クライアントからサーバへは一方通行の垂れ流しプロトコルの為
送信完了(サーバへ信号が届いた)を検知する術が分かりません
TCP/IPのACKが戻ってくるという話を聞きましたが、winsockでその
信号を検知する方法等があれば良いのですが。。
良い方法ご存知の方、お知恵を貸してください。
>>103 setsockoptでLINGER短くしろ。
>>103 > 信号の送信漏れは許されないシステムなんです
> クライアントからサーバへは一方通行の垂れ流しプロトコルの為
そこが設計ミスなんだけどな。
どこまでが到達したか機械的に分からないわけだから。
105 :
88 :2006/01/17(火) 02:48:13
>>104 逆にLINGERを0xFFFFに設定して置けば、ソケットは長時間クローズ
されないので、LANケーブルを再度接続した時にソケットに溜まっている
データが流れて行くのですかね
出勤したらすぐに試してみます
どうもありがとうございました
UDPにしてプロトコルレベルのACK返した方がよくね?
>>103 >その信号をサーバに送信しなければならず、信号の送信漏れは許され
>ないシステムなんです
送信してるなら、サーバが受信しようがしまいが関係ないwww
108 :
86 :2006/01/17(火) 09:21:49
>>97 ありがとうございます。確かに、おっしゃられたとおりです。
一時的な解決策として、送信元のファイルにそのような文字が
入っていないものを使用したところ、確かにバイト数が大きくても
送信できました。wsprintfを何とかしてみます。
ありがとうございました。
普通UDPだな
FAでTCPは使いづらい
UDPではデータの到着順が保証されない。
→正常に受信できない可能性の増加
→再送の必要性増加
にならないか?
トラフィック量、双方のCPUの処理量的にそれが問題なければいいのかもしれないけど
それよりもTCPでプロトコルレベルでACK
正常に送信できない(受信できていない)場合はデータをバッファリングして、後で送信
>>105 バッファがあふれたら?
>>108 > wsprintfを何とかしてみます。
て言うか、wsprintf() のマニュアル見たの?
そこで、wsprintf() 使ってるのは意味不明だよ。
>>112 釣りか?
tcp 使ってても、パケットレベルで見れば
> UDPではデータの到着順が保証されない。
> →正常に受信できない可能性の増加
> →再送の必要性増加
だよ。
個人的には、tcp の上で自前の ACK とか言ってる奴
は、ネットワークプログラマをやめた方がいいと思う。
>>113 > tcp の上で自前の ACK とか言ってる奴
アプリケーションよってはアプリケーションレベルでコネクションを確認することは意味がある。
TCPが接続されていることと相手のアプリケーションがどういう状態にあるかは関係ない。
BGPもTCP上で自前のKEEPALIVEメッセージを流すよ。
>>114 KEEPALIVE と ACK は全然違うぞ。
>>89 遅レスかも知れんが、やりたいのは packet shaping ってこと?
ぐぐればそれなりに情報出てくるよ。Linux にもドライバやツール類あるし。
117 :
88 :2006/01/18(水) 02:23:22
<報告> たくさんのレスありがとうございます LINGERをまず試してみたのですが、LANケーブルを切断後、 およそ10秒後にOS(WindowsXPproSP2)がソケットを強制破棄 した様子でLINGERは無視されました TCPレベルのACKは取り方が分からなかったので試していません 今回は送信する信号のlengthが固定値のため、結局SNDBUFを 1信号分に設定することで送信エラー時は再コネクト後に前回 送信した信号から送信開始、という仕組みにしました …と言ってもご指摘の通り、信号が出て行っただけでサーバへ の到達は全く保障されていませんが垂れ流し仕様を作った設計者 も責任を感じているらしく了承してもらいました
>>113 > 個人的には、tcp の上で自前の ACK とか言ってる奴
> は、ネットワークプログラマをやめた方がいいと思う。
お前がやめろ。是非やめろ。
>>117 Windowsはlink downで、network adoptorが切断状態になるんじゃない?
それは自分側のifについて。 相手側のifが落ちてもこっちに通知が来るのはそれなりに遅れる。
122 :
デフォルトの名無しさん :2006/01/18(水) 09:39:38
>>113 アプリケーションレベルのプロトコルによる。
電文のシーケンスエラーというのもあるからな。
ACK/NAKのハンドシェイクを入れといたほうが何かと安心。
>>88 の問題もアプリケーションレベルでACK/NAKのやり取りをすれば解決だな。
123 :
86 :2006/01/18(水) 13:03:10
>>113 wsprintfについてですが、
もともと
>>6 の一番下は簡単な文字列を送るプログラムらしいので、
そういう何かなのかとあまり考えずに使っていました。
一応、単純に第2引数のポインタで、UDPデータのアドレスを得るように
してみました。しかし、3バイト以外データが空で、アドレスを
埋め込んでしまったかもしれません。
プログラムの基礎が足りないようです。勉強します。
もうひとついいですか?1度に1500バイトを超えるデータを
単位としたくて、64kB以下を送信するフラグメントを作ってみました。
Etherealで観測すると、UDP IP IP IP... UDP IP IP IP ...
という形になっています。WinSock2の標準のUDPでもこれをしっかり
組み立ててくれるのでしょうか?まだUDPデータがしっかりしていないので
確認できないのですが・・・
>>123 > まだUDPデータがしっかりしていないので確認できないのですが・・・
etherealが先かよ!
IPフラグメントでググレ。
125 :
デフォルトの名無しさん :2006/01/18(水) 15:32:46
すいません質問なんですが、下記の項目はそれぞれどういう意味なんですか? 紹介されてるHP等あったら教えてください、 -send -sendto -recv -recvfrom -wsasend -wsasendto -wsarecv -wsarecvfrom
>>122 > 電文のシーケンスエラーというのもあるからな。
tcp 上で?
プログラムがバグってるか、タコなプロトコルスタック
/デバイスドライバ/オペレーティングシステム でも使
ってるのか?
(まあ、過去にはそういう経験もしたことあるわけだが…。)
>>118 といい、痛い奴が最近多いのか?
>
>>88 の問題もアプリケーションレベルでACK/NAK
> のやり取りをすれば解決だな。
そんなことができれば、
>>88 も苦労してないだうな。
>>127 interoperabilityを考えたプロトコルなら普通(←言い過ぎか?)は
ACK/NAK相当の応答が入ると思う。
応答のタイムアウト等で
>>88 の問題にも対応できるし。
>>128 ネゴシエーションとかのことを言ってるのかな?
ただそれは、通信路の話とは別の話で、例えば各々の
プロセスが共有メモリを介在して動く時にも必要な話だ
よね。
世の中、そういう階層の分離ができない奴がいて、
>>122 みたいに「ネットワークだから伝送エラーが起き
るな。なんとなく心配だから、ハンドシェークしておこ
う。」とか言う、勘違い君がいたりする。
> 応答のタイムアウト等で
>>88 の問題にも対応できるし。
⇒
>>103 クライアントからサーバへは一方通行の垂れ
流しプロトコルの為
ひょっとしてバインドアドレスが違えば同じポートでサーバソケット開けたりする?
つ SO_REUSEADDR
同一プロセス内でそれぞれ 127.0.0.1 と 192.168.1.170 (LANのアドレス) にバインドした 同じリスニングポートのサーバソケットを開けた。telnet 127.0.0.1 9999 でやった 時は前者のサーバソケットへ、telnet 192.168.1.170 9999 でやったときは 後者のサーバソケットへ接続。ふーんやっぱそうでつか。
当たり前。 ・TCP層のアドレスは<IPアドレス、ポート番号>。 ・インターネットアーキテクチャではホストでなくインターフェースごとにIPアドレスを付ける。 の二つから。
1. UDP のパケットを recv する 2. パケットをキューに入れる (別のスレッドに渡すため) 3. 1. に戻る というループをしてるんですが、recv が終了して次の recv に入るちょっとした間に 到着したパケットって次で取得できるんですか? それとも取り漏らす?
>>136 その「ちょっとした間」に来るパケットの量が、
(OSの)UDPの受信バッファよりも多ければ取りこぼす。
>>137 サンキュー、パケット受信に入っていなくても OS がしばらくは持っててくれるわけね。
たまにパケット送りそこなってるらしいアプリがあって、しかも原因不明らしく、なぜか
受信側に嫌疑が振られてたんだけど、これで心置きなく突っぱねることができそうです。
>>138 > たまにパケット送りそこなってるらしいアプリがあって、しかも原因不明らしく、
インターネットアーキテクチャでは、
途中にいるルータが破棄する可能性が前提なので、
パケットを受け損なうことがあると困るのであれば、
TCPその他で保障してやる必要がある。応答確認、再送など。
ルータは中間にいない場合も、HUBが破棄するかも知れない。
>>139 困る困らないは別として、パケットが十分に低いトラフィックで受信側NICまで届いているのに
APでは取りこぼしていたりすると「実装不味いんじゃない?AP作り直せば」ということになるでしょう。
>>138 はそんな感じなのでは?
>>139 重ねてありがとうございます。マルチキャスト使って LAN 内のサーバ
探してまして、その応答部分ですね。
C: 起動。活動中のサーバを探すためにマルチキャスト
S: 自分が活動中であることを送り返す ← ここ
C: 活動中のサーバのうち適切なところへ接続
サーバは常に何台か動いているので実害はないのですが、テストしてると
たまに起動サーバ数と応答数が合わないらしくて (再現性なし)。状況によっては
1〜2 台になったりもするんで、バグなら直しておかないと。
ほぼ同時に複数の応答パケットが返って来るんで、先の 「ちょっとした間」 で
取り漏れてるんじゃないかと疑われそうになったしだいです。
TCP のパケットエラーとかは皆無なんで、ネットワークのせいではなさそう
なんですけどね。というか送信側は別会社でソースぐちゃぐちゃだったんで
あれこれ別の理由を探してるのかなぁ、と…
どうもありがとうございました。
ほぼ同時に多数から返事が返ってくるなら、イーサネットでの衝突、というやつで UDPは喪失しているのかもしれないな。
帯域が十分足りてるときにコリジョンでパケットが落ちるなんて あまり考えられないけどなぁ・・・って普通に社内LAN通してるのか。 そりゃUDPなら落とすこともあるか。
>>141 たまにと言うのがどれぐらいの頻度か知らんけど、
sniffer とか ethereal とかでモニタすると言う
のはどうだろうか?
>>142 > イーサネットでの衝突
それはイーサネットレベルで検知・再送されるんじゃなかったけ。
UDPなら落とすこともある
>>146 イーサにとってUDPもTCPもないでしょう? それは別のレベルでの話。 イーサは16回
再送を試みるらしい。
148 :
デフォルトの名無しさん :2006/01/19(木) 23:02:27
etherealみたいにパケットをキャプチャするのってどういう仕組みでパケットを読み取っているのでしょうか? ソケットにのぞき窓でもあるんですか?
149 :
デフォルトの名無しさん :2006/01/19(木) 23:30:20
あるんです
>>148 ほらあれだよ
ネットにつながってるLANのコネクタを監視したらいいじゃん
無差別だったらプロミスキャスだったっけな
etherealの名前のままEthernetをどんなパケットも逃さず監視するって感じなのかな
どうやってそういう風なプログラミングをするのかは不明だが・・・
>>150 > どんなパケットも逃さず監視する
逃しますって。ばんばんパケット飛んでると処理間に合わないから。
>>152 まあ、Ethereal で全部取れたら、sniffer の糞重
い機器の立つ瀬がないわな。
154 :
デフォルトの名無しさん :2006/01/20(金) 05:15:43
こんばんわ。初心者の疑問なのですが、お教え頂けないでしょうか? DirectPlayでピアツーピアアプリを開発しようとしていたのですが、WEBで検索していて、 以下のように変化してきています。 1.ピアツーピアは NAT 越えできないから、費用かかってもクラサバでやるべきだろう。 2.DirectPlay は推奨されていない(MS自身を含めて)から Socket でやるべきだろう。 で、今はサーバーを NAT の外に置き、クライアントはどこでも可、通信は Socket で行う。 という環境を想定しています。 そこで以下の疑問が発生して悩んでいます。 1.部分的に UDP を使いたいのですが、UDP もやはり NAT 越え出来ないのでしょうか? 今回の環境でいうと クライアントからの送信は UDP で行えるが、サーバーからクライアント への送信に UDP は使えないのでしょうか? 2.速さを要求する部分には UDP を使うべきでしょうか?TCP-IP と UDP ではかなり差があるもの なのでしょうか? どうかよろしくご教授下さい。
>ピアツーピアは NAT 越えできないから ダウト >1. そんなことはない >2. 無視できない差がある
156 :
デフォルトの名無しさん :2006/01/20(金) 10:52:42
>>155 NATごぅぇできないだろ
設定めんどうくさいじゃん
頭で思っただけでルータが設定されるならいいけど
157 :
デフォルトの名無しさん :2006/01/20(金) 11:02:29
>>155 ありがとうございます。
>1 そんなことはない
やはりできるのですね?DNSサーバーへの問い合わせとかにもUDP使われてる訳ですもんね。
調べてきます。
>2 無視できない差がある
やはり。
ちょっと、勉強し直してきます。また質問させて下さい。
158 :
デフォルトの名無しさん :2006/01/20(金) 13:47:55
>>155 ちょっと進歩しました。
>そんなことはない
NAT 、静的IPマスカレードは、ゲートウェイ外部から内部へのアクセスはできました。
ところで、それ以外のIPマスカレードの場合、やはり外部から内部にアクセスはできないのでしょうか?
IP、UDPに関わらす。
>>158 内部のPC のアドレスを a.a.a.a 、ルータの外部アドレスをb.b.b.b
どこか他の PC やサーバのアドレスを c.c.c.c、
p, q, r をポート番号としたとき、
多くのルーターは、
a.a.a.a:p ⇒ b.b.b.b:q ⇒ c.c.c.c: r と UDP パケットを転送すると、その後しばらくの間は、
c.c.c.c: r ⇒ b.b.b.b:q と到着したパケットを a.a.a.a : p に転送してくれる。
これを利用していろいろなことが出来る。
>>158 UDP Hole punching でぐぐるといいよ。
>>154 > 2.速さを要求する部分には UDP を使うべきでしょうか?
> TCP と UDP ではかなり差があるものなのでしょうか?
速度に関する特性が全く違うので応用による。
UDPで、どんな状況下でも効率の良い実装を行うのはかなり難しい。
TCPでもほとんど再送が起こらない状況ならUDPとたいして変わらんよ。
unix系でのネットワークプログラミングなんですが。 サーバー側のaccept()で待つソケットについて質問があります。 普通、accept()に突っ込むソケットacpt_sockはまずバインドして、listen()で接続を受け付ける クライアント数を設定するわけですが、accept()してからだと、クライアント数を変更することが できません。 accept()中でも接続を受け付けるクライアント数を変更したいのですが、何かいい方法を教え ていただけないでしょうか。
164 :
デフォルトの名無しさん :2006/01/20(金) 19:55:02
>>159 なるほど!スゴイ。このあたり掘り下げて調査してみます。
>>160 こ、これも!さっきWEBで見ていたGapNATとNATSとかより、確実そうな方法。調査してみます。
>>161 そうですか。では、UDPをアプリデータ通信よりも、経路確保やKEEP-ALIVEの為に使うのが現実的そうですね。
>>162 ありがとうございます。経路確保やKEEP-ALIVE以外は全てIP転送を使用するというところから初めてみます。
皆様、的確なご指示ありがとうございます。
以前、別スレで他の質問をした事がありますが、板違いで質問ツアー → 玉砕 というパターンばかりでした。
これほど的確に教えて頂けるものなのですね。感動しました。2ちゃんすごい。
これからはスレの内容を充分把握してから質問するよう心がけます。ありがとうごさいました。
>>164 > 経路確保やKEEP-ALIVE以外は全てIP転送を使用する
UDPとTCPが並列関係。
IPはUDPとTCPの下位層で、
UDP使った時もTCP使った時も、IPを使っている。
TCP/IPというのは、IP, TCP, UDP, DNS, HTTPなどプロトコル群の総称。
同じ意味の言葉に、インターネット・プロトコル・スーツがある。
>>163 ん? backlog を動的に変えたいのか?
まず、何のためにそんなことしたいのか書いたほうがいいと思う。
(backlog の意味を勘違いしてるに一票を投じておくか…。)
>>166 DNS と HTTP まで含むのか?
レイヤ的には DNS -> UDP -> IP HTTP -> TCP -> IP ですよね? どうして UDP/IP とは言わないんだろう・・・orz
170 :
デフォルトの名無しさん :2006/01/21(土) 07:26:47
>>166 すみません。TCPのつもりでIPと書いていました。
用語を適切にしようするよう注意します。
172 :
デフォルトの名無しさん :2006/01/21(土) 07:37:25
>>165 申し訳ありません。マルチポストしてしまいました。
2度とこのような事はしませんのでご勘弁下さい。
174 :
デフォルトの名無しさん :2006/01/21(土) 16:29:19
>>173 だから、言うって。上のリンク見ても別に否定されないじゃん。
インターネット研究している奴が、UDP/IPなんて言っているの聞いたことない。
HTTP,FTP,etc. DNS,SNTP,etc. ------------------------------ TCP UDP ------------------------------ IP
178 :
デフォルトの名無しさん :2006/01/21(土) 18:58:46
>>175 言うよ。
単にTCPと比べて用途が限定されてるから機会がそれほど多くないだけで。
UDPもTCPもIP込みが当たり前だから、TCP, UDPで十分。 「UDPとIP」を「UDP, IP」と書いたり言うことはあっても、UDP/IPは変だ。
UDP/IPが変に感じるのは、単なる知識不足。
「TCP」との比較として「UDP」とだけ表記されることは良くある、というよりこっちが大半だけど TCPについては「TCP/IP」と明記していながら UDPについては「UDP」としか書かれていない、なんてことは まともな書籍、資料等なら、まず無い。
へー(棒読み
ひとりで頑張るね
TCPとUDPの使われ方が絡んでるだろ>TCP/IP
>>179 > 「UDPとIP」を「UDP, IP」と書いたり言うことは
> あっても、UDP/IPは変だ。
お前、UDP/IP って「UDP と IP」の意味だと思ってる
のか? そりゃそんな意味で UDP/IP なんて書く奴はい
ないよ。
>>184 何を言いたいの?
おまえらヌルい盛り上がり方してんな。
>>181 >TCPについては「TCP/IP」と明記していながら
"TCP/IP" と書いたら、TCP だけでなく UDP 等も含んだプロトコルセットを
意味するのが一般的でしょう。反対に、UDP/IP という表記は多くの人に
とって違和感のある表現であると思われます。
レイヤを分けるスラッシュじゃないの?
190 :
デフォルトの名無しさん :2006/01/21(土) 23:08:31
こんばんは。UDP Hole punching についてお教え下さい。 1.TCP でこの処理を行えないという点がよく分かりません。 「TCP は非対称だから」という事なのですが。接続の方向のことでしょうか? 2.UDPで UDP Hole punching を行った後は TCP で接続できるのでしょうか? ちなみに、間違っているかも知れませんが 私は UDP Hole punching を以下のよう に理解しています。 別々のNAT内に Ha, Hb がありルーターをそれぞれ Ra, Rb とする。 インターネット上に Hc がある。 1.Ha, Hb ともに Hc に接続 Hc は Ha, Hb のグローバルアドレスを記録する。 2.Ha は Hc から Hb のグローバルアドレスを取得し接続する。 この時、Rb が conn NAT でなければ越えられないが、Ra には Hb との変換レ コードが記録される。 この時点で、Hb から Ha に接続できる。 3.同様に Hb が Ha に接続( punching )する。
>>187 「TCP over IP」の意味で「TCP/IP」という言葉を使う人が、世界に一人も居ないと思ってるの?
それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?
192 :
デフォルトの名無しさん :2006/01/21(土) 23:16:42
すみません。
>>190 で言ってるグローバルアドレスとはポート番号を含めたものです。
よろしくお願いいたします。
|―――――――| | UDP | TCP | |―――――――| | IP | |―――――――|
めっちゃずれてたw
>>21 ∧_∧ ミ ギャハッハッ ズレてる!ズレてる!
o/⌒(. ;´∀`)つ
と_)__つノ ☆ バンバン
∧_∧
o/⌒(゜Д゜ )つ
と_)__つノ
>>191 >それと同様の意図で「UDP/IP」と言うのは間違いだと言いたいわけ?
こっちは世界的に見て少数派だろうなぁ。
UDP が over IP である事を厳格に明示したい場合ってどういう時?
m(・∀・)<この5円玉をじっと見つめてください | D m(・∀・)<あなたはだんだんどうでもよくなる… / D )) m(・∀・)<あなたはだんだんどうでもよくなる… \ (( D
>>196 は?
あんた「UDP/IPは間違い」って言ってんだろ?
多数か少数かは関係ないだろ。
>>198 誰と勘違いしてるのか知らんが、
>>197 でも見て落ち着け。
ちなみに俺も、理由無しに UDP/IP なんて書いてる奴がいたら、ちょっと眉をひそめるな。
.-、 (,,■)
ローカルアドレス入りのデータグラムををGatewayから たくさん送出しちゃいました・・別に大丈夫ですよね? ちなみに私は18歳女子高生(処女)です。
残念、俺は非処女だよ。
Winsock+vc++でのWindowsプログラミングの練習中なんですが質問が何点か。 買った参考書では、一対一でのチャットのソフトではTCP/IPを、複数での チャットソフトではUDP用いていましたが、TCP/IPで同様に複数でチャットを するには、接続分ソケットを用意するということでしょうか? それと、WSAAsyncSelectを使いメッセージ等を単一で処理をするのと、 マルチスレッド化してaccept()などを使用するのと、どちらが良いのでしょうか? どちらとも、ということでしたら、理由などを参考程度にお願いします。
WinsockFAQの、「どのIO戦略を使うべきか」でも見とけ
>>205 はい、UDP/IPとちがって、TCPは接続指向ですから、
接続後とにその端点であるソケットが必要になります。
208 :
205 :2006/01/22(日) 02:30:18
助かります、ありがとうございました。
209 :
デフォルトの名無しさん :2006/01/22(日) 02:35:23
>>205 間違っているかも知れませんが、自分は以下のように理解しています。
TCPは基本的にクラサバで、サーバー側がListenしてクライアントがConnectする。
Listenしているポートには、IPアドレス.ポート番号さえ違えば、いくらでも接続できる。(例:Webサーバーのポート80)
だってTCPの接続の識別子は、 <src IP, src port, dst IP, dst port>の四つ組なんですもの。
>>202 どこかのサイトの誰かのローカルアドレスに届くだけだから大丈夫
>210 いや、UDPだって同じだろ?
>>210 UDPには接続はない。常に一方向である。
よって<dst IP, dst port>だけで目的のソケットまで辿り着く。
TCPはそうではない。<src IP, src port, XXX, 80>は何組みもありうる。
これが
>>209 が理解し、
>>212 が理解してないこと。
UDPで、<src IP, src port>にパケットを返すケース、
それは上位層(セッション、アプリケーション)の仕様なのである。
# UDP hole punchingは上位層の振る舞いを利用する。
TCPの場合は、TCP層で<src IP, src port>が相手であることがはっきりしている。
よくわからんな。 TCPのsrcaddr:srcpotが信頼できて、UDPのは信頼できないってだけの話か? それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい? TCPだって、相手にデータを返すのは上位層の役割。送信と受信で TCPソケットを分けるような変態設計もできるわけだし。
215 :
デフォルトの名無しさん :2006/01/22(日) 13:44:27
自分はUDPパケットの中身よく知らないんですが、ひょっとして、 物理的にも DstAddr、DstPort しか持っていないんですか?
すいません。sage
>>215 UDPパケットにも、ありますよ。
http://www.faqs.org/rfcs/rfc768.html けどUDP層ではそれは使わないんです。
それがUDPとTCPのサービスの違いになっています。
> それともUDP・TCPのソケットレイヤにおける動作の違いが言いたい?
その動作はサービスの違いを反映しているんです。
OSIの言葉で言うところの、各層のエンティティのアドレスって考え方を理解してください。
>>210 はTCPの極めて基本的な常識です。
TCPの接続を実現するためには四つ組を識別子に使わざるを得ないんです。
# <dst IP, dst port>が同じ接続を認めないといけないので。
UDPには接続がないので、そうではありません。
これを理解してない人はTCP/IPの基本を理解してないと言わざるを得ません。
>>215 SrcAddrはIPヘッダに、SrcPortはUDPヘッダに。
>>218 加えるにpseudo headerの中にSrcAddr, DstAddrもある。
>よって<dst IP, dst port>だけで目的のソケットまで辿り着く。 は間違い。UDPでもconnect済みのソケットは、srcを区別して捨てるようになるから。
> TCPだって、相手にデータを返すのは上位層の役割。
レイヤーが理解できていませんね。
ヒント: ACK パケット
>>219 え゛?
この場合のデータとは、TCPのペイロード部分を指す。 ソケットレベルで無意味なACKは考えない。 そのために、パケットではなくデータという言葉を使ったんだから。
>>222 ふーん、そうなんだ。
で、誰がそんな話してるの?
独り言なら、チラシの裏へ…。
TCP hole punching を発明?
http://homepage3.nifty.com/toremoro/p2p/firewall.html の下方にあるように UDP hole punching は UDP
でしかできないとなっています。でも以下の方法でやれば TCP でもできるのでは?...
1.STUN サーバー(グローバル状態)に接続して、自分の Address.Portを記録してもらう(サーバー用として)。
2.外部からつなぐ場合、STUN サーバーから Address.Portを取得して、UDP で「サーバー用にポートを切
り替えて」というパケットを送る。
3.ポートを切り替える。
4.外部からTCPで接続する。
駄目でしょうか?
>>224 > 3.ポートを切り替える。
が無理です。
>>224 のように登録サーバを使うhole punchingなら簡単です。
双方自分のIPアドレス、ポート番号を登録して、
ローカルソケットには登録したIPアドレス、ポート番号をbindし、
同時に相手にconnectしにいけばいいだけです。
UDPでも全く同じコードで動きます。
226 :
デフォルトの名無しさん :2006/01/22(日) 16:00:19
>>225 >ローカルソケットには登録したIPアドレス、ポート番号をbindし、
ポートを切り替えるといってたのはその事です。やはりできるのですね?
なんでこれをやりたいかと言いますと、単にNATの背後にある PC 同士で通信したいだけなんです。
でも、UDP でやると セッションとかパケットの並べ替えとかを UDP の上に作りこまないといけないと
書いてあり、場合によっては UDP の上で TCP を発明するぐらい作りこむ事になりかねないって事
だったんです。
でも TCP でも やりようによってはできるんですね。やる気でてきました。
ところで、Symmetric NAT のルーターって全体の何割くらいあるものなのですか?
Symmetric NAT は、ポート番号総当りで突破できるでしょうか?
注意点としては、 ・SYNパケットがhole punchingを行うことになるが、 相手がhole punchingする前にルータにSYNが到達した場合、 ルータの振る舞い、ルータの出したICMPを受けた時のプログラムの振る舞い。 一番簡単なのは中継サーバを使う方法。
228 :
デフォルトの名無しさん :2006/01/22(日) 20:23:32
かなり難しそうですね。パケットを何万を投げると何とか攻撃になりそうだし... 中継サーバーが確実ですね。
>>228 udpで実際 Punching holeやってるが
コネクション型のTCPでできるの?
230 :
デフォルトの名無しさん :2006/01/22(日) 21:11:12
>229 すみません。あまりネットワーク詳しくない上に、確認する環境がないもので...orz ただ、WEBで調査した結果、できそうだなと... でも、ルータの変換テーブルへの記録され方が TCPとUDP で同じだとの前提ですが。(ConnNAT,Destricted何とかNAT,SymmetricNATなど) 方法としては単純で、以下の手順を行います。 1.PC-A から 外部の PC-B にクライアント接続します。PC-B は PC-B からみたリモートアドレスとリモートポートを取得します。 2.PC-A はローカルポートとリモートポートを逆にして、サーバーとして待機します。 3.外部の PC-X は PC-B から PC-A のアドレスを取得して、クライアントとして接続します。 UDP Hole Punching と違うのは、ポートを逆にする手順だけだと思います。 確認できたとしたら、是非教えて下さい。
sage
TCPのNATはちゃんとstateを見てるんじゃないのかなぁ。
今時の賢い奴はシーケンス番号の重複もちゃんとチェックしているはずだしね。
>>.230 ですが。 すみません。さっきの手順でつながるのは ConnNAT の場合だけでした。 DistrictedなんとかNAT (2種類) を考えた場合、 UDP Hole Punching と同じ手順が必要だと思います。 (UDP Hole Punching の手順に ポート逆転 を追加)
235 :
デフォルトの名無しさん :2006/01/22(日) 21:32:57
>>232 >>233 まじですか?もうプログラムを作り変え始めてたのに。
調査はするけど詰めが甘い自分...orz
さっきの手順をまとめ直してみました。 駄目ですかね... 1.PC-A から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。 2.PC-B から 外部の PC-O にクライアント接続して待機。PC-O は PC-O からみたリモートアドレスとリモートポートを取得します。 3.PC-A から PC-B に接続する場合、PC-O に要求を出します。 4.相手方のアドレスとポートを取得した両方の PC は切断して相手方にクライアント接続します。 接続は失敗しますが、自分側ルーターの変換テーブルに相手方とのレコードが残ります。(きっと) 5.PC-B はローカルポートとリモートポートを逆にして、サーバーとして待機します。 6.PC-A は PC-B にクライアント接続します。
>>236 俺の認識だと
■UDPは非コネクション系だからNATはそのパケットが正規の
ものか認識できない IPアドレスでは
■送信した時のポートを覚えておいて、そのポートできたパケットを受け入れる
■送信したIPアドレスも覚えておく
TCPのコネクションだと相手のIP固定だからルーターも
アドレスで選別できるよね?
>>237 ついでに
私が作ったのはTV電話だけど
UDPの欠落、順序違いはたまに発生するけど
頻度から考えてTCPの再発明までこったする必要ないと
思うが?
TV電話の音声・映像は逆に再要求で遅延がひどいパケットは
捨てたいからUDPが向いてるけど
>>236 さんがリアルタイム性の強いものを作るならばUDPの方が
向いてるし、ファイル系の速度よりも信頼性を取るならば
リレーサーバーで十分と思うが
239 :
デフォルトの名無しさん :2006/01/22(日) 23:47:22
>>237 >■送信したIPアドレスも覚えておく
Restricted Cone NAT 送信した相手のIPアドレスも覚える
Port-Restricted Cone NAT 送信した相手のIPアドレスとポート番号まで覚える
この場合は考慮しています。と言いますか、送信先を覚えない Conn NAT の場合
Punching する必要はなく、STUNサーバーからアドレス取得してアクセスできる。
自分はそう理解しています。(ひとりよがり...)
固定のポート使う仕様にした方が早いんじゃない?
241 :
デフォルトの名無しさん :2006/01/23(月) 00:03:49
>>238 あ、TV電話興味あるー!
今作ってるのは簡単な会議システムで、ライブ映像(音声)とファイル共有、ホワイトボード共有などです。
ライブ映像(音声)以外はローカルで完成しているのですが、マウス移動情報が大量に流れるのでUDPが理想的なのですが。
>>238 さんはTV電話はどのような技術を利用されたのですか?
自分は以前 Flash Communication Server で作ったことはあるのですが、クラサバだし、サーバーソフト値上がり(600万円!)
したので止めました。
今は RTC で作成を始めたところです。
>リアルタイム性の強いものを作るならばUDPの方が
>向いてるし、ファイル系の速度よりも信頼性を取るならば
>リレーサーバーで十分と思うが
また迷いが出て来ました...そんな気がしてたのですが。
でも ルーター の変換レコードって 90秒程度で消えるというような文章を目たもので。
KEEP-ALIVE 用のパケット送ってれば済む話?
よしゃぁ!UDPを試してみます。
ああ、ファイル転送があるのでした...orz ( ゚д゚)ハッ! それだけ STUNサーバー を経由するか? ちょっと落ち着いてよく考えてみます。
243 :
デフォルトの名無しさん :2006/01/23(月) 00:10:46
>>240 形態的にはネットゲームみたいにしたいんです。
ロビーで相手探して接続するというような。
245 :
デフォルトの名無しさん :2006/01/23(月) 00:26:01
>244 同じようなものですね。 文書上に両方から書き込みができる、ズーム、移動等が同期で動くというどっかにありそうな。 場合によっては NetMeeting で事足りるじゃないかって言われるかも...orz
246 :
デフォルトの名無しさん :2006/01/23(月) 00:33:26
247 :
238 :2006/01/23(月) 00:33:56
今はhole punchingやめました 最近安定しない 書くことたくさんあるけど・・・・ リモートツールも作ってます ■ルーターには数分に一度データーを流すことにより接続を維持します ■ファイル転送はTCPでサーバー経由で十分です ■マウスはUDPの方がいいです。TCPでは効率悪すぎます マシンスペック、回線により送る量の調整が必要となります 単純なホワイトボードだとマウス情報送るべきではないよ ■今はUPnPを期待して逆向き接続にしてます、双方UPnPが使用できない 時はリレーサーバー 複数人の場合は一人でもUPnPが使用できれば それをサーバーにします ■UPnPはルーターにXMLで直接送ります。それによりSP2は回避できます ■winsockではUDPは相手に一度でもつながらないと以後 ソケットは 使用不可になるのでオプションで機能をOFFにします Hole Punching時の不到達前提で相手に送るときです
248 :
238 :2006/01/23(月) 00:40:30
なんか 同じようなもの作ってるな・・・・ Hole Punchingは明日が予測できない技術だから 業務では使用しないほうがいいよ
>247
貴重なアドバイスありがとうございます。
>マシンスペック、回線により送る量の調整が必要となります
そこなんですよね。バッファリングというか、ハンドルの遊びみたいな部分というか。
UPnPって操作したことないので全くわかりません。ぅw
確か、これから使うグローバルアドレス等をPGで指定できるんですよね。勉強します。
>248
ですよね。現時点でも Synmetric NAT は越えられない訳だし...
http://www.newrong.com/product/natsdk/ とかはどうなんでしょうねぇ?
>>247 > ■マウスはUDPの方がいいです。TCPでは効率悪すぎます
TCP_NODELAYやOOBつーもんがあるが
251 :
247 :2006/01/23(月) 09:10:39
>>250 すみません書き方悪かったです。本質的にはUDP,TCP関係ないです
回線的には書かれているようにTCP_NODELAYで乗り越えれます
レスの内容がリモートですので相手のマシンの処理能力に
影響される部分が多いです。時間情報つけて処理しきれない事に
気づいた時には回線上には大量のマウスデーターが順番待ちしてます
252 :
250 :2006/01/23(月) 10:12:54
リアルタイム性を失ったデータは捨てていい、 むしろ捨てた方がいいという状況下で、 TCPはオーバースペックという話なら納得。
253 :
デフォルトの名無しさん :2006/01/23(月) 11:51:07
auとかモバイルでオンラインアプリ開発するならどんな言語?
PHPかJavaかperl
255 :
デフォルトの名無しさん :2006/01/23(月) 12:52:50
perlとphpか リアルタイムを選ぶならjavaしかないすよね(至#;)
>>251 そういう状況だと、TCP_NODELAY は関係ない。
そのために、OOB つーもんがあるんだが。
258 :
247 :2006/01/24(火) 09:08:45
>>257 単独に
>>251 だけ見た場合 そうですね誤解を受ける書き方ですね
ここまで掘り下げる話題でもないんだけど・・・・
リモートに関することでスレ違いだったのでハッキリかかなくてすみません
いらぬ誤解を生んだようです。
>>247 でUDPの方が良いというのは訂正します。
TCPではできないというような印象を与えたようです
実際 私もTCPを使ってます(UDPの方が楽ですが)
>>250 さんの言われている通りですが
マウスの生データーをTCPを使ってまで送る必要は無いということです
実際キャプチャするとわかりますが もの凄い数の微小データーが発生します
TCPですとデーターは一定の数まで送信されませんが 実際はTCP_NODELAYを指定しなくても
問題ないぐらいにデーター数は多いです。逆にTCP_NODELAYを指定すると
マウスデーター1つにつき1パケットになるので再送等のリスクは高まります
相手のマシンが たとえばwin98の低スペックの場合データーは処理しきれず
たまります。そこで
>>257 さんの言われるOut of Bandなわけですが
そこまでTCPの機能を駆使してもデーターを間引く事になります
相手の画面のホワイトボードにはカクカクした線がでます。
そのため、クライアント側でマウスのデーターは補間して送る必要があります
■マウスのデーターを生で送るべきではない
■もし送るならばUDPで十分(TCPでもかまわない)
■データーを落としたくなければアルゴリズムを見直す。
(ここから先はこのスレッドと関係ないけど)
OOBってTCP内UDPみたいな感じ?
>>■マウスのデーターを生で送るべきではない カーソル移動しなくてもデータが生成されるようなハードからの生データは 送るべきないだろうけど、座標情報なら送っていのでは? XとかVNCでもそうやってるだろうし
vncは端折ってる。
Xはraw bandwidth X拡張ってのがあった。それも端折る。
>>258 はまじめだねえ。
端折るってのは間引くってこと?
263 :
デフォルトの名無しさん :2006/01/29(日) 14:07:36
ここで質問していいのか迷ったのですが、 現在、ある程度のjavaの勉強が終わったので、javaでネットワークの勉強を始めようと思っています。 最終的にはちょっとしたネットを使ったゲームができればいいなと思っています。 そこでいろいろ検索したのですが、ネットワーク初心者向けのサイトが見つからなかったので 「基礎からわかるTCP/IP Javaネットワークプログラミング」って本を買おうかと思っているのですが 他にオススメのとかご存知の方いるでしょうか。サイトとかでも教えていただけるとうれしいです。
箸折る - [動] 料理のまずさに食事を投げ出して帰ること。
はしょる と読みます。
>>264 そんなことされるくらいなら唐辛子の持込を許可してやるよ。
女将を呼べ!
268 :
デフォルトの名無しさん :2006/01/30(月) 15:54:44
コンテンツデリバリーサーバーの、 キャッシュサーバーとしての機能のみを備えたもの (ウェブコンテンツをキャッシュして、 回線速度とコンテンツの内容からの即時性を元に、 キャッシュされたものをクライアントに返すか、 ウェブサーバーまで最新コンテンツをとりに行くか判断) をプログラミングしたいと思っているのですが、 参考にすればいいページやソースコードなどあれば教えて下さい。
>>263 その本で十分じゃねえか? 分からなかったら本屋行って他の本買いまくれ。
分かるまで右から順番に買って行け。左からでもいいぞ。
272 :
268 :2006/01/30(月) 18:43:17
>269 回答&リンクありがとうございます。
>>270 本屋に行くたびに順番が変わってたりして。
>>273 それを防止したいなら全部大人買いだ。箱で買え。
本棚ごと買え。株式交換で本屋ごと買収だ。
275 :
デフォルトの名無しさん :2006/02/01(水) 15:18:54
UNIX(Solaris)でソケットプログラミングをTCP/IP Sockets in Cという本を読んで勉強しています。 コードも一応うまく動いているようで、クライアント側で"hello"と打てばサーバー側がそれを受け取ります。 それぞれどういう役割をしているかなんとなく理解しているつもりです。 で、これを具体的に使った例が見たいんですが 「TCP/IP ソケット プログラミング」で検索しても 具体的な例はどこにも見つかりません。 なんか簡単な飛行機の予約システムとか 本を注文するシステムのような具体例が載っているリンク知りませんか? "hello"とかサーバーの時間を調べるくらいじゃ全然面白くないんですよねぇ。 どうかお願いします。
276 :
デフォルトの名無しさん :2006/02/01(水) 15:49:50
俺が出した結論はこうだ! Visual C# for Win64API Visual C# for JVM つまり.NETはいらない。 ネイティブとジャヴァヴァーチャルマシーンで動くC#が最高。 そういうこと。
>>275 テンプレにRFC集のリンクがあるからHTTPでもSMTPでも好きなの読め
linux 2.4.27 + pthread で tcp のメッセージを受け付けるプログラムを書いています。 サーバ側で accept したら thread を立ち上げるものです。 接続が1つの場合は問題なく動くのですが、同時に多数の接続を試みると、 双方の recv がしばしば期待(固定長サイズ受信)に反して 0 (EOF)を受信してしまいます。 送信側では send は正常に返っているようなのですが、どうも具合が良く分からないのです。 多数同時接続の時のデバッグするときはどうしていますか?
>>279 send や recv は、戻り値を見てこんな感じで送る必要がありますが、
やっていますか?
int len = data_size;
char* p = data_ptr;
while (len > 0)
int sent = send(socket, p, len);
if (sent <= 0) エラー処理
len -= sent;
data_ptr += sent;
}
>>280 >data_ptr += sent;
p+= sent の間違い。
要は、たぶん期待したデータサイズだけ送れていないのではないか、と。
>>280-281 早速の回答ありがとうございます。
送り側のループ処理ですね!
受信側は recv を MSG_WAITALL で呼んでいたのですが、なるほど確認してみます!
283 :
280 :2006/02/01(水) 22:32:09
もう少し精査してみましたが、送信部分はきちんとできていた様子です。 同時に一斉にアクセスをかけてみると幾つかの現象が生じるみたいです。 1つのホストでサーバ&クライアントを動かして、ログを元にペアとなったPIDを 順に追ってみると、サーバが存在しないプロセスに対して応答していることが分かりました。 以下は互いに通信した実際のPIDの組み合わせですが、サーバの20605 はいないはずの何かから accept して、意味のないデータを受信しているようなんです。 どの当りが影響しているのでしょう?? server-client 20603-20600 20604-20601 20605-????? ← クライアントは存在しないプロセス!? 20609-20602 20610-20606 20611-20607 20612-20608
284 :
280 :2006/02/01(水) 23:17:47
自己フォローです。すいません。 accept して、pthread_create した直後に、usleep をちょっと挟んだだけで、上記不具合は 全く生じなくなってしまいました(いや、うれしいんですが)。どういうことなんでしょ。。。 if ( (s = accept(sock, 5)) != -1 ){ pthread_create(XXXX); usleep(5000); } みたいな感じです。
正直な話、コードも見せずに助言だけ求めるやつって何がしたいんだろうって思うよ。 俺はお前じゃねー通の
>>284 send側に問題がないのなら、recvの処理に問題があるのでしょう。
MSG_WAITALL を使わずにループにしてみてはどうですか?
移植性も高まるし。
>>284 問題の部分を引用しないと、なにが悪いか分かるわけないっつの
C/C++の宿題を片付ケます 60代目から引っ越してきました で、質問です 1 TCPソケット使って GET / HTTP/1.1 をHTTP鯖に送る 2 レスポンスが帰ってくる 3 データ部分に0f38とか、ソースに本来ないものが含まれる さいしょ、chunk分けされたものかなーって思ってたけど、 RFCに載ってないのかよーわからん・・・ 具体的なサイトは、このスレをtelnetでgetしてみると得られるかもしれません。 (とりあえずまんま元の質問をコピペ)
289 :
288 :2006/02/05(日) 18:35:27
('A`) しまった・・質問本体書いてないじゃん 質問は、この0f38とか言う文字列が何を指しているのか、 最終的には回避したいので、回避する方法につながる何かの情報提供をおまちしておりまゥゥゥゥゥィ
>>289 文字通りchunkじゃないの?
HTTP/1.1つけてGETしたんならchunk対応はMUSTなので
平気でchunkで送っていいことになってる。
対応できないんなら1.1を名乗っちゃいけない
rfc2616の18ページとか、103ページとか。
292 :
288 :2006/02/05(日) 20:01:27
>>290 さんと
>>291 さん
レスさんくすっす ('A`)
とりあえずrfc再読します
HTTP1.1対応するの諦めよっかな・・・
294 :
デフォルトの名無しさん :2006/02/06(月) 12:29:28
すみません、質問です。 UDPでサーバーにあるテキストファイルの内容を読むのは可能ですか? もし可能であればどうすればいいのか簡単な流れを教えてください。 関連する検索キーワードでもいいです。 まさかfopen()やfread()はクライアント側からは使えないですよね・・・
296 :
デフォルトの名無しさん :2006/02/06(月) 12:36:12
はい、誤解しまくってると思います。 自分が分かっているのはUDPでコネクションレスの通信ができる、程度です。 もしかして、サーバー側にfopen()とかやらせるには server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいんでしょうか? でも、どのタイミングでやらせればいいんでしょう? すみません・・・
>>296 > UDPでコネクションレスの通信
その解釈は正しくて、UDPはそれ以上でもそれ以下でもない。
> サーバー側にfopen()とかやらせるには
やらせるには、サーバ側に
> server.cの中でfopen("xxx.txt", "rb");なんて書いてやればいいん
です。
> どのタイミングでやらせればいいんでしょう?
UDPで送信する前にやっておかなくてはいけませんね
ファイルの内容が実行中に変わらないのなら、プログラム初期化時にやっても良いですし
常に変動し続けるのなら、送信する直前にするのもいいでしょう
298 :
デフォルトの名無しさん :2006/02/06(月) 12:47:59
ありがとうございます! 実はクライアント側からコマンドを打てばサーバー側でなんでもできると思ってました・・・(恥 ファイルの内容はもしかすると変動するかもしれないので、送信する直前にしてみます。 また質問することが「多々」あると思いますがよろしくお願いします。自分でももっと勉強しますから。
>>298 > 実はクライアント側からコマンドを打てばサーバー側でなんでもでき
ます。
ただし、当たり前ですが全て貴方が実装しなくてはなりません
300 :
デフォルトの名無しさん :2006/02/06(月) 13:10:20
>>299 あら、実装すればサーバー側でなんでもできちゃうんですね。
いらっしゃるなら、ついでにもう一つ質問を・・・
UDP(コネクションレス)ならマルチユーザーになった場合、
二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?
TCP/IP(コネクションあり)だとクライアントとサーバーが
一対一でつないでいる間は他のクライアントはつなげなかったんでしたっけ?
それならそんな場面に出くわすことはなさそうですが・・・
( ´ー`)y-~~
_| ̄|○
>>300 > UDP(コネクションレス)ならマルチユーザーになった場合、
> 二人のクライアントが同時にサーバーにあるデータを変えてしまうような場面に遭遇しますか?
いやだから、UDPはover IPな通信路を築いているだけで、
サーバ側やクライアント側のアプリケーションプロトコルはまったく感知しないんですよ
貴方の言っていることをちょっと大きく言えば
1 神飛行機に「お願いです、命たすけてくだしあ」って書いて天空に飛ばしてみる
2 神が受け取る。けど助ける命いっぱいある
3 どれ先に実行すれば良いか悩む
4 もうpanicですよ
という1〜4の手順の中で、UDPに相当するのは”神飛行機”になります。
神飛行機が神の審判を助けたり、貴方のお友達を助けるわけじゃないですよね?
この「審判」や「助ける」のはover 神飛行機なアプリケーションプロトコルなので、
貴方が「審判」の実装や、「助ける」の実装をしなくてはならないのです。
> TCP/IP(コネクションあり)だとクライアントとサーバーが一対一でつないでいる間は
> 他のクライアントはつなげなかったんでしたっけ?
> それならそんな場面に出くわすことはなさそうですが・・・
んなことない
TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ
なんかもう無意味に色んな例えで説明したくなるな でも多分なかなか分かってくれなさそう
> 命たすけてくだしあ
なるほど。ということは僕自身が どのクライアントがどういうタイミングに来たときにどうするか決めてやらないといけないんですね。 >>TCPのリスナは「待つだけ」で、「コネクションが到達」したら「接続されたソケットを作」ってまた待ち続けるだけ ああ!そうでしたね。 よく見たら、つなげられる上限を決める定数が上の方で定義されてました。 もっと勉強しときます。 図書館がそろそろ閉まるので今日はこの辺で。また来ます。ありがとうございました!
>>306 一概に「アプリケーションプロトコルとは〜というもの」とは言えないけれど、
とりあえずステートマシン(=状態遷移を伴い、状態によって挙動が変わるプログラム)を組まなくてはならないと思う
まぁ、「どういう場合に問題が起こるか?」というだけで授業まるまる1つ使うくらいの物になるから、そのへんは勉強だわな
>>305 わすれてタタタタタタタ\\・・
いや別に accept 受けてから listen に入らなきゃ同時に 2 接続が 発生することもないだろ。UDP もしかり。要は作り次第。 どうでもいいがエラく早く閉まる図書館だな。
失礼、2接続の発生っつうか 2 つの処理が同時に走る、だな。
割り込みスマソ。 今TCPでプログラム組んでます。 send()の直前でsetsockopt()でTCPヘッダのDSCP値を 変更してパケット出力をするプログラム書いてるのですが、 etherealでパケット確認すると、TCPヘッダのチェックサム値が エラーとなってます。 受信先ではきちんとデータ取れてるんですが・・・。で、質問なんですが、 1.チェックサムの計算って誰がやるの?NIC?OS?ソケット? 2.チェックサムが異常のパケットって破棄されると思ってたんですが、 受け取れるのはなぜ?(recv()もエラーになってない。)実は破棄 されない? 全くもってわからず困ってます。どなたか俺の神飛行機を受け取って 助けてくださいorz。
>>310 TCP/IPを実装しているのは、例えばNICとかルータとかだよな。
どの部分でTCPのチェックサムを処理しているかわからないけれど、
TCPのチェックサムでエラーが発見された場合は再送信するようになってるはず
受け取れるということはチェックサムが正しいことになるのでは?
と神飛行機に書いてとばしてみる
>>311 レスありがとうございます。
>再送信するようになってるはず
そうなると再送要求のパケットが飛ぶはずですよね?
再送要求も出てないのですよね・・・。ethrealのバグか?
他のパケットキャプチャソフト使ってもうちょっと試してみます。
他にも回答頂ける方いましたらplz m(__)m
スミマセンがageで。
>>312 > そうなると再送要求のパケットが飛ぶはずですよね?
うーん・・・どうだったかなぁ
なんだか再送信要求のパケットなんて飛ばなかったと思うんだが・・・
314 :
310 :2006/02/06(月) 15:08:13
自己解決出来ました。書き込む前に試せよって話ですが、 現象が起きたのはLinuxの送信ポートのキャプチャを見てたのですが、 Windowsの受信ポートのキャプチャを見たら、正しいパケットでした。 Linuxの方のetherealのバグかは謎ですが、パケットを拾ってる タイミングに問題ありなのかな?と思ってます。ちと実験で、 Windowsで送信する際にDSCP値書き換えた場合の送信ポートの パケットとLinuxで受信したパケットを拾ってちと検証してみます。 再送要求のパケットなんてありませんでしたね(^^;失礼しました。 何分勉強途中なもので。 ありがとうございましたm(__)m
いまどきCRCの生成はNICにオフロードされているので、それまでの間に パケットをかすめ取っていると、CRCは当然合いません。
>>306 > なるほど。
あの例えでわかったんかよ(ワラ
>>308 listenじゃなくて次のacceptだろ?
317 :
310 :2006/02/09(木) 11:32:33
今更な遅レスですが。
>>315 >いまどきCRCの生成はNICにオフロードされているので
オフロードってどういうことですか?今時って事は昔は
また違ったのでしょうか?興味本位で教えてください。
また別の質問です。スイマセン(--ゞ。
TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
わかりますが、このサイズを超えたデータを受信した場合は、
超えた部分は破棄されると考えて問題ないでしょうか?
例えばRWIN値が5KBとし1KBのデータが連続的に送られてくるとします。
最初の1KBのデータを受信し、そのデータに何らかの処理を行ってる最中
にもデータは送られてる訳で、6個目以降のデータは破棄されてしまうの
でしょうか?
RWIN値のMAX値って64Kだと思うのですが、1MBのデータ送った場合等、
受信速度>送信速度でない場合データ取りこぼしまくるんじゃないかと
思うのですが。
稚拙な質問ですが教えてください。
>>317 > TCP/IPの受信バッファのサイズはRWIN値で設定されているのは
> わかりますが、このサイズを超えたデータを受信した場合は、
> 超えた部分は破棄されると考えて問題ないでしょうか
破棄される
その代わり相手が再送信する
あまりにも送信できないとタイムアウトで切断される
じゃなかったっけ?
送信側はRWIN分はとにかく受け取れるのが判ってるから、RWIN分を連続して送る。 その後はACKが来るのを待つ。 それが伝送制御ってもんだ。 だからRWINが大きいほうがスループットが上がるんだよ。
320 :
デフォルトの名無しさん :2006/02/09(木) 21:31:32
javaでキャッシュサーバをプログラミングする際に、 参考になるようなページを教えて下さい。
>>317 Checksum Offload 機能でググれ
ただ、いつも
>>315 の通りなわけじゃない。(断言しているが)
323 :
310 :2006/02/10(金) 12:47:44
皆さんありがとうございます。 精進しますm(__)m
http://pc8.2ch.net/test/read.cgi/tech/1103998649/508-509 で質問させていただいているものなのですが
ネットワーク関係はこちらのほうがよさそうなので
もし、よろしければ上記のアドレスの疑問なのですが教えていただけないでしょうか。
いろいろ試したところクライアント側の送信がゲームの毎フレームごとに
送信されておらず一定時間ごとに送信されてしまっているため
サーバー側で座標をクライアント側から毎フレームごと得られずカクカクしてしまっているようなのです。
win2k
VC#2003使用
通信部分はゲームのメインループから
・サーバー
try
{
Int32 port = 9999;
IPAddress localAddr = IPAddress.Parse("192.168.0.1");
server = new TcpListener(localAddr, port);
server.Start();
t= new Thread(new ThreadStart(receive));
t.Start();
}
catch
{}
・クライアント
t= new Thread(new ThreadStart(Con));
t.Start();
のようにスレッド化してあります
なんかnagleアルゴリズムのお陰かもしれない雰囲気 でも、とりあえずどんな時間間隔でどれくらいのデータが送受信できてるのか確かめないとね
>>324 C#はよく知らないが、世間で言うところの TCP_NODELAY オプションを
使うといいのではないかな。
327 :
411 :2006/02/10(金) 21:13:29
ありがとうございます。
nagleアルゴリズム調べさせていただきTCP_NODELAYに関してもわかりましたが
オプションらしきものがMSのドキュメントを見てもわからないため
UDPでの通信をしてみようと思っています。
>>247 でマウスの位置を送るようなことが書いてあり
リアルタイムデータ送信ならUDPのほうがよいみたいですので。
また、何かありましたらよろしくお願いします
>>327 setsockopt()とか無いの?
//儚いUDPを使う
>>327 の強気の態度に惚れるかもしれん
329 :
324 :2006/02/10(金) 22:12:13
UDPで作成してみたところ TCP使用時とほぼ同じ動きを行います。 ゲームの1フレームごとに通信が確立していない可能性が高そうなので マルチスレッドの部分も含めて非同期通信部分を見直します。
330 :
411 :2006/02/10(金) 22:17:41
また、わかったこととして try catch構文で通信のエラーを破棄する処理を入れれば問題なく動く場合でも try catch構文をはずすだけでエラーをはいて強制終了する場合がある。 スレッドを用いた場合は明らかに通信の回数が減っている ただし、スレッドを用いない場合は通信受付待機の時間が ゲーム画面の1フレームの更新時間にかなりの影響を及ぼし ゲームにならなくなってしまう。
非同期UDP使えばいいんじゃないの?
333 :
324 :2006/02/10(金) 22:34:50
>>331 ありがとうございます。
なにぶん未熟なものでして、TCPで使っていた
マルチスレッドを利用したUDPの非同期?通信は試してみたのですが
TCPのときとさほどかわりませんでした。
今行っているゲームの通信部分は3Dモデルの主人公の動きを相手側でも
同じように再現するために座標を送っています。
>>333 UDP結構使える?
うちのLANだと1〜2%ロスだったけど、WANに出ると正直どうなるかわからんのだ・・
>>327 tcp_client_instance.NoDelay = true;
336 :
324 :2006/02/10(金) 23:05:04
>>335 ありがとうございます
client = new TcpClient("192.168.0.1", port);
client.NoDelay = true;
と定義できました。
しかし、動作は変わりませんでした。やはり非同期通信がうまくいっていないようです。
>>334 自分もLAN環境での実験ですが
やはりロスは出ているようです
TCP_NODELAYと非同期通信は全く関係ないと思うんだが・・・。
非同期通信って何なんだよ・・ あれか? プログラムレベルで同期処理するのを同期通信って言うのか? ならノンブロッキングソケット使ってるってことか?
select使えってことじゃない?
340 :
デフォルトの名無しさん :2006/02/11(土) 05:09:34
物理的に一つのクライアントから、複数のIP元を装って、 一つのサーバーにhttpリクエストを生み出すことのできるフリーウェアってありますか?
342 :
340 :2006/02/11(土) 09:31:21
回答ありがとうございます。
343 :
324 :2006/02/11(土) 14:35:11
ゲームのメインループに接続の関数を入れていて それが原因で接続したり切断されたりしていたようです。 無事3Dゲームのネットワーク化に成功しました。 いろいろありがとうございました。
344 :
デフォルトの名無しさん :2006/02/12(日) 17:59:08
gethostbynameとinet_ntopについての質問です。 ------------------------------ #include <stdio.h> #include <sys/socket.h> #include <netdb.h> int main(void) { char*ptr, **pptr; charstr[4]; struct hostent*hptr; ptr="www.asahi.com"; hptr=gethostbyname(ptr); pptr = hptr->h_addr_list; printf("address:%s\n",inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str))); } ------------------------------ 以上のような短いプログラムを作ったのですが出力が address:(null)となってしまいIPアドレスが表示できません。 asahi以外にも試したのですが同じ結果になりました。 どうしたら正常に表示できるのでしょうか。ちなみに 他のhostent構造体の例えばh_name等は正常に表示できました。 OSはsuse10.0 x86_64版です。
なんでstrが4byteしかないの? そこを20とかに増やしてみては
>>344 ぜんぜんエラーチェックしてないのもアレだが、str[4] がもっともアレだ。まずここを str[16] くらいにしてみよう。
>>345 >>346 レスありがとうございます。
いやIPアドレス4バイトなのでcharで4バイト確保しました。
とりあえずchar str[20]位で領域増やしてみます。
>>347 > いやIPアドレス4バイトなのでcharで4バイト確保しました。
あのな、sizeof("xxx.xxx.xxx.xxx")っていくつか考えてみよう。
>>348 そうでした、すっかり勘違いしてた。また
>>344 のプログラムで単純にstrの領域を増やすと
セグメンテーションエラーになったので
#include <arpa/inet.h>
を加えchar str[16]にしたところ、無事IPアドレスが表示されました。
---------------------------------------
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <arpa/inet.h>
int main(void)
{
char str[16];
char *ptr, **pptr;
struct hostent *hptr;
ptr="www.asahi.com";
hptr=gethostbyname(ptr);
pptr = hptr->h_addr_list;
/* printf("\taddress: %s\n",inet_ntoa(*(struct in_addr *)*pptr)); */
printf("\taddress: %s\n",inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
printf("%s\n",hptr->h_name);
}
--------------------------------------
>>345 >>346 >>348 どうもありがとうございました。
350 :
デフォルトの名無しさん :2006/02/13(月) 20:58:57
ウイルスチェッカー(AVG)のメールスキャンログを見たら、 誰かの自宅サーバっぽいIPアドレスのSMTPサーバに接続しようとしている ログが多数、残っていました。結局、コネクションは成立していません。 ウイルス、Spyware系のチェックはしたのですが、検出されず。 メールを送ろうとしているプロセスを突き止めるには、どうすればよいでしょうか? Win2000,VS2004(C++)です。
351 :
デフォルトの名無しさん :2006/02/13(月) 21:12:43
UDPで送ったパケットの順番って 実際どのくらいの頻度でひっくり返る?
>>350 VC 使えるんなら、netstat -o をズート実行してsmtp へコネクションを
張ったプロセスを見つけたら PID からプロセスの情報を得てログする、
というプログラムを書いて一晩くらい走らせてみては?
353 :
350 :2006/02/13(月) 21:39:21
いまやってみたんだが、、プロセス、Winnyだった。。。 ヤツってメール送る?
>>353 ポート開けないヤツが使ってると思われ。
355 :
350 :2006/02/13(月) 21:56:13
>>354 その場合は、どうすればプロセスを特定できるんだろう?
とりあえずVMWare起動したww
単にWinnyのポートを25にして使ってるヴァカがいたってだけだろ。
357 :
350 :2006/02/13(月) 22:54:20
昼、夕、それぞれ一人ずついたけど 思い過ごし? それとミスったけど、ポートはPOP(110)でした。
358 :
デフォルトの名無しさん :2006/02/13(月) 23:16:46
Linux初心者です。 インターバルタイマーが必要で SIGALRM を使用してるんですが、 同じプロセスで 受信処理のために NONBLOCK の select() を使用すると、 タイムアウト設定してコールしてもselect()のタイマーが正常に働きません。 どうすればいいんでしょうか? できれば子プロセスで処理を分けずに。 またselect() のイベントでイベントハンドラーを起動するような作り方は通常 するんですか?
板違いだろ。 セキュリティ板いけよ。
>>351 もちろん状況次第だが、関西地方のフレッツ ADSL で、
結構ひっくり返ったことがある。
# ソフトがバグってて、パケット逆転したら受信してい
# た画像がブロックノイズだらけになって、ばれた。
362 :
358 :2006/02/13(月) 23:23:16
360s ありがとうございます。全部select()使えばいいんですね、すみません。
リッスンしているソケットをselectでずーっと待ってるときに、 中断させたいときは、別のスレッドなどから shutdown、closesocket、などを呼んで中断させる方法しか思い浮かばないのですが、 もっとスマートな方法はありませんか?
一緒にパイプとかも待てば? 同様に、WindowsならEventSelectでEventを待つよ。 IOCPのサンプルなんかで、このやり方を使ってる。
>>363 UNIXならsignal受けてEINTRのexeptionで復帰させるとか、
selecltじゃなくてpoll使ってurgent data受けるとか。
selectとurgent dataもOKなのかもしれないけれど、
undocumentedなので使ったことなし。
>>364 >>366 返信ありがとうございます。
一緒にパイプを持って、それで抜けるようにします。
>>365 経験上、帯域上限辺りまで使うと結構ひっくり返る希ガス
369 :
デフォルトの名無しさん :2006/02/14(火) 20:03:38
raw socketを勉強しようと以下のようなプログラムを作ったのですが SIO_RCVALLした所で10022が出るPCやWSARecvのところで10055が出るPCがあったりするのでお知恵を拝借させて頂けませんでしょうか 動かしてみたOSはWindows2000とWindowsXPです。Adminユーザーで実行してます。 ---------------------------------------- #include <winsock2.h> #include <mstcpip.h> #include <stdio.h> int main(int argc, char **argv){ SOCKET sock = INVALID_SOCKET; DWORD d, optval = 1, flags = 0, len; SOCKET_ADDRESS_LIST *addrlist; SOCKADDR_IN addr_in; WSADATA wsd; char buffer[65536]; int i; WSABUF wsb; if (0 != WSAStartup(MAKEWORD(2, 2), &wsd)) goto err; if (INVALID_SOCKET == (sock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, 0))) goto err; if (SOCKET_ERROR == WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buffer, 1024, &d, NULL, NULL)) goto err; addrlist = (SOCKET_ADDRESS_LIST*)buffer; if (0 == addrlist->iAddressCount) goto close; addr_in.sin_addr.s_addr = ((SOCKADDR_IN*)(addrlist->Address[0].lpSockaddr))->sin_addr.s_addr; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(0); if (SOCKET_ERROR == bind(sock, (SOCKADDR*)&addr_in, sizeof(addr_in))) goto err; if (SOCKET_ERROR == WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &d, NULL, NULL)) goto err; for(i = 0; i < 10;i++){ wsb.buf = buffer; wsb.len = sizeof(buffer); if (SOCKET_ERROR == WSARecv(sock, &wsb, 1, &len, &flags, NULL, NULL)) goto err; } goto close; err: printf("ERR %u\n", WSAGetLastError()); close: if (sock != INVALID_SOCKET){ shutdown(sock, SD_BOTH); closesocket(sock);} WSACleanup(); return 0; }
370 :
319 :2006/02/16(木) 19:56:51
ttp://www.st.ryukoku.ac.jp/~kjm/security/ml-archive/port139/2003.03/msg00137.html で
> (1)ICF/ICSのサービスを開始しろ
> (2)Personal Firewallを停止しろ
(3)IPSEC Services サービスを開始しろ
MSDNのサンプルで
printf("NOTE: IPv6 does not currently support the SIO_RCVALL* ioctls\n");
ってのを見付けたんでサービス関係をその通りに動かして、IPv6がアダプタのプロパティに入ってないことを確認したんだけど状況かわらずです
WSA*を使っているのが間違いの元かとも思いWSASocket→socket、WSAIoctl→ioctlsocket、WSARecv→recvと変えてみてもやはり同じでした
RCVALLするまでの準備の部分に何か誤りがあるのでしょうか?
371 :
369 :2006/02/16(木) 19:58:41
ハンドルのとこ間違って書き込んでしまいました319じゃなくて369です
t est
373 :
デフォルトの名無しさん :2006/02/18(土) 01:05:12
Win32APIスレでスレ違いと言われたので、こちらで質問します。 オープンしたソケットで利用中のNICのMACアドレスを得る方法を 教えていただけますでしょうか? 接続元、接続先のMACアドレスどちらでもかまいません。 OSはWindows XPです。
getsockopt(s, NSPROTO_IPX, IPX_ADDRESS, &IPX_ADDRESS_DATA..); で、IPX_ADDRESS_DATA::nodenumかな。 もちろん、IPXソケット限定だけど。
375 :
373 :2006/02/18(土) 18:57:24
自己解決しました。
市ね
warota
Winsockを使ったソフトを作っているのですが、 自分で立てる→127.0.0.1で接続 はできました。 ところが、人様に立ててもらって、IPを教えてもらったところ、接続しようとしても駄目でした。 その人は、自分のマシンで自作のチャットサーバを動かして、外部から接続できている、 と言ってるので、その人のネットワーク環境は特に問題なさそうです。(ポート解放等 自分→ループバック でできるのに、インターネット経由で繋がらない場合、 どんなミスがありえるんでしょうか・・・? 127.0.0.1の場合も、グローバルIPを入力しても、 同じコードで、 sin_addr.S_addr:=inet_addr(PChar(ip)); としてるので、本質的には同じだと思ってたんですが。。。 ちなみに、WSAAsyncSelectを使う非同期の、TCPソケットです。 開発環境はDelphi6Personal + ProjectJEDIのWinsock2.pas です。
解決しました 他の人が立てたら普通に。
380 :
デフォルトの名無しさん :2006/02/22(水) 22:18:47
C#のWindowsアプリでソケット通信の非同期サーバを 作っているのですが、切断時に Socket.Close() を行うと下記の例外が発生するのですが、 どうすれば回避できるでしょうか? ---------------- 破棄されたオブジェクトにアクセスできません。 オブジェクト名 'System.Net.Sockets.Socket' です。
UNIXのソケットプログラムで。 ソケットのファイルディスクリプタ(int)から通信が行われている自分側のポート番号取得することは可能? accept したあとの子プロセスから呼び出される関数で、ファイルディスクリプタはもらうんだけど struct sock_addr_in の構造体はスコープ外で直接アクセスできない、という条件です。
getsockname/getpeername
384 :
デフォルトの名無しさん :2006/02/22(水) 23:33:12
>>373 >>378 >>380 このスレはアンチM$の粘着UNIXオタが常駐してるだけだから
winsockのまともな返答は期待できないと思った方が良い
そうだよな
おまえら
385 :
デフォルトの名無しさん :2006/02/22(水) 23:35:40
だから俺はこう思う このスレは「UNIXネットワークプログラミング相談室」と改名するか UNIX板に移動した方がいいんじゃないかって UNIX厨は隔離板から出てくるなよ
なんか毎回クソ回答しかしない無能なUNIX使いが出張るスレだなあ・・ みたいなのはおれも感じてたが。 そうか。
>>385 俺としては「WinSockプログラミング相談室」の方がいいかなあ。
UNIX厨が出てこられるとマジうざいんで。
388 :
382 :2006/02/22(水) 23:51:46
Winsockなら分かるが、正直C#はわからん。 中身のないレスをするアンチUNIX厨は鬱陶しい。
( ゚д゚) UNIX厨言われちゃってるよ… _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
390 :
デフォルトの名無しさん :2006/02/23(木) 00:49:27
Windows XP で gethostbynameにて C:\WINDOWS\system32\drivers\etcにある hostsファイルに記述したホスト名から IPアドレスを取得したいのですが、取得できません。 どうしてでしょうか? 例えばhostsファイルに 38.25.63.10 x.acme.com のようにかいてgethostbynameでx.acme.comを指定してやれば 38.25.63.10が取得できると思っているのですが・・・
>>390 コードさらさないでどうやってこたえろと
winはlmhostsじゃなかったっけ。 とか数年前の記憶を元にほざいてみる。
393 :
382 :2006/02/23(木) 01:44:50
>>390 > 取得できません。
これも状況を説明しないとね。gethostbynameはどうなるの?
394 :
382 :2006/02/23(木) 01:48:21
>>380 たぶんそのソケットが既にCloseされてるから。
Connectedプロパティを確認してみてください。
なぜCloseされているのかはプログラムの作者以外誰にもわからない。
質問です。 簡単なネットワーク対戦可能なインベーダーを作成中なのですが、 一般的に皆様がこのようなゲームを作成する場合、常に移動すべく玉の 座標情報送信処理は、どのような感じ・どのぐらいの間隔で行ってるのでしょうか? (20msに一回、UDPにて更新処理を行おうかと思っていますが…)
>>396 動いたら送信
動かなかったら送信しない
このとき送るのは可能な限り
差分ではなく適当な絶対値
>>396 動きが計算できるタマだったらいちいち送る必要はないんじゃないか?
プレイヤーの座標を最優先する。
399 :
396 :2006/02/24(金) 01:40:24
ありがとうございます。 動きに関しては誘導弾など可変の性質を持つものがあるので計算はできないです。 普段の座標情報(弾道)送信処理は 弾座標送信←20ms→弾座標送信←20ms→弾座標送信←20ms→弾座標送信… のようになっていて、 キー入力によるプレイヤー座標の送信処理が発生した場合に 弾座標送信←x→人座標送信←20ms-x→弾座標送信←20ms→弾座標送信… └ ←20ms→ ┘ のような作りになっています。用はプレイヤー移動による座標送信処理は 定期的に20msごとに行われるサイクルの、その20msの中のどこかに割り込みが 入るみたいな感じで作ってあります。 二番目の質問である>どのくらいの間隔で行っているのでしょうか というのは質問の仕方が悪かったです。 上記の仕組みで、間隔の20msは値として小さすぎるなどの問題はないでしょうか?
>>399 遅延問題も兼ねるので、そのあたりはまるっきりあなたのセンスかと
ちなみにプレイヤー座標が得られている限り、誘導弾は可変では無い。 そのへんの見極めが出来てないようでは
402 :
396 :2006/02/24(金) 02:09:07
確かに個々のハードウェア・環境によっての遅延問題はプロトコルの仕様 云々以前の問題ですね・・やはり最適な値というか、問題なさそーな 値を自分で見つけるしかないということですかね。 ロックオンとか無しでの手動誘導です。プログラミング自体慣れていないので アルゴリズム的なセンスがないのは痛感してます… 色々と参考になりました。ありがとうございます。
403 :
390 :2006/02/24(金) 07:44:44
> 取得できません。 hostsファイルに記述してgethostbynameを呼ぶと復帰値NULLで 取得できませんでした。 lmhostsファイルに記述してgethostbynameを呼ぶと復帰値からIPアドレスを 取得できました。 どうしてhostsファイルを見にいってくれないんだろう?
まさか、hosts.txtというオチでわ
lngReturn = NetMessageBufferSend(NULL,address,fromname, (BYTE *)msg,sizeof(WCHAR) * lstrlenW(msg)); Win2kではfromnameが反映され正常に送信できますが WinXPSP2ではlngReturnに0xE1が戻ってきます。 fromnameをNULLにすれば正常送信できますが、勝手にマシン名が入ってしまいます。 何故? XPでもfromnameを反映できる方法がありますか
406 :
597 :2006/02/25(土) 09:17:04
生ソケットで、TCP/IPを実装する場合、 TCPの最初と最後の3wayとかの部分も自分で書くんですよね? で、送るのはsendtoで良いと思うのですが、受け取るのはrecvfromですか? つまり、生ソケットでTCP/IPを使う場合、UDP用のAPIを使うの?
to, fromの部分は自分の役割じゃん。
だから普通send, recv。
>>6 に実装リストあるよ。
>>403 > hosts ファイルに記述して gethostbyname
> を呼ぶと復帰値 NULL で取得できませんでした。
ちゃんとマニュアル読めよ。
Return Values
If no error occurs, gethostbyname returns a pointer
to the hostent structure described above. Otherwise,
it returns a null pointer and a specific error number
can be retrieved by calling WSAGetLastError.
host ファイルを見に行く以前の問題だよ。
windowsで非同期イベントを使ってサーバーを書いているのですが SOCKET client_sock = accept(...); HANDLE event = CreateEvent(...); // マニュアルリセットはfalse ... WSAEventSelect( client_sock, event, FD_READ | FD_CLOSE ); ... while(1) { result = WaitForMultipleObjects( event_size, event_array, false, INFINITE ); switch( result ) { .... } } サーバーサイドはこのような感じなのです。 クライアントサイドで、 send( ... ); //1回目 send( ... ); //2回目 などとやると、1回目は、WaitForMultipleObjectsから戻り、正常に受信するのですが、 二回目以降がWaitForMultipleObjectsから戻ってきません。 1回目と2回目の間にSleep(10)などを入れると、二回目も正常に受信するのですが、 これはどういうことなのでしょうか?
>>409 1回目の処理が終わる前に受信しちゃうんでない?
Nバイトのsend*2がN*2バイトのrecv*1でに変換されたんでしょ。
412 :
デフォルトの名無しさん :2006/02/27(月) 08:53:05
生ソケットでUDPとかのプログラム組む時のソースって、 何で擬似パケットを用意するのですか?
413 :
デフォルトの名無しさん :2006/02/27(月) 09:16:57
チェックサム値の算出の為、で合ってます?
疑似ヘッダをデータ構造として持たなくても、 チェックサムの値は計算できるので、 プログラマの好みの問題としか言いようがない。
415 :
409 :2006/02/27(月) 16:34:04
Sleepを入れないで二連続sendした後は、何のイベントも通知されなくなるんです。 FD_CLOSEも通知されません。
eventの使い方を間違っているとかな。
非同期のソケット用にAllocateHWndでウィンドウを作って、 メッセージループでイベントを受信→処理 としていますが、 この場合、AllocateHWndを呼び出したスレッドと、 作られたウィンドウのメッセージループは、 スレッドセーフにしなくても大丈夫ですよね? Delphi+Winsock(WSAAsyncSelect)の話です
XPでWinsockを利用すればIPヘッダやTCPヘッダを書きかえれるというのを聞きました ところがSP2の導入でそれが不可能になったと聞きました。 そこで質問です、今現在IPヘッダ,TCPヘッダを書き換えて パケットを送信する方法は無いのでしょうか? 以下の中に答えはあるんでしょうか? @SP2をアンインストールすればできる AWinPcapを利用すれば出来る BUnixだったら出来る C上記以外の方法で出来る Dなにやっても無理。現実は非情である。 色々間違った質問だと思いますが、良かったら答えてくださいませ よろしくお願いします。
答えられない人が横槍で感想を挟むのはスレ的に駄目なのかな?
でも。
>>418 ほほう!そうなんですか?
てっきりそーゆーのは
ネットワークカードのドライバ直で叩くんだと思ってました
>>418 Linuxでpacket(7)とか。
ただ、ISPでフィルタリングされている場合は外に出ない。
421 :
409 :2006/02/27(月) 20:22:30
>>410 すいません。レス見逃してました。
410さんの言うとおり、1回目の処理中に2回目のイベントが発生してるっぽいです。
WaitForMultipleObjectsが呼ばれている状態でシグナル状態になったイベントしか通達されてない状態(ぽい)です
どのように回避すればいいのでしょうか?
>1回目の処理中に2回目のイベントが発生してるっぽい これは何でわかったの?
>>422 「発生してるっぽい 」ってことで予想です。
FD_READがきたら、-1を返すまでrecvする必要があるけど。
>>424 -1まで読むように書き換えたら正常に動くようになりました。ありがとうございます。
そうだったんですか。知りませんでした・・・
426 :
デフォルトの名無しさん :2006/02/28(火) 11:00:18
受信したTCPパケットのヘッダ情報を取得するには rawソケット使わないと駄目ですかね?
>>418 とりあえず、WinPcapというか、その中のPacket.libを使えば
どんなイーサネットフレームの読み書きでもできる。
NDISレベルで読み書きするので、ATMとかFDDIでもOKだと思う。
イーサネットカードしか持ってないので知らんが。
ただし、パケットをイーサネット(データリンク)のヘッダまで含めて
自分で作らないといけない。Linuxのpacket socketなら、arpの解決
ぐらいはしてくれた気がするが、それもしてくれない。
iphlprのSendARP呼べば終わることだけど。
IP、TCPを書き換えてってのが、OSのスタックが吐いたパケットに
加工する、という意味なら、仮想インターフェイスを作って、
そこへ書き込まれたフレームを読んで、加工して、実インターフェイスに
書き出す、とか。
GREのトンネル作るとか、802.1qのタグ振るとか、MPLSのラベル割り込ませるとか、SoftEther的なもの
つくるとかだったらこっち。
仮想インターフェイスのつくり方は、openvpnとか、tapcontrol.exeとかでぐぐれ。
ネットワークプログラミング初心者です。 418 さんの質問と多少かぶるのですが↓のような環境で AのポートaaaaとSのポートbbbb」がTCP接続されているのですが、 [PC(A)]---[PC(B)]---[router(R)]---(TheInternet)---[Server(S)] (a) (b) (c) (d) (e) (f) (A)(a)192.168.1.2 OS:WinXP (ポートaaaaでクライアントを使用) (B)(b)192.168.1.1 OS:WinXP (Windows付属のネットワーク共有(DHCP)が稼動) (c)192.168.0.2 (R)(d)192.168.0.1 (e)202.yyy.yy.y (S)(f)202.xxx.xx.x (ポートbbbbでサーバー稼動) BでA←→S間のパケットを編集する場合どのようにしたらいいでしょうか。 VC#のraw Socketを使ってBを通過するパケットのIPヘッダーなどをモニター したり、IPヘッダーを作ってB→Aに送ったりすることはできたのですが AからのパケットをSに流さずにBで止める方法がわかりません。 427 さんのWinPcapをつかえば可能なのでしょうか。 なにとぞご教授のほどお願いします。 (ちなみにAのクライアントソフトはホストのIPとポートが固定なのでBで串などは つかえそうにありません。)
>>428 Aのクライアントソフト、これの詳細plzwっうぇwっうぇ
>>428 (訂正)ずれました
[PC(A)]---[PC(B)]---[router(R)]---(TheInternet)---[Server(S)]
NIC~(a)~~~(b)~~(c)~~~(d)~~~~~(e)~~~~~~~~~~~~~~~~~~(f)
431 :
417^ω^ ◆8vOv.D2p4. :2006/02/28(火) 16:50:24
どうやら あまりに アホな 質問を して しまった ようだ
PC(B)をWindows止めてLinuxでも入れたら?
すれ違いかもしれませんが質問します。 コマンドプロンプトのnet viewでLAN上のPCの一覧が 表示されるんですが、どっかのPCが突然落ちた場合でも net viewでそのPCがいつまでも表示されてしまいます。 nbtstat -Rとかやってもだめでした。 いい方法がありましたら教えてください。
それはマスタブラウザがブラウズリストを保持してるから。 更新間隔を短くすれば、当然ネットワーク負荷はあがるが、 失効までの間隔も短くなる。
それプログラミングじゃないし…
ああなんだ。Sambaを改造する話か。
>>428 1. 「Routing and Remote Access」サービスを止めるか、iphelperの
EnableRouter()で、パケットのフォワーディングを止める。で、WinPcap
使って、自分のプログラムでフォワーディングする。ついでに加工する。
2. NDISのフィルタドライバで、パケットのドロップ、加工を制御する。
のどちらかだと思うけど、1はダサい。やるなら2。
フィルタドライバはWINDDKのPassThruドライバを雛形にすれば良い。
WINDDKがめんどくさいか、MSDNに入ってなくて手に入らないなら、
ttp://www.ntkernel.com/w&p.php?id=7 のWinpkFilterが使えそうな気がする。privateかeducational useなら無料
らしい。
>>432 の言うように、Linuxにするなら、iptablesのモジュールにするのが
手っ取り早いと思う。MASQUERADEみたいなもんか。
>>437 的確なアドバイスありがとうございます。
2のNDISフィルタはDDKがないのと自分にはまだ敷居が高そうなので
とりあえず1のIpHelper+WinPcapを試すことにしました。
>>432 PC(B)がメインPCなので普段よく使うアプリなどの関係で
なかなかLinxにきりえにくに状況です。(PC(A)はスペック低すぎるので)
ただいつかはLinuxメインでいきたいとおもいます。
snmpでsnmptrapだけ実装したいんだけど net-snmpの実装があまりにもすぱっげちぃで はきそうで そのいいソース知ってる人いませんか?
実装したいというのはどういうこと? snmpのライブラリを書くわけ? 利用するコードを書くの?
441 :
デフォルトの名無しさん :2006/03/02(木) 10:00:21
ソケットが開いてるか閉じてるか判定するにはどうしたらいいんですか?
ソケットを開くにはどうすればいいんですか?
443 :
417^ω^ ◆8vOv.D2p4. :2006/03/02(木) 12:51:39
>>441 recvしてみて返り値がSOCKET_ERRORなら閉じてる
0以上なら繋がってる
じゃだめかな
>>441 コネクション型だとして、getpeernameとか呼んでみたらどうかな。
socket() が成功した後はずっと「開いている」状態だろ。
close() しない限り勝手に閉じないよ。
接続しているかそうでないかなら
>>444
446 :
デフォルトの名無しさん :2006/03/02(木) 20:55:16
はじめまして 実装上でアドバイスください WinSockで TCPでデーターを読み込む場合 1つのセッションで全てを行ってもよろしいのでしょうか? もちろん回線的には変わらないのでしょうが 内部のバッファ的にセッションをいくつか張ってデーターを やりとりした方が有利なのでしょうか?
分割ダウンロードみたいな話?
>>446 一つのセッションだと、恐らく接続先は単一のサーバであって、
要求はたぶん一つ程度のスレッドで処理される。
要求を複数に分割できるのなら、複数に分けて並行して行えば
複数のサーバに分散されて処理されるかもしれないし、
そうでなくても複数のスレッドに分散されて、先方のCPUの
処理時間を多く利用できるかもしれない。
行儀は悪い。
449 :
441 :2006/03/02(木) 22:11:01
なるほど、ありがとうございました!
450 :
446 :2006/03/02(木) 22:22:37
ありがとうございます サーバー側のほうまでは考えておりませんでした。 たしかにその通りですね。 クライアント側もWinsockですし やはり単一スレッドでいじめない方がよろしいですよね? Winsock1.0の頃はCPU負荷だけでデーター保障されてる TCPでもデータートンでましたし・・・
snmpのライブラリ作るのつらいです。 だれかtrapだけでも作り方教えてください
>>451 perl の Net::SNMP::Transport あたりを参考にしてみれば。
Cのシンプルなやつもありそうだけど、簡単にググった程度では見つからなかった。
453 :
デフォルトの名無しさん :2006/03/03(金) 03:28:13
CreateGaame〜陸海空オンライン〜 開発開始!力ある者だけこぃ!
454 :
417^ω^ ◆8vOv.D2p4. :2006/03/03(金) 13:18:17
455 :
デフォルトの名無しさん :2006/03/04(土) 05:06:27
Windows(xp)のRAWソケットは信用できん、とか聞いたのですが、 どこがどのように信用できないのでしょうか? 意図したようにちゃんと動かないとか?
457 :
デフォルトの名無しさん :2006/03/04(土) 05:45:58
javaで作られたオープンソースのプロクシサーバーを教えて下さい。
459 :
デフォルトの名無しさん :2006/03/04(土) 08:35:45
レスありがとうございます。 javaでかかれたものはないでしょうか?
462 :
デフォルトの名無しさん :2006/03/04(土) 18:20:36
iTuneで『音楽を共有する』って機能がありますよね? 誰が自分のどの曲にアクセスしているのか調べるツールを作ろうかと思っています。 パケットを監視してどのIPに対してデータを送信しているのか調べるツールはフリーでも 既にあるようなので作れないことはないんじゃないかと。 ちなみに私はネットワークプログラミングの知識は今現在全くないです。 ネットで調べてはいるのですが、既に具体的なやり方を知っている方がいたら是非教えてください。参考になるサイトなどでも構いません。 言語はC++です。 よろしくお願いします。
>>462 WindowsならWinSock2でパケットを拾うことができる
WinSock2はNT系のみしか実装されてないけどね
拾うデータは完全に生のRAWパケットだから自前で分別して組み立てて判別しないといけない
パケットの組み立てやってみたいんだけど サンプルとかありますか? HTTPだけでも対応してみたい
468 :
デフォルトの名無しさん :2006/03/05(日) 15:55:12
殆どパケットの出入りが無いプログラムで、 送受信を同じポートにするって可能ですか?
意味がわからない。ふつう送受信は同じポートだろ。
ん?クライアントから見た受信ポートってふつう不定だろ?
471 :
デフォルトの名無しさん :2006/03/05(日) 16:22:46
すみません、変な説明で・・ サーバーのプログラムが受信用のポートを用意している状態で、 そのポートから、別のプログラムがインターネット側に パケットを送信する事は可能でしょうか?
bindしてからconnectするようなのは変態。
「webサーバにあるブラウザから別のサーバーへパケットを送信して見ることは可能」 と同じ意味なら可能。
>>471 可能というかaccept後のソケットでは普通のことです。
簡単なライブラリどれー?
476 :
デフォルトの名無しさん :2006/03/06(月) 01:13:28
pollの第2引数って1025以上だと異常復帰するけど pollで1025以上扱うにはどうすればいいの?
ヘッダの定数増やしてカーネル再構築。
478 :
デフォルトの名無しさん :2006/03/06(月) 02:56:20
479 :
471 :2006/03/06(月) 07:58:23
>>474 ここで言う「サーバーのプログラム」と「別のプログラム」は
同一のPCの上で動作しているのですが、問題無いですか?
480 :
デフォルトの名無しさん :2006/03/06(月) 12:58:13
/proc/sys/fs/file-maxを1025以上にして、setrlimitで1025以上にして、poll発行してもだめなの?
481 :
デフォルトの名無しさん :2006/03/06(月) 14:51:40
ああ゛ー、どう質問してよいのやら。パニック状態の
>>294 です。
「UNIX単体」で動く(デタラメな)データベースは作成できました。
それをUDPソケットを使って
1. 航空便名char FlightID[20]
2. 8つのオプションint option(空席チェックや購入など)
3. 購入の場合はそのチケットの枚数int seat
だけを送って、その結果をサーバーのファイルから読んでクライアントに返す、
というのをやるつもりです。
で、今
クライアント: flightIDを入力
サーバー: そんなflightIDがあるかチェック
そのflightIDがあれば
クライアント: optionを入力
サーバー: optionを送って結果を返す、って方法を考えてます
(よって入力出力入力出力と計二回やり取りすることになります)。
でも、UDPって二回もやり取りできないような気がしてきました。←説明すると長くなります
flightIDとoptionは一度に送って結果も一度に返すようにすべきですか?
あー、やっぱりうまく説明できない。
どっっっこ探しても実用的な(パクれる)サンプルがないし…もう鬱出氏脳…。
482 :
294 :2006/03/06(月) 14:57:41
やっぱりもっと簡単な質問にしときます。 UDPクライアントの引数は4つありますよね?(って一般的なのかも知らないですが) 4つ目はポート番号で省略ができることは分かります。 でも3つ目はエコー用の文字列ですよね? 今回はこれ使わないんですけど、ないと走りませんよね? 一般的にはこの3つ目の引数には""とか"Dummy"とか適当に入れちゃっていいんですか?
UDPサーバなんて言葉はこの世に存在しません
484 :
294 :2006/03/06(月) 15:01:43
ここはぐっとGrin and bear it.
同期の必要性がある場合はUDPなんかつかうな HTTPサーバがどうやって動いてるのか調べてみればいい 君のやりたいことそのまんまだから
487 :
482 = 294 :2006/03/06(月) 15:18:01
>>485 第一日本に住んでないし。
本ならバイブルとされているはずの
W. Richard Stevens著UNIX NETWORKING PROGRAMMING第一巻が
手元にあるけど実用的な使い方には一切触れてない凄物。
TCP/IP SOCKETS IN Cという本もあるけど、これもそう。
検索してもこんなの↓ばっかり。
ttp://www.ksworks.org/memo/net/udpsndrcv.htm 実際に「インタラクティブ」なのが一つたりとも見つからない。
マジ、これはイジメか?
>>486 >同期の必要性がある場合はUDPなんかつかうな
あ、それがキーかもです。
今回はUDPでやれ、ってことになってます。
UDPは"One message at a time"ですよね?
ってことは一度に送る方法しかないってことですか? ←取り敢えずここははっきりさせましょう
つーか、sshかrpcで済むことをなんで生実装したがるんだろ。
489 :
482 = 294 :2006/03/06(月) 15:25:08
それが ネ ッ ト ワ ー キ ン グ プ ロ グ ラ ム です。 それを言い出したらみんなプログラミングなんかせずに データベースはオラクル使え、表計算はエクセル使え、となるじゃないですか。
ていうかUDPってパケットが届くことを保証してない。途中で消えるかも知れない。 その状態でTCP並のことをしようというのであればそれなりに自分でやる必要がある。 再送の機能を付けるとかね。でもそんなのはTCPでやれば悩むことはなくなる。
TCPのソースみたらいいんじゃね?
UDPはパケットがばらまかれたあと何もしない 届いたかもわからないし、途中で分割されることもあるし、順番がばらばらになる 送りたいデータをひとかたまりとしてデータのサイズと分割数とどの位置のデータか を含めて小分けにしてばらまく 受け取る側で全部そろうまで待機しつづける、タイムアウトになったら必要な位置の データをもう一回まいてもらう まずそこから作らないといけない
>>489 オラクルはメンテナンスも含めればとんでもない費用が掛かるし、
ちょっとした集計にエクセルは重くなりますよね。
でも、SSHもrpcも費用が掛からず後者に至ってはシステム標準。
土方プログラマなら兎も角、SEならプログラミングコストを削減することも仕事のうちです。
つーか、UDPがどんなものかも知らないのにネットワークプログラミングを語られてもね。
スレが汚れるので馬鹿は放置の方向で。
すんません。TCPで質問です。 クライアント側で自分が今使ってるポート番号を 知る方法ってありませぬか? 普通気にすることはないので、スルーしてたんですが、 必要な状態に陥ってしまったのでorz。 環境はLinuxでございます。 どなたか教えてください。おながいします。
>>495 netstatのソースでも読めばよいのでは
>>495 /proc/net の下で使えそうなのを探してみる
498 :
495 :2006/03/06(月) 18:33:30
>>496 >>497 スイマセン。恥ずかしながらwindowsばっかで仕事してました。
急遽Linuxで作るハメになっちゃったんで、ソース追っかける
とかは中々難しいです。
>>497 のディレクトリの直下ってこれ何が入ってるんでしょう?
viewとかで見たらなんか文字列がゴチャゴチャとありますが。
と、こんなレベルなんです(--;。
こういう回答が出ると言うことは、ズバっとコマンドで指定して
取る事は出来ないのでしょうか?ホントスミマセン。
>>481 > でも、UDPって二回もやり取りできないような気がしてきました。←説明すると長くなります
できます。←説明すると長くなります
>>495 > クライアント側で自分が今使ってるポート番号を
> 知る方法ってありませぬか?
これは他のプロセスを含むのか含まないのか?
含むなら netstat --tcp -a で出来る。
ちなみにこれの元になるものが /proc/net 以下の
仮想ファイルだ。
コマンド? プログラミングじゃね〜じゃん。 lsofで出来るけど。
コマンドを使うのがプログラミングじゃなかったら、 シェルスクリプトでなにか作るのはなんていうの?
504 :
^ω^ ◆8vOv.D2p4. :2006/03/06(月) 20:04:20
スクリプティング
全然違う話になるんだけど、俺実装するとき RFCしか読まないんだけど、やっぱり バイブルと呼ばれる日本語の本読んだほうが いいの?2冊だけあるんだけどRFCに書いてること 回りくどい日本語で書いてあるだけとしか思えない 俺は馬鹿なのだろうか
英語が読める人は、英語のバイブルを読めばいいんでないの。
>>507 ちゃんとdraft-*も読んだ方がいいですよ。
510 :
デフォルトの名無しさん :2006/03/07(火) 09:48:04
winsockを使ってHTMLを取得するプログラムを書いてるんですが リクエストを送るときに GET /index.html HTTP/1.0\r\n\r\n と2回改行コードを入れないとサーバが改行コードとして認識して くれてないみたいなんですがこれで普通なんですか? とりあえず動いてるのでいいですけどすっきりしないので知ってる 方がいたら教えてください
はい。
>>5 行って、HTTPのRFC読んでください。
GET /index.html HTTP/1.0\r\n \r\n インデント正確にするとこうだな 空行が終了判定だぞ
>>511 ,512
ああ〜そうか(´A`)アホでした
すっきりしました!どうもありがとうございます
515 :
^ω^ ◆8vOv.D2p4. :2006/03/07(火) 13:59:55
>>490 >>492 ありがとうございます。
上に指示を仰いだらUDPで一回送って一回受け取りで桶、ということでした。
「それならそうと書け、ヴォケが、はったおすぞ!」とは口が裂けても言えませんでした。
>>493 誰でも最初は初心者だろ、(#゜д゜)凸ゴルァー!
本だけ渡されて「ほら、やれ」って言われてる身にもなってみろ!…とキレてみるか。
なんでネットワーキングプログラミング関連の本や資料は全部ボトムアップアプローチなんだろ?
トップダウンアプローチで書かれた本でも売れば絶対に売れるのに。
517 :
^ω^ ◆8vOv.D2p4. :2006/03/07(火) 14:49:52
>>516 簡単なHTTPサーバーとかならボトアプの本でも載ってるじゃん
逆にそれより複雑だと買う人が絞られすぎちゃうんじゃね??
てか、プロトコル仕様とかで質問するなら
ボトアプの本も一個買ったらいいんじゃね?
なんか勘違いしてたらごめん
>>515 表示するフォントを変えると可愛くなくなると思う。
TCP の server 側の待ち受けポートを作る際 struct sockaddr_in 型の変数にアドレスやポートを 設定して、ソケットとbind した後は、 その sockaddr_in 変数は廃棄してしまってよいのでしょうか? 同じようにconnect()の場合もそうでしょうか?
>>516 >本だけ渡されて「ほら、やれ」って言われてる身にもなってみろ!
土方プログラマ乙。
CAsyncSocket の Connectって無意味じゃね?
524 :
デフォルトの名無しさん :2006/03/08(水) 11:58:16
TCPで typedef struct { int option; char msg[8]; int login; } message; message msgStruct; msgStruct.option = htonl(option); gets(msgStruct.msg); msgStruct.login = htonl(login); send(s, &msgStruct, sizeof(msgStruct), 0); のようにして構造体で送った値を サーバー側で抽出、というか表示してやるにはどうすればいいですか? intのはntohl()で戻してやる必要がある、とは書かれてるんですが 実際にどうやるのかは書かれていません。 教えて下さい。
>>524 ・構造体メンバーのメモリ配置が双方のコンパイラでどうなっているか確認。
・C言語初心者スレで構造体へのポインタの学習。
>>524 送る側のプログラムをコンパイルしたコンパイラが、当該のコードで
その構造体に用いたアライメントやパディングなどをちゃんと理解して、
受信側でも送られたバイト列をその通りに解釈すればよい。
そういう面倒なことをしたくないのならば、テキスト表現で送るか
適当な形式で byte[] に詰め込んで送る。
例えば
unsigned char buf[16];
memcpy(buf, msg, 8);
buf[8] = option >> 24; buf[9] = option >> 16; buf[10] = option >> 8; buf[11] = option;
buf[12] = login >> 24; buf[13] = login >> 16; buf[14] = login >> 8; buf[15] = login;
などとして、受け取った側では option = (buf[8]<<24)|(buf[9]<<16)|(buf[10]<<8)|(buf[11]);
などとする(ただしintは32ビットと仮定)。
527 :
デフォルトの名無しさん :2006/03/08(水) 12:12:53
>>525 ありがとうございます!
質問した直後にちょうど勘が働いてサーバー側で
printf("option: %d\n"msgStruct.option);ってやってみたらちゃんと出ました!
なぁんだ、ちゃんと届いてたのか。
また分からないことがあったら聞きますね。
調べてから聞け
529 :
デフォルトの名無しさん :2006/03/08(水) 12:18:22
>>526 さんも詳しい説明してくれてたんですね。
一応同じタイプのマシンなので面倒なことはしなくてよさそうです。
>>ってC++のパイプですか?それともビットシフトか何か…そういう使い方したことがないので。
ありがとうございました。また聞きますね。
>>528 はい、気をつけます。
結構調べた(かれこれ五時間)んですけどね。(藁
>>527 ntohl()してねーじゃん(w
予想レス「しなくても動いたから大丈夫です!」
531 :
デフォルトの名無しさん :2006/03/08(水) 12:35:01
>>530 はっ、Σ( ̄□ ̄lll)!!
突っ込み、ありがとうございます。
てか、しなくても動くんですね。じゃ、しなくてもいいk(ry
>>531 マックに移植するとき泣く
・・・あぁ、インテル入ったからもういいか
>>527 コンパイラが違うと構造体のメモリの割り当て方が違う
32bit処理系だとcharのような要素があった場合32bit確保する場合がある
コンパイラオプションで変えれるからあんまりプログラムは意識しなくてもいいけど
サーバとクライアントがコンパイラが違う時は注意が必要
> 32bit処理系だとcharのような要素があった場合32bit確保する場合がある 何ていうコンパイラ?
>>524 横着しないでちゃんとプロトコル決めろ
option:4byte:なんかのオプションのフラグ
msg:8byte:'\0'ターミネートされた文字列
login:4byte:なんかのログイン情報
で、合計16バイトのunsigned charな配列に確保。
んでもってエンディアンに引っかたりするんで、このさいXMLでデータを(ry
まあ文字データにするのが一番楽
538 :
482 :2006/03/09(木) 06:36:04
こんにちは、懲りない 土 方 プ ロ グ ラ マ です。
なんとかUDPでデータやり取りするプログラムできたんですが
時々、計算が合わないことが合わないことがあります。
フラグ立てたりしてデバッグしてもどう考えても間違いはない。
で、やっと気付いたんですが、
これが「UDPではデータを失うことがある」っちゅーことなんですね。
>>486 さんの言った「同期の必要性」というのが今頃理解できた…もう鬱だ…氏n(ry
539 :
デフォルトの名無しさん :2006/03/09(木) 07:51:37
インターネット回線の速度のバリエーションを シュミレートできるようなオープンソースのツールはないでしょうか。 キャッシュサーバーのテスト用として利用したいのですが。
> 時々、計算が合わないことが合わないことがあります。 ほんとTCPにした方がいいな。
>>538 送るデータを逐一保存しておいて、連番を振って管理。
受け取り側では受信できた番号を逐一報告。
送り側では受け取り確認の取れないデータを適当な間隔で再送。
これでどうよ?TCP 使うほうが遥かに楽だがなw
>>541 それでもTCPの方がスライド窓機構(なんて言うんだっけ)付きだし少しハイテクだよね
>>539 > シュミレートできるような
kwsk
>>543 ×シュミレート
○シミュレート
○スクリプト
×スプリクト
○じゃがいも
×がじゃいも
○しんぶんし
×しぶぶしぶん
547 :
482 :2006/03/09(木) 15:00:59
>>546 本当によさげですね。でも環境がLinux…_| ̄|○
>>544 実はシミュレートでもシの発音が [∫] で合ってないので、スィミュレイトと書いた方がましだし間違いが少ないと思うんだが、そう書いても考えのあはさかな杓子定規のたこに直されちゃうんだよなあ ミ゚仝 ゚ ミ
>>548 そうなのかー・・・
まぁ辞書で「シミュレーション」で出てくるから、どっちでもいいや
550 :
デフォルトの名無しさん :2006/03/10(金) 00:56:43
カタカナ読むのは日本人なんでシミュレートでおk
551 :
デフォルトの名無しさん :2006/03/10(金) 21:10:32
winsoketで ioctlsocket関数でノンブロッキング selectでノンブロッキング どっちがいいのでしょうか? 自分はioctlsocket関数でノンノンしたいのですが。
ブロッキングのことなら梅原さんに聞くといいよ
茹でてマヨネーズ付けて食うとうまいよね。
ioctlsocketでノンブロッキングって、ポーリングってこと?
555 :
デフォルトの名無しさん :2006/03/11(土) 04:28:43
>>543 キャッシュサーバーとサーバーの間に中継サーバを配置して、
キャッシュサーバーの機能テストのために、キャッシュサーバーがサーバーから
ファイルをダウンロードできる時間を設定で変化させることができる機能を持ったものです。
Win2000で socket(AF_INET, SOCK_RAW, IPPROTO_IP) ってな感じでパケットキャプチャを作りました。 パケットの中身をrecv()して、自己PC発のパケットで TCPヘッダ以降の 特定のパターンだけrejectというか、 発信を無効にしちゃいたいのです。 色々調べてLSPとやらでNICに直接話すのが筋と理解した のですが、私のスキルでは難しかったです。 TTLだけ0にしちゃうとかとにかくそのパターンのパケットだけ 発信を無効にする簡易的な火壁のようなことをしたいのですが、 何か簡単な方法はないでしょうか?
558 :
デフォルトの名無しさん :2006/03/12(日) 21:10:48
>>557 に便乗させてください
win2000/XPで、ウィルスバスターなどのように、常駐させておいて怪しい
通信を遮断したいです。プロミスキャストで出入りするパケットの中身は
見ることができるのですがそのソケットをシャットダウンすることが出来ないです。
やっぱwinpcapを使わないとだめですか?
winはセキュリティ上パケット操作はできないようにしてある 回避策はなくもないけど、ウィルスにも使われるような技術なので そう簡単には見つからないでしょう
560 :
557 :2006/03/12(日) 22:00:19
>>559 そうですか。。情報ありがとうございます!
回避策になりそうな手段をもうちょっと調べてみます。
何かヒントになるキーワードがあればまたお願いします!
>>558 ipfltdrv.sysでも使うとか。
562 :
558 :2006/03/13(月) 02:05:23
563 :
558 :2006/03/13(月) 02:15:27
>>559 そんなんどこにでも転がってるけどwww
POP3でメールを取り込もうとしているのですが、LIST で取得できるサイズと recv()で取得したバイト数が合いません。 recv()で取得したデータの改行コードがCRLRになっているようなんですが、 これを直してあげる必要があるのでしょうか? 初歩的な質問で申し訳ありませんがよろしくお願いいたします。
>>565 RETR でメッセージを受け取るときは . のみの行が終了基準だけど。
サイズで読み出そうとしてんの?
>>565 RFCを読むべきです。でもヒマなので一応説明します。
LIST が返すサイズは、完全に正しいメッセージのオクテット数(バイト数)です。
LIST が返すサイズと、RETR で得られるメッセージのオクテット数が異なっているなら、
それはサーバのバグです。
メッセージ中の改行はすべてCRLFで、そうでないならこれまたサーバ(か何か)のバグです。
RETR の返答を recv して得られるバイト数は
ターミネーション ( . + CRLF ) や、行頭に . が有る場合に余分に
付加される . などがあるため、メッセージのオクテット数とは異なります。
RETR の返答をどう解釈するかは RFC を読んでください。
>>566 ,567
RFCをちゃんと読んでみる事にします。
それでわからないときはまた質問することにします。
ありがとうございました。
569 :
デフォルトの名無しさん :2006/03/15(水) 00:37:04
チャレンジハンドシェイク認証プロトコル詳しい方いますか? VCで簡単にデータやりとりしてみたいんですが・・・
RFC1994(もしくはRFC1334)を読んでからまたおいで 勉強って言うのは自分で調べるところから始まるんだぞ
571 :
デフォルトの名無しさん :2006/03/15(水) 04:08:55
>>勉強って言うのは自分で調べるところから始まるんだぞ 569じゃないけど、まず2chや人に聞こうとしていた自分の心にずしんと響きました。 根性たたきなおして勉強します。 そしてどうしても分からなくなったときには、力を貸してください。 それでは。
自分で調べる手段の一つが人に聞くことなわけだが
>572
572 :デフォルトの名無しさん [sage] :2006/03/15(水) 04:44:14 自分で調べる手段の一つが人に聞くことなわけだが 学生の間しか言えない名言だな
3匹も釣れてたw
後釣り宣言か、真性だな
もう一匹も釣れてたwwwwwwww
579 :
576 :2006/03/15(水) 13:52:58
エサ取りも釣れたwwwwwwww
581 :
576 :2006/03/15(水) 14:03:35
暇な学生必死だな、と それとも落ちこぼれ社会人かしら? はたまた後は老けて行くだけのNEET君ですか?
582 :
576 :2006/03/15(水) 14:07:55
583 :
576 :2006/03/15(水) 14:09:09
厨房多すぎw ままのおっぱいでもしゃぶってろよwwwwwwwwwwwwwwwwwwww
584 :
デフォルトの名無しさん :2006/03/15(水) 14:13:06
春休みなんだよ 小・中・高・大学生・社会人にやさしくしろ 無職にもな!
587 :
576 :2006/03/15(水) 15:47:06
俺はガチムチ兄貴のチンポでもしゃぶりたい気分だがなwwwwwwっwww wwwwww
588 :
580 :2006/03/15(水) 16:23:08
589 :
デフォルトの名無しさん :2006/03/15(水) 23:09:17
でも究極的には人が作ったものの使い方を調べるってのは人に聞いてるわけだが。 あるいは人が書いたものを読むとか。 それとも自分で引数をいろいろ与えてどんな動作をするか調査するのかい?
590 :
参加者募集中! :2006/03/15(水) 23:12:25
thread(あるいはfork)とselectを併用したものとかはシンプルでどんなOSでも使い回しがきくよね kqueueとかOSに特化したサーバは、そういったシンプルなサーバよりどの程度優れてるの? 性能が5%改善しました!とかなら馬鹿らしくて、チューンしたいとも思わないところです
100接続以上とか捌くつもりがない限り、selectでいいんじゃないの。
593 :
569 :2006/03/15(水) 23:20:46
>>591 libeventでも使っとけば? select/poll/kqueueのwrapperライブラリ。
596 :
デフォルトの名無しさん :2006/03/18(土) 09:44:22
「可能な言語があるか?」と聞かれたら、「ある」としか答えられないが…。
sendとかに好きなようにラップかませばいいだけだろ
>>596 ところでもちろんUDPだよね? TCPではスタックレベルでパッケとロス等は吸収・復帰されるから
アプリケーションレベルでのロスはあり得ない。
ちなみに
>>545 という方法も検討したら?
600 :
デフォルトの名無しさん :2006/03/18(土) 11:56:52
皆様レスありがとうございます。
>>597 例えばどのような言語があるのでしょうか?
宜しければ教えていただきたいです。
>>559 下位層(2層や3層)レベルでのパケットのロスが生み出せれば良いと
考えているのですが、、
>>545 のツールも参考にさせていただきます。
602 :
599 :2006/03/18(土) 12:38:49
603 :
599 :2006/03/18(土) 12:41:52
>>600 > 下位層(2層や3層)レベルでのパケットのロスが生み出せれば良いと考えているのですが、、
Linuxならiptableのモジュールでパケットをある確率で落とすというというのがあるけどね。
ホスト単体で出来るから便利。 パケット入れ替えというのはたしか無いと思ったけど。
604 :
デフォルトの名無しさん :2006/03/18(土) 12:54:07
>>600 イーサネット層とかをコードレベルで扱える言語ならできるのでは?
Javaとかじゃ無理なような。
kernel moduleなpacket filter作ればCでいくらでも書けるだろ。
>>イーサネット層とかをコードレベルで扱える言語 例えば何さ?
送信部分で、自分で送信をやめるんじゃ駄目なのか? 質問の答えにはなってないけど聞いてみる
いいわけねえだろ
>>608 実際のネットワークで実験しないといけないなら駄目だろうけど
挙動のシミュレーションがしたいだけなら、TCPの上で仮想的に実装しても
と思ったんだけど
叩かれそうだから去ろう
コードレベルでパケットのロストなんてできるんだ。 全然しらんかった。
通信経路にバカハブ置いてゴミパケット流しまくる
>>600 > 例えばどのような言語があるのでしょうか?
なんでこんな質問のしかたするの?
「機械語」とか書かれても困るんじゃないの?
ここで聞くってことは、自分で作ろうとしてるか誰かに
作ってもらおうと思ってるんじゃないのか?
もしそうなら、「○○の OS + △△の言語で、□□は実
現できるでしょうか?」と聞いた方が、あんたも回答者も
幸せになれると思うよ。
疲れる奴・・・
614 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 18:34:12
TextSS の64bit化おながいします もしくは64bitにネイティブ対応した置換ソフトないですか?
615 :
デフォルトの名無しさん :2006/03/18(土) 19:27:37
ダウンローダーの一種を作ろうとしているのですが、ダウンロードが中止された場合にレジュームするやり方がわかりません。 WinInetでレジュームをする方法、あるいは他のコンポーネントで使いやすいものがあれば紹介してください。
>>615 httpかftpかその他のプロトコルか自前のプロトコルかもわからないのに
答えようが無い。
>612 機械語じゃなくても可能だろ
好きな果物にはどんなものがありますか? バナナです。 バナナだけじゃないだろ。
>596=>600の質問を見る限り、>612の言いたい事って もっと効率のいい質問の仕方をしなさいって事だと思うんだが
TCPでは待ち受け処理をlistenとacceptに分けて行うと某本で読んだのですが、 何故2つに別れているかが良く判りません。2つに分けて設計されているのは どうしてなのでしょうか?
一個でいいと思うならそうしたらええがな
listenは待ち受け処理しません。 待ち受けバックログの長さを指示するだけです。
625 :
デフォルトの名無しさん :2006/03/19(日) 20:42:55
VisualBasic6.0で FireWall モドキを作成しています。
パケットキャプチャは出来たのですが、パケットを
蹴ることができません。
>>563 を拝見したのですが、どうも完全にVBの出る幕では
無さそうです。蹴る方法だけでも良い方法はないでしょうか?
以下のソフトはオールVB製でFirewallを実現しているよう
なので、きっと何か方法がありそうなのですが、これを見て
何か分かる方はいらっしゃいませんでしょうか?
ttp://www.vector.co.jp/magazine/softnews/040721/n0407211.html ↑からドライバを作るのではなく、ドライバをタイマー監視か
何かをしてパケットを蹴る動作を実現しているっぽいということ
は読み取れるのですが、具体的な方法がみつかりません。。
どうやれば、ドライバにちょっかいを出せるでしょうか?
よろしくお願いします。
626 :
625 :2006/03/19(日) 21:06:51
すみません、↑のソフト開発日記を見つけたらその中に "ドライバを使わずに強引な方法で通信を切断〜"という くだりがあり、"通信が完了する前に処理をしきらないと〜" という言葉もありました。 どうやら、ドライバにちょっかいを出しているのではなく、 他の手段をとっているようです。 何かヒントありませんでしょうか? よろしくお願いします。
作者に聞けよ
これは聞いたほうがいいね
>>626 =625
たぶん、「RSTパケット」を送ってるんじゃまいか?
「通信が完了するまえに」ってのが怪しいw
630 :
625 :2006/03/19(日) 22:47:51
RSTパケットですか、ありがとうございます! ぼんやりとですけど、意味は分かりました。 色々しらべてみます。 ついでにVBから生パケットを送出する良Sampleを ご存知でしたら、教えてくださいませ。
作者に聞けよ
>>626 > 何かヒントありませんでしょうか?
Ethereal とかで見てみればいいと思うけど。
pcap
634 :
625 :2006/03/20(月) 01:55:03
> Ethereal ありがとうございます!調べてみます!
つーかテンプレくらい読めよ。
637 :
デフォルトの名無しさん :2006/03/20(月) 09:32:19
ttp://www.ie.u-ryukyu.ac.jp/~j00004/unix/network/levelXchatsv.c の冒頭に
#define SOCK_NAME "/tmp/socket" /* 通信に使うソケットファイル */
ってあってこれのお陰で実行すると
connect: No such file or directory
って出ます。当然うちのSolarisの/tmpにはsocketファイルなんてありません。
これってどっかからコピーできたりするもんですか?
ここの住人なら知ってるはず。
ちなみに"/tmp/socket" ソケットファイル の検索結果 約 31 件中 1 - 7 件目 (1.02 秒)
>>637 あえて汚い言葉遣いで言わせて貰うが、
PF_UNIX とか気付かないし調べもしないでネットワークプログラミング
やろうなんて10日くらい早いと思う。あたまいかれてんじゃないの?
10日とはやさしい奴だな。
641 :
デフォルトの名無しさん :2006/03/20(月) 12:32:33
>>638 いやいや、それには後から気付いたねん。(^^ゞ
まずは引っかかったエラーから解いていこうかと。
小さなことからコツコツと…(目でかくして)。
>>640 それがしたんよ。
サーバのソースは読んだん? UNIXドメインのソケットに"/tmp/socket"なアドレスbindしてない? してなければ、named pipeなのかも。その場合mknod。 ただ、named pipeがなければ、サーバ側でエラーが出ているはずなんだけど。
というか、
>>637 がサーバか。
$ gcc levelXchatsv.c
$ ./a.out
$ ls -lF /tmp/socket
srwxr-xr-x 1 foo foo 0 2006-03-20 12:43 /tmp/socket=
できてるやん!
10日もありゃずぶの素人だってできるよ。
645 :
デフォルトの名無しさん :2006/03/21(火) 14:43:15
TCPのエコーする奴を少し改造して構造体を送ろうとしております。 Client側で deposits: 100 withdrawals: 200 をServer側で deposits: 500 withdrawals: 600 に値を変えてるんですが、結果は Received: totalBytesRcvd: 7 deposits: 500 withdrawals: 712 totalBytesRcvd: 8 deposits: 1476395508 withdrawals: 712 です。_| ̄|○ depositsの方は500に変わってるんですけどねぇ。 二回表示されてるのはtotalBytesRcvdがsizeof(msgStruct)の数に達してないせいです。 どこをどう直したらいいんでしょうか? ↓以下コード抜粋です。
646 :
デフォルトの名無しさん :2006/03/21(火) 14:52:33
あ゛ー、UNIXの改行がなんか邪魔してて「改行が多すぎます」と出ます。_| ̄|...((○ //とりあえず構造体 typedef struct { int dep; int wd; } message;
//main()抜粋 int deposits = 100; int withdrawals = 200; msgStruct.dep = htonl(deposits); msgStruct.wd = htonl(withdrawals); /* Send the string to the server */ if (send(sock, &msgStruct, sizeof(msgStruct), 0) != sizeof(msgStruct)) DieWithError("send() sent a different number of bytes than expected"); /* Receive the same string back from the server */ totalBytesRcvd = 0; printf("Received: \n"); /* Setup to print the echoed string */ while (totalBytesRcvd < sizeof(msgStruct)) { /* Receive up to the buffer size (minus 1 to leave space for a null terminator) bytes from the sender */ if ((bytesRcvd = recv(sock, &msgStruct, sizeof(msgStruct) - 1, 0)) <= 0) DieWithError("recv() failed or connection closed prematurely"); totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */ echoBuffer[bytesRcvd] = '\0'; /* Terminate the string! */ printf("totalBytesRcvd: %d\n", totalBytesRcvd); printf("deposits: %d\n", ntohl(msgStruct.dep)); printf("withdrawals: %d\n", ntohl(msgStruct.wd)); }
とりあえず、最初は値変えずに送り返せよ。 それから、bit patternだけど、 1476395508→1011000000000000000000111110100 500→111110100 な。
649 :
デフォルトの名無しさん :2006/03/21(火) 15:14:54
ア、ナルほど。 早速サーバー側の //int deposits = 500; //int withdrawals = 600; //msgStruct.dep = htonl(deposits); //msgStruct.wd = htonl(withdrawals); の部分コメントアウトしました。で結果は Received: totalBytesRcvd: 7 deposits: 100 withdrawals: 200 totalBytesRcvd: 8 deposits: -939523996 withdrawals: 200 この最初の一回は正しいように見えますが クライアントのローカル変数なんでそのまま表示してる、なんて可能性はありますか? あと、bit patternというのはどう使うんですか???
650 :
645 :2006/03/21(火) 15:22:42
あ゛ー、オナルほど! 1476395508→1011000000000000000000111110100 の尻尾が 500→111110100 と同じ訳ですな! しかし、なじぇでしょう?
>>649 > totalBytesRcvd: 7
まずは、Ethereal とかでネットワーク上のデータを見たほうがいいんじゃないか。
いや
>>651 がファイナルアンサーだから。
Little-endianのCPUなんでしょ。
01011000 00000000 00000001 11110100
^^^^^^^^^ここが常に壊れる。
sendとrecvのドキュメントをちゃんと読んだ方が良いよね。 なんでわざわざ受信(送信)したバイト数を返してくるのか、とか。
655 :
645 :2006/03/22(水) 14:15:04
>>651 ああ!シコるほど!
> totalBytesRcvd: 7
になってしまうのがいかんかったんですね。
if ((bytesRcvd = recv(sock, &msgStruct, sizeof(msgStruct) - 1, 0)) <= 0)
の-1はEchoBufferでテキストメッセージを送る場合に最後の\nのためにあったんですが
構造体ではいらんかったですね。
消したら
Received:
totalBytesRcvd: 8
deposits: 500
withdrawals: 600
と正常位になりました。
ありがとうございました!
とりあえずお前はオウム社のマスタリングTCP/IPを読むことを勧める
喜んでボケてるとこ悪いが、もう少し勉強しないと4000バイトとか読んだりする プログラム書いたときにまたこのスレのお世話になることになるぞ。
658 :
デフォルトの名無しさん :2006/03/22(水) 16:51:22
お世話になっちゃ、、駄目ですか? 私は愛していますが、、 あ、私は655さんではないですよ。ポッ
>>655 > と正常位になりました。
それまでは騎乗位だったのですか?
>>653 いや、
>>651 で FA なのはいいんだけど、Ethereal
とかでで送信/受信のどっちが悪いか切り分けられるよう
になってないと、
>>657 が言ってるような事になると思
うんだけどな。
いや、誰も悪くないんだって。 OSもAPIも間のルータかスイッチも仕様どおりに動いた。 プログラムも仕様どおりに動いた。 645も神様か親DNA由来の仕様どおりに動いた。 ところで645の人は647のソースをどっからかコピペしてきて 改変したんだろうけど、元のソースでちゃんと while (totalBytesRcvd < sizeof(msgStruct)) { ... totalBytesRcvd += bytesRcvd } っていう構造になってるのに、それを改悪して「動作が変」とか言ってるんだよね。 元のソースがどういう動作をするようになっているのか、recvの戻り値の意味も 考えてよく考察するようにした方が良いと思う。
なんかネットワークプログラミングってこの話題に終始するよね。 奥が浅すぎだよね。
sendやrecvの使い方程度がこのスレにはお似合いってことでは・・・
>>662 まあ、初心者ははまりやすいとこだし。
個人的にはなんでそんな仕様にする必要があったのかよくわからんし。
>>664 TCPレベルで何バイト送られるかが不確定であり、バイト列の切れ目というのを
表現する機能がないから自然とこういう仕様になるんじゃない?
解決したのを確認した後でうだうだと薀蓄述べるのが好きだな、おまいら
熟考というんです
というか、今回のバグはTCPがバイト・ストリームである問題とは違うんだが…
669 :
デフォルトの名無しさん :2006/03/23(木) 13:00:31
UDPでのソフトウェア設計に関わる質問だと思うんですが サーバー側でログインしているクライアントの数を数えてるファイルがあります。 クライアントの数は固定(今のところ3人)で ログインした者の削除フラグは0、ログアウトした者の削除フラグは1にしています (ユーザーIDと削除フラグから成っている構造体です)。 でクライアント側から'who'なるコマンドを送って 現在ログインしている者のリストをクライアント側で表示したいと思ってるんですが 皆さんならどんな風に処理しますか? 例えば、クライアント側でforループを回して whoコマンドに該当する番号を3回送って サーバー側は誰がログインしてようがお構いなく3人分のデータをクライアントに返す。 でクライアント側で削除フラグの立ってない奴だけ表示する。 …というのを考えているんですけど、やる前から効率悪そうだなと思ってます。 他にもっと良い方法があれば教えてください。
3人固定なら、一回で全部返せよ。収まるだろ。
671 :
669 :2006/03/23(木) 13:17:43
えっ、そんな方法ってあるんですか? 構造体のデータ一つ分だけ送る方法しか知らないんですが↓こんな感じで。 /* Send received datagram back to the client */ if (sendto(sock, &msgStruct, recvMsgSize, 0, (struct sockaddr *) &echoClntAddr, sizeof(echoClntAddr)) != recvMsgSize) 本当に3人分送れるんなら嬉しいですけど。 あ、実は構造体にはIPアドレスとポート番号も含まれてます、今回の件には関係ないですが。 typedef struct { int recNum; char userID[8]; int delFlag; char ip[16]; unsigned short portNum; } user;
これはヒドイ
673 :
669 :2006/03/23(木) 13:27:25
またまたそんな反応を…。 本当に3人分送れるんですか?
プロトコルというものを考えてみては・・・ こんな状態でUDP使うとは。
675 :
669 :2006/03/23(木) 13:41:41
上からの指示です。逆らえません。 というかやろうと思えばやれるのは分かるんでいいかと。 で結局、3人分送れるというのは嘘ですか?
>>675 おまいさ、こんなとこで人に質問したりボケたりする前にC/C++の参考書とか読めよ。
世の中をなめて生きてゆくのも否定はしないけど、まだ若そうだから今のうちにちゃんと
努力したほうが後々ラクになるよ。
677 :
669 :2006/03/23(木) 13:46:53
全然回答になってないんですが。 3人分送れるというのは嘘ですか?
3人分のデータが入った構造体を作るんだ!
679 :
669 :2006/03/23(木) 13:52:38
ありがとうございます。 そう言ってもらわないとさすがに分からないですよ、いくらC知ってても。
680 :
669 :2006/03/23(木) 13:54:58
え、でも4人になったら構造体を変えるんですか? やっぱそうですよねぇ…。どうしましょ?
681 :
669 :2006/03/23(木) 13:56:42
ちょっと一人で考えてみます。 ありがとうございました。
>>680 何か「言われなくてもわかること」はあるのか?
もう放置しろ。 馬の耳に念仏だ。
まったく女はつかえネーヨナ。 こいつの同僚に同情するヨ
buff = malloc(sizeof(user)*3); でいいんじゃないの?
まぁ、TLVにするわな。ふつー。
TLVってなに?
Type-Length-Valueじゃね?
Telecaster - Lespaul - Flying V だろう。
>>665 何バイト欲しいか指定してるんだから、そのバイト数がたまる
まで待ってりゃいいじゃん。
て言うか、普通
>>661 が書いてるようなループ作るだろ。
だったら、システムコール (もしくはライブラリ) 内でやっと
いてくれと思う。
692 :
デフォルトの名無しさん :2006/03/24(金) 01:05:25
Accept-Encoding: gzip で取得したデータを解凍するにはどうしたらいいですか? C言語でhttpクライアントの実験をしています。
クライアントで解けないようなエンコーディングを要求すんな。
gzipの仕様を調べ、その仕様に従って解凍ルーチンを書く つーかネットワーク関係無いし
zlibを使えばいいんでね
実験なのに「もっともだなw」なんてアホだと思う
めんどくさければPCにgzipをインストール後 popen("gzip -cd >hoge", "w"); して fwrite() で書き込んで pclose() してそれから hoge を読め。
ネットワークゲームのために時刻の同期をとるプロトコルを独自実装したいと 思っているのですが、SNTPではラウンドトリップにかかった時間のちょうど半分がサーバー というかオリジナルとなる時刻を持ってる側からクライアントにデータが届くまでかかった時間 ってことにしているようなのですが、これはどの程度正確なのでしょうか? 通信の↑の方の層のある程度の持続性のある性質として、行きは遅いが帰りは速いとか、 その逆とかいうことがありうるんでしょうか? もしそうした場合に片側方向の遅延を検出できるアルゴリズムはどういったものになるのか …は自分でもこれから考えてみますが、教えていただければうれしいです。
ADSLはUpが遅いがDownは速いとか #↑はスループットの話でラウンドトリップタイムとはまた別かも
双方が ntp などですでにシステム時刻が完全合っている状態であれば、片側方向の 通信時間を測定することはできると思うけど、双方のシステム時刻があっていない状態 では、往復時間÷2で推測するしかないと思うけど。
負荷かけて速度を測定しろよ
送る側の経路しか選べないしなあ。考えるだけ無駄だと思う。 正確さより、いかに現実的な計測が出来るかを追求したら?
>>702 そういうアルゴリズムは存在しません。
証明はここに書くには長すぎるのでry
インターネット経由なら、行きと帰りでルートが違う可能性はある。
709 :
デフォルトの名無しさん :2006/03/28(火) 23:11:43
すみません。質問です。 ネット環境がない状態で通信するプログラムを作りたいんですが ルーターを使わずにIPを取得してプログラムのテストをする方法はありますか? 簡易DHCPサーバーなども考えてみましたが、ルーターがないとIPは割り振られないみたいで・・
>ルーターがないとIPは割り振られない そんなわけねー。
127.0.0.1
・Windows2000/XP/2003なら、最悪でもインターフェースには 169.254/16なアドレスが自動で振られる。 ・そのためのIPv6 ・有効なインターフェースが無いとTCP/IPスタックがアンロードされて 127.0.0.1も消え去ってしまう話なのか?
勝手にポートを特定するソフトって作れますかね? 鯖との最初の通信で認証が通らない場合 次のポートに繋ぎに行くのを繰り返す、みたいな。 迷惑ですかね。
止めとけ 最悪通報される
>>709 もしMicrosoft の Windows を使っているなら、
ハードウェアの追加で Microsoft Loopback Adapter ってのを追加すると、
LANケーブル等が無いときにも使えるループバック専用の仮想NICが作成されます。
詳しくはgoogleとかで。
>>709 …ああ、
「ネット環境がない状態で」「通信するプログラムを作りたい」のか。
「ネット環境がない状態で通信する」プログラムを作りたいなんて
無茶な奴だ、とオモタ。
>>716 片方項だけど、CRT の一部を明滅させて小型PDAに
データを転送するというプログラムも過去にはあったような気が・・・
719 :
デフォルトの名無しさん :2006/03/31(金) 13:25:57
TCPでクライアントの中で クライアント自身のIPアドレスとポート番号を知るにはどうすればいいですか? サーバー側ではクライアントをaccept()したときに得られるみたいですが。
getsockname
721 :
719 :2006/03/31(金) 13:44:45
おおー、ありがとうごさいます。 感謝感激!
722 :
デフォルトの名無しさん :2006/03/31(金) 17:35:58
peercastとかskypeとかが 特殊なプロトコルを使って通信してるじゃないですか。 peercast:// call:// こんなやつ。 あれってどうやって作ってるんですかね。
>>722 正確にはスキーム。
プラットフォーム依存になるが、Windowsなら、CLSIDをレジストリに登録して、
クラスモニカをパースできるようにするんじゃなかったっけ。
zeroconfigだっけか、自分でIP用意しちゃおうぜってRFCはあるね。 次のポートに繋ぎに行くのを繰り返すと、ポートスキャンと見なされてIDS/FWのログに残る。
ZoneAlarmのように 他のプログラムのネット接続を即切断したり また繋ぎ直したり・・・は どうやったらできるでしょうか。 ZoneAlarmが余りに不安定なので 自作した方が軽くて早くて安定な気はしていますが ネット系のプログラミングは殆どやったことないので 分からないこと多いです。 プログラミング歴だけなら Win3.1のVC++1辺りからやっては居ます。
拡張DLLとか使って横取りでもしてるのかな? 無理矢理してるなら不安定なのは当たり前。 切断してる時に、相手からパケット来たら答えられずに接続切られるでしょ?
この手のはメシのタネになりがちだから教えない。
728 :
デフォルトの名無しさん :2006/03/32(土) 23:45:39
>>727 どんな情報も飯のネタになるだろ・・・尻の穴の(ry
TDI Filter driver とか使う・・というか書くのが普通。
最後の一行いみわかんねぇけど JavaScript でも使えば?
HTTPの仕様を満たして、POSTするプログラムを作ればいいね。 まずはGETするプログラムから始めて見たら? ちょっと機能加えるだけでパーソナルファイヤウォールとか銘打って稼げそうではあるね。 出来が悪いと、損害賠償受けたり、サポート大変だろうけど。
あよく見たら 「例えばこのページのように」 じゃなくて 「このページに」 か。 荒らしツールでも作る気か?
>>732 > HTTPの仕様を満たして、
HTMLの仕様も知る必要あり
何か荒らしサイト構築っぽいね。 あちこちのFORMに宣伝とかの書き込みするのかな?
735だが ネットワーク系の実装は、ボタンの掛け方一つでMAD Programになるからな これ以上は教えないよ
連続 POST くらい JavaScript で書けよと
漏れなら、PerlかPHPで書くな
漏れなら wget で済ますな。
誰か.NET版のXML-RPC使って
Hello Worldでもなんでもいいから
サーバークライアント間で通信する。
簡単なプログラム組んでくれませんか?
http://xml-rpc.net/ これ。
どうも使い方がわかりづらい…
漏れならruby。 wgetでpostのほうが面倒だ。 .NETのサポートはMSにお問い合わせください。
ロジックだけでかまいません。 IEでプロキシサーバの自動検出機能がありますが、 どのように検出させているのでしょうか? 8080や3128ポートのパケットについて ブロードキャストさせているだけですか?
>>744 なるほど、WPADプロトコル(を実装したプロキシ)を
使うわけですね。
ありがとうございます。
質問です。 自前でACK/RSTパケットを送出したいです。 WinXP+VB6なのですが、VC++でも構わないので どこかに良さげなサンプルはありませんでしょうか? よろしくおねがいします。
どこまでフラグをapiで弄れたっけ?
SO_LINGERを設定してclosesocketすれば、RSTがとんだはず。
749 :
746 :2006/04/06(木) 21:32:29
>>747 IPヘッダは×
TCPヘッタが少々触れそうなのですが。。
>>748 おぉ!試してみます!情報ありがとうございます!゙
750 :
デフォルトの名無しさん :2006/04/09(日) 09:51:12
サーバの試験をするとき、クライアントを全部別々のIPにして 試験したいときは どうすればいいかな。 同一サブネットでの試験したいときに困った 10台程度なら根性で実機用意するにしても 200台とか2000台はちょっとむりぽ
vmwareとかどうよ?
バーチャルインターフェースとかインターフェースエイリアスとか。 クライアント側でソースアドレスをバインドすれば問題なし。
10台でがんばるならソースアドレスだけど、あんまり試験の意味はないね。 10台で2000IPのトラフィック(1GbpsNICでも10Gbps)と、2000台で2000IPのトラフィック(100MbpsNICでも200Gbps)は違うし。
テストに見せかけて荒らしツール作ってるだけだったりして
個人で嵐のために/24とかIP取ってたらワロス。
つ DHCP
>>753 はどうしてトラフィック負荷テストと仮定しているのか?
758 :
750 :2006/04/09(日) 20:02:07
>>752 なるほど、ソースをバインドすればエイリアスでもいけるでござるか。
鯖の試験で負荷以外に何か有る? 2000台も繋げるなら負荷が問題になるよなあ。
>>759 負荷試験でも、試験対象がサーバソフトのコネクション捌きの性能だったり、
スケーラビリティだったりする場合、bpsはほとんど関係ない。
コネクション開始リクエストの送出にbpsが足りるかぐらい。
>>750 Linux (Solarisも同じだったかも)なら
ifconfig eth0:1 ...
ifconfig eth0:2 ...
のようにしてどんどん増やして、その後どうやるか忘れたけどそのインターフェースを
通して接続する。他のOSでは知らない。
762 :
デフォルトの名無しさん :2006/04/12(水) 23:31:14
決まったコンピュータ同士で通信する方法で 小さなデータをできるだけ高速に通信したいのですが、ソケットでは socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); で作ったソケットを作り、物理層の上で通信するのが一番、高速ですか? とりあえずこれで実装してみるつもりなのですが、ほかに速い方法があれば 教えてください。
どういう用途なんだろう? 垂れ流し? ブロードキャスト? データは途中で消えてもいいの?
馬鹿の考え休むに似たり
765 :
762 :2006/04/13(木) 11:04:16
用途は、一台のコンピュータで時間のかかる計算して、その結果をもう一台の制御用のコンピュータに送信することです。制御用のコンピュータはなるべく通信に時間を割きたくないので通信時間を短縮したいとおもったのです。 通信は1対1でクロスケーブルで繋ぐつもりで、データの信頼性はあんまり重要ではないです。
>>762 >物理層の上で通信するのが一番、高速ですか?
…うん。バカハブとか、速いもんね。
>>762 処理速度云々はてめえで見積もれ。
できないなら、とりあえずTCPで実装してから考えれ。
768 :
デフォルトの名無しさん :2006/04/15(土) 00:48:02
TCPで、A,B,Cというパケットがこの順で来るべき所を Bがなかなかこない場合、Bが抜けた状態でA,Cだけが read()とかrecv()で取得されるという事はあり得るでしょうか?
AはくるけどBがrecvを通してアプリにわたってこない限りCはアプリに渡されないよ。ソケット内部ではもってるかもしれないけど
>>768 無い。そのためのTCP。
UDPならある。
>>768 TCPにパケットとかデータグラムってないよ。
というかセグメントという概念はある。RFCにも明記。 RFC 793 - Transmission Control ProtocolのGLOSSARYより segment A logical unit of data, in particular a TCP segment is the unit of data transfered between a pair of TCP modules. TCPの提供するバイトストリームにはデータの切目はない。 この違いを理解してください。 それから「TCP/Lower-Level Interface」ではセグメントを意識したプログラミングになります。
773 :
デフォルトの名無しさん :2006/04/16(日) 18:11:58
ルータの話になるかもしれないのですが、ネットワークプログラミングの常識かと思い質問です。 ルータの仮想サーバポートなどを設定していない状態で NAT内からUDPパケットをある特定のIPアドレス(グローバル)に対して送信します。 その場合、 1. 送信先IPアドレスからの応答は受け取れる 2. 送信元ポートへの応答は受け取れる(送信元IPアドレスは関係ない) 3. 応答は受け取れない どうなるのでしょうか? やはり「送信して一定期間内であれば」という条件もあるのでしょうか? DNSが使えるので、1はクリアできると思っていますが、不安なので質問しました。
NAT内から っていうのがわからんが・・・LAN内のことか? ping打てばわかると思うけどOKだよ 中から外はいいんだけど 問題なのは外から中が出来ない場合がある ・NAT ・NATP ・IPマスカレード ・アドレス変換 ・ポートフォワディング どれがどうなのか、最近のルータはこれを一緒に説明しているからややこしい
>>773 ルータのNATの実装による。1だったり2だったり。
>>773 その辺のブロードバンドルータとかASDLのモデムとかを相手にしてるなら、
xxxx:p から(ルータ等経由して) yyyy:q へ udp パケットを送ったあとしばらくの間は、
yyyy:q から(同じルータを経由して) xxxx:p への udp パケットはルーティングしてくれる。
という程度の仮定が良いと思う。
NAT越えを実装する機会?
NAT越えでもなんでもないよ これがないとDNSとかUDPのサービスが受けられないよ
UDPで unko という4バイトを1パケットで送信したとき ko un みたいに逆順になることはありえない よね?
受信できたら幸運だな。
781 :
773 :2006/04/17(月) 01:28:04
どうもです。
>>777 いや、1つはポートを空けていて、基本的にはそこで要求を待っているのですが、
何らかの要求に対して、別ポートをbindして、そこからからパケットを送信して、
それがいくつかのノードを経由して戻ってくるので、それを送信ポートで受け取りたかったのです。
UDPで一時ポートを使いたい。
送信から開始するので、ルータで設定する必要ないなら、
スレッド単位で独立した通信処理ができるので楽だなと思いまして。
>>773 の1、2のどちらかは、実装による(規格化・標準化されていない)ということで、
パケットにセッションID振って、1つの待ち受けポートで全部受けて、
そのあとキューに振り分けて処理するのが安全そうですね・・・。
>>774 LAN内で、一般家庭用のルータに繋がっている想定です。
>>779 まずはC言語をやり直した方がいいんじゃないかな
なんでC言語だと思うのだろう・・・
LinuxでC言語を仕様し、ソケット通信のプログラムを書いているのですが readや、acceptを非同期にしたいのですがどのような手法を用いれば非同期に出来るのでしょうか? ご回答よろしくお願い致します
スレッド
>>784 setsockoptでNON_BLOCK
select() と poll() もよろしく。
>>788 正解。 Windowsだと、ioctlsocket()。
787
初心者レベルな質問でスマソ Socketで通信できるのはTCP/IPだけですか? USBの通信状態をモニターするプログラムを実装したいのですが Socketでは無理なのでしょうか?
USBをソケットで実装してるOSがあれば扱えるはずだけど、 そーゆーOSは聞いたこと無いなー
まずUSBデバイスにMACアドレスを振る
実際にやるやらないは別として。 MACアドレス無くても、(IPとしてではなく)socketとして扱うなら 上位のレイヤで吸収できるんでない? 例えばAF_USBとかにして何らかの機器識別情報をパラメータにして。
SolarisとかAIXとかならSTREAM使えば簡単にできる。
赤外線はsocketです
USB とは関係ないけど Bluetooth の SPP とかもソケットで使えるな。 Winsock だと。
( ゚д゚)ポカーン
801 :
デフォルトの名無しさん :2006/04/18(火) 17:22:48
クライアントプログラムとCGIとの間で通信をやりたいと思っています。 クライアントはソケット通信で最初にポート80(Apache)にconnectするようになっています。 この状態でクライアント側で試しにCGIをシェル上で走らせてみると CGIに書いてあるHTMLは表示されるのですがscanfがまったく無視された形で戻ってきます。 自分としてはCGI上に書いてあるscanfで処理が1回止まり、1度文字の入力ができれば いいなぁと考えていたのですが、この考え方は間違っているでしょうか。 正しいか間違っているか、また間違っているならば後学の為にも正しい処理の概要を 教えて頂ければ幸いです。 言語はC言語、サーバーはRedHatです。よろしくお願いします。
板違い
>>801 間違っています。
*** 終了 ***
>>801 >>この状態でクライアント側で試しにCGIをシェル上で走らせてみると
この部分をこちらの理解可能な言葉に直してほしい。
client ----- apache (CGI)
ではないの?
CGIの標準入力は、postされたデータと繋がっているので、
処理が止まったりはしないけど、君の言っている意味がよく分からん。
805 :
801 :2006/04/18(火) 22:04:37
>>804 さん
説明不足、言葉足らずですみません。
>client ----- apache (CGI)
クライアントでsocketを作成後connectしてApacheに繋ぎ、「GET / HTTP1.1/」などの
文字列をsendで送信するとApache(CGI)から結果が返ってくるのですが、
その途中でscanfなどで「待ち」の状態にできないものかと試行錯誤している状態です。
その際、ポートは80で繋がっていると思いますがこのポート番号でprintf,scanfなどを使い
クライアントとデータの送受信が出来ないものか悩んでおります。
何か書いているうちに自分でも訳が判らなくなってきました・・・
4月からソケットプログラミングの勉強を始めたばかりなのでご容赦頂ければと思います。
>>805 間に httpd が居るので普通は無理です。
出来たとしても特定のウェブサーバの特殊な機能だと思った方がいい。
プロトコル違反になるからどんなサーバでも出来るわけないじゃん。
>>805 そういうのはPOSTでやればやれんことも無いです。
Ajax push なんかはそんな感じ。
809 :
デフォルトの名無しさん :2006/04/19(水) 03:21:54
速度可変のプロクシは、どのようなアルゴリズムを使っているのでしょうか。
>>805 nphとPOSTの組み合わせでできるんじゃね?
とりあえずnphでぐぐれ。
>>805 なにか送るまで待つってどうするのかというのがまず1つ。
HTTPだと、CGIに対してGETリクエストを出した後に、
さらにおなじプロセスに対してメッセージを送れないからなにを待つんだという話。
単にディレイ入れるならCGIでsleepするだけ。
CGIから別プロセスを立ち上げるか、別に待っているプロセスがいて、
CGIを通してそのプロセスにアクセスするのは可能。
ウェブベースのアプリケーションは大体そんな感じ。
>>809 帯域制限?
一定速度を上回るとディレイ時間を増やしていき、一定速度を下回ると減らす。
while () {
receive();
if (rate < max_rate) {
++delay;
} else {
--delay;
}
delay_thread(delay);// dly_tskやnanosleepなど
send();
}
ちょうどいい速度で落ち着く。
OSの機能であるならそれを使ったほうがよし。
>>if (rate < max_rate) { 逆。 if (rate > max_rate) {
>>815 リクエストヘッダをもう少し書いてあげれば?
Accept と User-Agent くらいは。
817 :
815 :2006/04/23(日) 03:20:21
リクエストヘッダにHost項目を追加したところ解決しました。 ありがとうございます。 AcceptとUser-Agentは無くても大丈夫でしたが追加しておきます。
接続に使うデバイス指定ってできますか? 環境はwindowsです。 LANとPHSが繋がっています。 PHSは、自動的に接続/切断 しています。 通信処理は、 socketでTCP/IPな転送と InternetOpenの流れのAPI使っています。
>>818 ソケットを Connect する前に、使いたいほうのインタフェイスアドレスに
bind しておけばsocket使うほうはインタフェイス固定にできます。
InternetOpen の方は・・・
route コマンドで一時的にそっちのIFの優先度を上げるくらいか。
820 :
デフォルトの名無しさん :2006/04/29(土) 20:07:55
ネットワーク通信性能測定用プログラムを作成したいんですが、 netperfのようなものでもっと小さいプログラムありませんか?
2chっぽい書き込みで盛り上げるねぇ〜
何かOSIレイヤが理解できないアフォが多いですね。 まあネット関係の言語は歴史的にCのほうが実績が有る。 他の言語でも、Cの実装に忠実に再現されてれば大丈夫だけど、ほとんどは多少違うので他のシステムとの通信時のデバッグで嵌る。 UDPは基本的にセッションが無いので、アドレス変換用のテーブルが作れない。 自分でNAT作ってみれば分かるよ。UDPは通らないNATでいいやと思うから。
∩___∩ | ノ ヽ / ● ● | | ( _●_) ミ 彡、 |∪| 、`\ / __ ヽノ /´> ) (___) / (_/ | / | /\ \ | / ) ) ∪ ( \ \_)
俺漏れも、くまぁ〜
情報処理試験で勉強でもしたんでちゅか
>>823 BSDソケット という言葉を使ってくれれば100点だったのだが…
ひょっとしてコピペのテンプレ誕生の瞬間に立ち会った!?
830 :
827 :2006/04/30(日) 23:03:01
試しに作ってみた。 何かOSI参照モデルが理解できないアフォが多いですね。 まあネット関係の言語は歴史的にBSDソケットのほうが実績が有る。 他のOSでも、BSDソケットの実装が忠実に再現されてれば大丈夫だけど、 Winsockの場合は多少違うので他のOSとの通信時のデバッグで嵌る。 ICMPは基本的にポート番号が存在しないので、NAPT変換用のテーブルが作られない。 自分でNAPT作ってみれば分かるよ。ICMPは通らないでいいやと思うから。
831 :
809 :2006/05/01(月) 05:22:01
>>813 遅くなりましたが、ご回答ありがとうございます
勉強になりました。
最近の HTTPd は SCO-Hash ヘッダなるものを返して来るみたいなんだけど、これって何か知ってる? Content-MD5 とはちゃうんか? SCO-Hash: 6c9173af0bf8d9c21cb3526f8f39d0f6 とか。
調べてないが、そういうのはRFCに書いてないか?
あのー、ethereal.com がexpireしたらしいんですけど、どうすればよいでしょうか? ドッキリでしょうか。
>>835 Updated Date: 05-May-2006
Creation Date: 27-Apr-1994
Expiration Date: 28-Apr-2012
838 :
デフォルトの名無しさん :2006/05/07(日) 16:49:52
WinInetを使っているのですが、Httpでアドレスがリダイレクトされたのを検出するのはどうすればいいのですか? InternetSetOption/InternetQueryOptionでSECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPというフラグがあるので試しにこれをONにしようとしたら、Setはできないフラグでした・・・orz なら何の為にQueryはできるのか・・・
普通にソケットを使って通信した方が早い。
long変数1つのみをマルチスレッドで読み書きする場合、クリティカルセクションで管理する必要ありますか?
>>840 InterlockedIncrement
InterlockedDecrement
InterlockedExchange
辺りを使えばいいんでない?
842 :
841 :2006/05/07(日) 22:07:06
WIN32APIだった、すまんね。
843 :
841 :2006/05/07(日) 22:14:01
>>838 INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPは
InternetOpenUrlのdwFlagsであらかじめ指定しておく必要があるんじゃまいか。
844 :
840 :2006/05/07(日) 22:20:16
>>841 いや、大丈夫です。必要な事が分かりましたから。
ありがとうございました。
846 :
841 :2006/05/07(日) 22:28:50
リダイレクト検出はInternetSetStatusCallbackでコールバック関数を設定して、 INTERNET_STATUS_REDIRECTメッセージが飛んできたら検出できるはず。
TCPでやり取りするプログラムを書いてるんだけど、 どうもshutdown, closeの仕方が分からない。 その辺がうまくないせいで、 同じポート番号での通信が一回しかできない。 あるポート番号で通信を行った後、 また同じポート番号を使う設定でサーバを立ち上げ直すと、 サーバがきちんとaccept状態になっていないのか、 クライアント側がconnectのところで失敗しちゃう。 チラ裏スマソ
>>847 setsockoptでSO_REUSEADDRすれ。
shutdownは、closeする直前に「受信はするが送信しない」or
「送信はするが受信しない」という状態を作るだけでその現象とは関係ない。
ていうかbindの戻り値ちゃんと見てエラーチェックしろよ…
あ、ごめんREUSEADDRじゃなくてREUSEPORTだ。
>>848-849 チラ裏にレスくれて
ほんとありがとう。。。
なにを質問したらいいのかさえ分からなくて、
チラ裏状態のまま書き込んでしまったんだけど、
ともかく、その点についてやってみます!
↑また無能のお出まし。
いや、ほんとsocket FAQは読んだ方がいい。
>>849 REUSEPORTだと他のプロセスもbindできてしまうから、
積極的にそうしたい理由がなければREUSEADDRの方がいいと思う。
ストリーミングを中継するようなサーバについて教えてください。 クライアントはダイアルアップルータを通してインターネットに接続できる 非固定のIPアドレスを持つとします。 公開された中継サーバにクライアントから接続して双方向にパケットを送信するとします。 TCPならクライアントからサーバに接続すればそのソケットを通して双方向に送信できます。 このときTCPなのでコネクション指向の接続であり、その場合もっと下位のレイヤでも 「セッション」のような概念をもち、サーバとクライアントのルーティングの情報をセッションとして保持していて よって双方向の通信できると私は理解しています。 ではUDPのようなコネクションレスの場合はどうなのでしょうか? クライアントがサーバに対してUDPのパケットを送信したらその瞬間に双方向のルーティング情報が 各経路に出来上がり、サーバからの返信も確実にクライアントに届くのでしょうか? いっぱい間違えていると思いますが、教えてください。m(_ _)m
教えてクンはさようなら
>>857 ありがとうございます。
届きませんか・・
残念
>>855 のような疑問(IPより下のそうでUDPやTCPがどう実装されているのか、
どうルーティング情報が保持されるのか、など)がわかるような良い教科書はありませんか?
IPより下の層にTCPやらUDPやらが実装されているわきゃない!!
UDPが正常に送受信できなければドメインを引くことすら出来なくなるぞ。
>>860 TCPはpeer-to-peerのプロトコルだということを理解してください。
次にIP層のルーティング機能について理解してください。
>>4 の↓を読めばいいです。
TCP/IPによるネットワーク構築 〈Vol.1〉原理・プロトコル・アーキテクチャ
複数のポートを使うクライアント・サーバ アプリを作成しています。 命令を出したりするメインポート以外のファイル転送ポート等は使用する時だけ 接続し、使い終わったら閉じるようにしているのですが、こういうやり方は まずかったりするでしょうか??
>>865 ftpはまさにそういうプロトコル。利点としては非同期にファイル転送を停止したり出来る。
>>865 まずくないと思うけど、漏れならクライアント側で接続先が同じ、
かつ再接続の頻度がそこそこ高い場合にはUDPのソケットは開きっぱなしにする。
安定して同じポート番号使って、NATに優しいプログラムにしたいから。
サーバ側は1つのソケットでいいから当然開きっぱなし。
( ゚д゚)ポカーン
869 :
867 :2006/05/11(木) 11:43:48
あ、
>>867 はUDPの場合の話です。
TCP の場合は好きなようにすれば良いと思う。
871 :
865 :2006/05/11(木) 17:49:35
レスありがとうございます。
>>866 なるほど。現状のまま行こうと思います。ありがとうございます。
>>867 そういうのもあるんですね。参考になります。ありがとうございます。
872 :
866 :2006/05/12(金) 01:14:33
>>871 あ、1つ重要な欠点を忘れてた。 そのデータ転送のポートの割り当て方を気をつけないと
ファイアーウォール、NATルータを通り抜けれない可能性がある。 FTPみたいに
ダイナミックにポートを当てはめてその情報をコマンドでやりとりしてとかやるとまず
だめ。 NATルータはFTPを通すためにえらく面倒な特別処理をしている。
詳しくは:
RFC 3235 NAT Friendly Application Design Guidelines
RTSPというプロトコルはTCPで搬送するらしいのですが、 これってメッセージをやり取りするたびにTCPのコネクションって 切っても良いものでしょうか? RTSPを使うアプリを見てると基本的にTCPのコネクションを維持しているようです。
TCPでメッセージの都度接続を考えるやつは馬鹿
>>874 そんな事考えてるのはお前くらいのもんだよ。
>>875 HTTP に KeepAlive 導入したヤシも似たようなこと考えてたんじゃネーノ?
>>876 HTTP/1.0以前は同じページにcssやら画像100枚やら張られるなんて
想像してなかったんだろうな。
HTTPは「メッセージを送信して応答をもらって切る」の繰り返し。 RTSPもHTTPに似てるから同じでいいんじゃないか?w
>874-878 レス、ありがとうございます。 結局のとこ、どうなんでしょうね。 接続を維持していたほうが負荷が小さいのは間違いないですが。 切っても良いっちゃ良いんでしょうが。
>>879 世の中には接続を切るとそのままセッションも捨てられるしょぼいサーバも存在するかも。
切らないほうがトラブルに見舞われることは少ないと思われ。
882 :
873 :2006/05/13(土) 21:37:49
>880-881 ありがとうございます。 ここまで、書いててまったく気づいてなかったのですが、 実はサーバー側の話です。 サーバー側で切ってしまうと、クライアントの方で問題にならないかな〜と 思いました。 まあ、いろんなクライアント試してみろって話ではあるんですが。
繋げっぱなしでセッション保持するプロトコルはモバイル端末で使えないな。
>>882 問題にならないようにHTTPにはCookieがある。
HTTPはもはや汎用のプロトコルでセッション管理も必要だから。
あなたがどういう応用を想定しているか分からないので、
あなたのケースではどうだかは分からない。
886 :
デフォルトの名無しさん :2006/05/15(月) 02:12:01
UDPで送信する際、プログラマーはMTUサイズを意識しないで良い。 送り側のシステムでMTUサイズに自動で分割され、受け側のシステムで自動合成される。 つまりパケット喪失や輻輳等はあるが、自動合成後のパケットデータは信用できる。 と認識しているのですが、正しいでしょうか? winsock2.0 vs2003 winXP win2000
>>886 沖縄から北海道へ行くのに地面を掘ってブラジルへ行こうとするほどズレている
教えて下さい winsock2なんですが、一度listenしたものをプロセスを維持したまま解除 (listenしない)にしたいです。 listenに使用したfd(SOCKET)を使ってshutdownやclosesocketしても まだLISTEN状態です。 「setsockoptでSO_REUSEADDRを使えばよい(次回からも同ソケットに bind&listenできる)」って記述は多くあるんですがそのものを解除したい場合 はどうしたらよいでしょうか。
889 :
886 :2006/05/15(月) 11:17:48
出直してきますw
listenしてるソケットをclosesocketすればいいだけじゃないの?
891 :
888 :2006/05/15(月) 12:09:43
>>890 早速ありがとうございました。
shutdown -> closesocket だとダメでしたが、closesocket だけにすればLISTENを
解除することができました。
「shutdownは必須」とばかり思ってましたがリスナーソケットですし明示的に
shutdown(s, SD_RECEIVE)する必要は無かったんですね。勉強になりました。
たしか、リッスン状態でも実際は開いてないのがあったような・・・・・標準サービスとかみたいなの
ママさーん! クッキンストップ! 心のポートで聞いてくれないんです!
>>892 プログラム側でaccept()してないだけでしょ?
VC++6.0、MFCライブラリのCAsyncSocketを利用して クライアントから1秒ごとに送られてくる、文字列を受信して クライアントへその都度文字列を送信する というサーバープログラムを作りたいのですが、 C++もソケットプログラミングも初心者の自分が勉強しやすい おすすめの参考書、サイトありませんか?
無い。
897 :
デフォルトの名無しさん :2006/05/19(金) 23:57:49
winsock2ですが、RAWソケットを使うことができますか? IPヘッダのポート番号をいじりたいのですが。 よく下のような表をみるのですがあってますか? RAW Socketでいじれる範囲 ---------------------------------------------------- Win95/98/Me Win2000/XP(SP1)/XP(SP2) Ether fame NG NG IP header NG OK
898 :
デフォルトの名無しさん :2006/05/20(土) 00:13:07
すみません サーバ側にあるDLLをネットワークを介してクライアント側で 使用することは出来ますでしょうか? 具体的には、CGI等でサーバ側のDLL機能を呼び出しクライアントの PCを操作するようなことを想定しています。 COMとかに関係してくるんですかね? よろしくお願いします
>>898 CGI ならネットワーク関係ないです。
手抜きしてないでちゃんとサーバの方の資料を読んで。
>>897 IPヘッダにport番号はありません。
推測は、無用な混乱の元です。
>IPヘッダのポート番号をいじりたいのですが。 ここ読む限りどっちなのかわからんな
>>901 プロトコルID ってなんだ?
プロトコル番号のことかな。
ていうか、プロトコル番号知ってる奴があんな質問しないと思う。
単に、IP ヘッダと TCP/UDP ヘッダの区別がついてないだけだろ。
905 :
900 :2006/05/20(土) 10:54:37
これでいいか? >
>>901 RAW Socketでいじれる範囲
----------------------------------------------------
Win95/98/Me Win2000/XP(SP1)/XP(SP2)
Ether fame NG NG
IP header NG OK
TCP/UDP header OK OK
馬鹿はほっとこうよ・・
907 :
デフォルトの名無しさん :2006/05/20(土) 17:08:25
906がほっとかれている件について
馬鹿はほっとこうよ・・
910 :
897 :2006/05/20(土) 22:38:44
908や911のような人種がこの世から消えますように(-人-)
914 :
デフォルトの名無しさん :2006/05/21(日) 03:43:55
C#の質問失礼します。 [TcpListener].AcceptTcpClientにて得たTcpClientから接続要求してきたクライアントのIPアドレスを導き出したいのですが、 どうすれば良いのでしょうか? -------------------------------------------- VS2003 XP 2000
916 :
914 :2006/05/21(日) 10:32:09
自己解決しました。 s= [TcpListener].AcceptSocket() s.RemoteEndPoint.ToString() で行けました。
917 :
デフォルトの名無しさん :2006/05/24(水) 14:57:32
初歩的ですいません。 ソケットって接続先がかわるたびに作成しなくちゃいけないんですか? 一つソケットを作っておいて、それを、アドレスの設定だけ変えて使いまわしては駄目なんですかね?
>>917 TCPではできない。
UDPはそもそも「接続」という概念がない。
その他について俺は知らない。
出来るよ。 使い回せないのは接続であって、ソケットではない。 ただしhalf closedにならないように注意。
>>919 あ、そうか、connect() でやればいいんじゃん。あー!
921 :
917 :2006/05/24(水) 16:11:50
レスありがとうございます。 出来るけど、一般的な方法ではないという事ですかね? 例えば、uriを入力したら結果を表示してくれる簡易ブラウザを作るとして、ソケットの作成は一回だけでいいんでしょうか? それとも、uriを受け取るたびにsocket()とconnect()をすべきなんでしょうか?
まず、リクエスト毎にshutdown / 再connect が必要かどうかはプロトコルによります。 例えばHTTP/1.1 ならば同一ホストに対しては繋ぎっぱなしにできることもあります。 再接続が必要な場合には既存のソケットは close して socket で新しくソケットの作成 からはじめるのが普通です。 connect / shutdown と違って、ソケットの生成と破棄は単なるカーネル内のメモリ操作に 過ぎませんので、あえて避ける理由はあまり無いと思われます。
924 :
917 :2006/05/24(水) 16:33:39
>>922 なるほど。わかりました。作り直すようにしようと思います。ありがとうございました。
925 :
917 :2006/05/24(水) 16:37:17
>>923 さんもありがとうございました。よくわかりました。
プログラムからPingを打つにはどのようにするのがいいでしょうか。 環境はUnixです。Windowsならicmp.dllというのがあるらしいのですが…。
シェルから呼べば簡単よ
>>926 #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int
socket(AF_INET, SOCK_RAW, proto);
manするとこう書いてある。
ってかmanしろボケ。
権限とかいろいろ面倒だから、
>>927 の方法がいい。
環境はUNIXでソケットを使用したUDP通信について質問があります クライアントからサーバへsendmsgを使用し、UDP送信を行うとソケットに 自動的に空いてるポートが割り当てられますが、そのポートが割りついた ソケットをそのまま使用して、recvmsgしても問題ないのでしょうか? 実際動かすと問題なく動作はするのですが、たまたま割りついたままに なっているだけで、時間が経過すると外れたりするのでしょうか? recmsgを使用するのであればbindすべきですか? ご教授のほど宜しくお願いします
931 :
デフォルトの名無しさん :2006/05/27(土) 20:13:22
934 :
デフォルトの名無しさん :2006/05/27(土) 20:37:03
>>932 そこに書いてあるような方法が一般的なんですか?
935 :
931 :2006/05/27(土) 20:45:00
場合によって使い分けるといった感じですかね。ありがとうございました
937 :
931 :2006/05/27(土) 20:52:49
>>936 よくわかりました!ありがとうございますm(_ _)m
938 :
デフォルトの名無しさん :2006/05/27(土) 20:59:59
940 :
デフォルトの名無しさん :2006/05/27(土) 21:14:50
>>939 え?どういう意味??
MSDN を見ないって意味ならそれも仕方ないんじゃないかと思う。
だって、肝心なところは暗号化されてるし。
>>938 は、winsock では違うって意味で書いたんだけど。
941 :
931 :2006/05/27(土) 21:29:34
942 :
デフォルトの名無しさん :2006/05/27(土) 22:48:32
944 :
デフォルトの名無しさん :2006/05/27(土) 23:04:53
945 :
931 :2006/05/27(土) 23:28:26
>>942 WinInet・・今ちょっと調べてみたんですけど、winsockよりだいぶ入り易そうですね。
今まで存在そのものを知りませんでしたwd。
>>943 初級者なんで、一から順を追ってといった感じの解説サイト(本)じゃないと厳しいですね。。
その様子だとエコーサーバを作成したこともなさそうだが TCPのコネクション確立の仕方も知らずにネットワークプログラミングをするのはどうかと #WindowsでHTTP/FTPだけならWinInetがあるから、知らなくても多少は大丈夫だろうけど 猫でもわかる〜でも読んでおけよ しょぼいけど抑えるところは抑えてあるぞ
本一冊でも買ったほうがいいと思うなあ。 インターネットで情報入手できる時代では有るけど、歴史が違うから、書籍のほうが詳細でよく吟味されてまとめてあって読みやすいよ。 この先、氏ぬまでwindowsしか弄らないと言い切れるなら、bsd系のapiも無視してもいいかも知れないけど、 unix系にしろ、歴史的経緯で基本はbsd系のapiに行き着くので、後で応用が利かずに苦労するよ。 たとえばTCPのソケットって面倒だなあってのは、UNIXの設計思想として何でもファイルの様に扱いたいって言うのが有って、ネットワークもファイルの様にソケットに読み書きすれば通信できるって風にしたいからとか基本が理解できてないと理解できないことも多い。 あとはネットワークに限らず、全てのソフトに言えるけど、長く使われてるものほど、バグが潰されてて枯れてて不具合に巻き込まれにくい。 IPスタックの歴史で長いのはbsd由来の実装だし、windows系はまだまだ歴史が浅いよ。 まあそろそろスーパーハカーがbsd由来のIPスタックに置き換わるような革新的なIPスタックを出してくれてもいいと思うけどな。 ディスクレスクライアントとか現実的に使われてる今時、ファイルシステムに依存するIPスタックもどうかと思うし。
>945
>一から順を追って
つ[RFC]
もし、プロトコルを理解する以前の問題なら
つ[
>>4 ]
>>942 Winsockは、その本が一番いいと思うけど、
カマー本のWinsockという手もある。
あっちはプロトコルの話が少し多い。
>>947 ディスクレス・クライントはファイルを使わないのですか? (そうではないでしょう)
>ファイルシステムに依存するIPスタックもどうかと思うし。 ソケットがwriteでかけて,readで読めるだけでしょ?
ディスクリプタを扱えるだけだな 個人的には専用インタフェースが欲しいが
ライブラリがいくらでもあるでしょ。 ほとんどのプログラマはわざわざソケットをじかに叩く意味もないし。
954 :
942 :2006/05/28(日) 18:12:32
みなさんありがとうございました。 今は本格的にネットワークプログラミングを勉強しようと思ったわけではなくて、部分的に少し必要になっただけなので、winInetにお世話になろうと思います。 (時間があればみっちり勉強したいんですが・・)
955 :
945 :2006/05/28(日) 18:14:00
>>954 はレス番ミスです。すいません。945でした;
956 :
デフォルトの名無しさん :2006/05/28(日) 19:33:53
この手の話って必ず RFC を必死で薦める人が出てくるんだよね。 初学者だって書いてあるじゃない。 なんで RFC 薦めるの? 読んだことないけどなんかいい物だって聞いてるから?
×初学者 ○めんどくさがり
958 :
デフォルトの名無しさん :2006/05/28(日) 19:38:02
>>957 あのねぇ。
ここまでの書き込み見てわかるでしょ。
ネットワークどころか、プログラミングの初学者なの。
そういう人になんでわかりにくいもの薦めるかなぁ。
混乱させて楽しむってやつですか?
プロトコルの仕様に関しては RFC で必要十分だから。 噛み砕いて欲しいならせめて 「○○ってどういう意味ですか?」 くらいまで落として欲しいもんだね。
教えてクンは神様です。 偉いんだぞ! おまいら頭が高い!
961 :
デフォルトの名無しさん :2006/05/28(日) 19:41:12
>>959 この人は、そんな質問してないでしょ?
質問の答え書けばいいと思います。
Linux 系の人がうそ教えて喜んでたけどさぁ。
あれほんと悪質だよ。
ちゃんと答えかいてやればいいじゃない。
>>961 じゃ、おまいが書いてあげれば良いじゃないか。
963 :
デフォルトの名無しさん :2006/05/28(日) 19:43:26
バカが出たぞー
964 :
デフォルトの名無しさん :2006/05/28(日) 19:44:29
>>960 なんかわかってしまった。
きっと教えるマニアっていうのがいるんだよね。
で、必死でぐぐりながら答えるの。
で、うまくぐぐれないと怒り出すの。
で、ぐぐってるだけで、きちんと知ってて教えてるわけじゃないから、
うそ教えてるの。
で、何で私が頭に来てるか理解できない。
965 :
デフォルトの名無しさん :2006/05/28(日) 19:45:07
>>962 書いてあげたじゃん。
ちゃんとうそ教えてる人にも訂正するチャンス与えた。
自分何も回答しないくせに、回答した人にケチ付ける人マンセー
漏れはRFCは全部暗記してる
968 :
デフォルトの名無しさん :2006/05/28(日) 19:47:16
>>966 教えた。
過去ログ嫁。
すっごい感謝されてる。
涙流しながらありがとうって言われたよ。
969 :
デフォルトの名無しさん :2006/05/28(日) 19:48:44
970 :
デフォルトの名無しさん :2006/05/28(日) 19:48:57
971 :
デフォルトの名無しさん :2006/05/28(日) 19:51:27
>>968 あなた様のおかげで命を救われ、人生をやり直すことができました。
その節は本当にありがとうございました。
ぬるぽ
, イ)ィ -─ ──- 、ミヽ ノ /,.-‐'"´ `ヾj ii / Λ ,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{ ノ/,/ミ三ニヲ´ ゙、ノi! {V /ミ三二,イ , /, ,\ Yソ レ'/三二彡イ .:ィこラ ;:こラ j{ V;;;::. ;ヲヾ!V ー '′ i ー ' ソ Vニミ( 入 、 r j ,′ <仲良くなってくれ ヾミ、`ゝ ` ー--‐'ゞニ<‐-イ ヽ ヽ -''ニニ‐ / | `、 ⌒ ,/ | >┻━┻'r‐'´ ヽ_ | ヽ _ _ 」 ググレカス [ Gugurecus ] ( 前224 〜 前194 )
まぁでもこのスレはなぜか答えずに煽る人が多いのも確か
976 :
デフォルトの名無しさん :2006/05/28(日) 22:28:40
>>967 伝書鳩をつかってパケットを送りたいんだけど、助言頼む。
>>977 悪いことは言わないからやめとけ、パケット消失しまくりだし、
あいつら暴れるから再送とかすげー面倒。
餌代だけで年間数百万の維持費が居るからね。 初学者だからこそ基本は大事という意味で、RFCとかの仕様を読んだりソケットAPIの使い方を知るのが必要だけどな。 高レベルAPIのほうが簡単でいいけど、うまく逝かない時に何が起きてるのか理解できずに途方に暮れるだけ。 車作ろうと勉強してる香具師が、自動車工学とか勉強せずにエンジンの掛け方と止め方程度の操作だけしか知らずに車作れる訳ないじゃん。
それはない
とりあえずRFC1149、RFC2549嫁
RFC2549より Encapsulation may be done with saran wrappers. Unintentional encapsulation in hawks has been known to occur, with decapsulation being messy and the packets mangled. カプセル化はサランラップで可能らしい。なんだよこれw
>>982 捕食されるのもencapsulationか
鷹による予期せぬカプセル化が発生することがあります。 このカプセル化の解除はパケットの汚損を伴います。 か
サランラップで包むこともできます。 しかし予期せず鷹によって捕獲されることがあります。 取り戻しても、中身が汚れ、包みは外れているでしょう。
char *addr =
う・・なぜか書き込みが途中で切れました・・。 えと、文字列に、IPアドレスの文字列かホスト名が入っているときに、 どちらが入っているかを判断する方法はあるでしょうか?教えてください。
>>987 最初の文字が数値ならIPアドレスの文字列
それ以外ならホスト名
ホスト名は最初の文字は数字ではないのですね。 ありがとうございました〜。
さすが2ちゃんねる 質問に質問で答える香具師しかいない 昔とは随分質が落ちたものだ
さすが2ちゃんねる 回答と質問を取り違える香具師がいる 昔とは随分質が落ちたものだ
>>987 んなもんどっちが入っていようが gethostbyname() 使えばいいじゃないか。
おいおい 普通はまずinet_addrで確認してからだろ。 無駄なトラフィックかけるなよ。
gethostbynameは引数が "localhost"かIPアドレス文字列の場合はトラフィック掛からないよ
>>993 どうせあとでやるなら同じ。
やらないならその通りだが。
今時はgetaddrifo
997 :
デフォルトの名無しさん :2006/05/29(月) 22:05:08
RAWモードでプロセスのパケットをキャプチャし、特定のアドレス・ポートからの 接続をぬっころすことはできますか?
OK
1000 ならチンポからパケット飛ばす
あれあれあ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。