6 :
デフォルトの名無しさん :05/03/03 07:53:01
マルチクライアントのサーバーを作っているのですが、 接続できる最大のクライアント数はFD_SETSIZEで定義される数ですか?
あ、嘘ついた。7は無しで。
9 :
デフォルトの名無しさん :05/03/03 11:25:16
10 :
デフォルトの名無しさん :05/03/03 13:36:43
>>7 OSも関係あるんじゃなかったっけか。
WinXPだったら10クライアントまでだっけか。
Linuxだったら無制限だっけか。
>>10 それはライセンスの話で、ソケット的な制限があるわけではない。
それにLinuxだってソケット的に無制限なわけないでしょ。
どうチューニングしようと、カーネルメモリを使い果たしたら終り。
ライセンスの話なのか。 10人以上接続できるやつを作っても10人しか接続できないものだと 今までずっと思ってた。 メモリは詳しくないから分からん。 むしろ「カーネル」のつくものはカーネルおじさんしか知らない。 勉強してきますorz
14 :
デフォルトの名無しさん :05/03/03 23:26:54
前スレが終わったのでage!
16 :
デフォルトの名無しさん :05/03/04 22:00:05
winsockの使い方がなかなか覚えられない。 どうやって覚えるのがベストなのさ?
winsockの関数や構造体のほとんどは UNIXでの名前を再定義しているだけだ。 実はUNIXのコードがほとんどそのまま使えたりする。 close()をclosesocket()に変えるぐらいか。
HTTP 1.0クライアントでも作ってみれば? コマンドラインならすぐできるでしょ。
>>17-19 Winsockを使ったアプリケーションは今までに3回くらい作ったけど、
全然頭の中に残らないんさorz
winsockはC/C++で使ってるが、ん・・・。
WINAPIならサクサク入ってくるんだけどなぁ。
この際暗記的に覚えるしかないか。
概念を把握してないんでしょ。
ネットワークは抽象的だから。
>>1 のFAQを何回も読め。
>>15 も読んだ方がいい。
これを克服すると一つレベルアップ。
22 :
デフォルトの名無しさん :05/03/04 22:22:45
>>18 クソBSDソケットの真似事しても無意味だと気付いたM$は
Winsock2.0の時点でさっさと独自API仕様に乗り換えたぞ
その結果さらに大糞になってしまった。
OSまるごと失敗続きのM$
>>18 ただ、マルチスレッドが多く使われる分野だから・・・
UNIXとWinでは、その辺で移植に困る事があるんじゃない?
あと、fork
27 :
デフォルトの名無しさん :05/03/04 23:13:40
なんでsocket関連使って作られたソースって汚いんだろうね BSDでもwinsockでも
BSD流は汚くなるけど 最初からwinsockで作られた奴は綺麗
マクロの使いすぎだよな。 ソースが汚いというのは、記述スタイルの話じゃなくて、 マクロ乱用のことを言ってるんだと思う。
WindowsはSEHあるから、かなりシンプルにまとまると思うけど。
マクロっつーか構造体の構造に一貫性がないと感じる。 なんかこう一本筋が通ってないというのかな。
>>32 あーそれもある。名前のつけ方も刹那的だし。
ひたすら改築増築を重ねてきたからだろうね。
>>33 殺那的ワラタ
もっと整合性を考えて欲しいよな。
一から作るC#で直るかと思ったら…orz
C#は次で手が入るっぽい
テキストは送受信できても画像を送受信する方法が分からなくて色々試してたら、 ファイルをWINAPIのCreateFile云々を使ってchar型の変数に読み込んでそれをテキストファイルと同様に扱ったら送れたのですが、 画像はこのchar型変数の中でどうなってるんですか? 文字列として格納されているのですか? char型変数を使うのが間違ってるのかなと思ったのですが>void型とか? そこらへんどうなんでしょうか。
「変数」? 「配列」って言いたいの?
テキストだろうがバイナリだろうが、結局はただのバイト列だろ。 つか、ネットワークプログラミング関係無いし。
int はもっともPCに適したビット数(16 or 32 or 64) OSに依存 long は 32 short は 16 char は 8 配列はただのビット列なので区切りがわからないと扱いにくいから 型を指定してアクセスしやすくるす charを使うと8ビットづつ shortを使うと16ビットづつといった具合 テクストは単にASCIIが8ビット単位しかないのでcharを使ってるだけ Unicodeは16ビットになるのでshortになる つか、ネットワークプログラミング関係無いし。
>>43 >int はもっともPCに適したビット数(16 or 32 or 64) OSに依存
>long は 32
>short は 16
>char は 8
決まっているのは
sizeof(char)==1
char<=short<=int<=long
だけじゃなかったっけ?
つか、ネットワークプログラミング関係無いし。
大嘘をもっともらしく言えるのも、匿名掲示板特有の現象ですよ
もっともらしくすらないけどね。 つか、ネットワークプログラミング関係無いし。
ありがとうございます。 えっと・・・char型よりもビット数の大きい型の変数を配列にしてやればいいんですね。 //スレ違いすいませんでした。
>int はもっともPCに適したビット数(16 or 32 or 64) OSに依存 こんなこと言う奴初めて見た しかもOSに依存ときた・・
>>43 漏れのathlon64はlongが64bitです。どうすればよいでしょうか。
longはint以上の大きさらしい。 long >= int >= short
longも変動するのかしらんかった intは処理系で一番高速なアクセスができるビット数だと定義されてると思ってたけど違った? __int64とかって意味ないな
>>51 もしかしてsizeof(char)==1オクテットとか信じてる?
>>51 スレ違いだからみんな正しい解答なんかしないよ
さっさとどっかに逝け
>>54 そいつが作った稚拙なソースが他人に渡らないのであればな。
>>51 >intは処理系で一番高速なアクセスができるビット数だと定義されてると思ってたけど違った?
もともとの意味はそうなんだけど、int=32bitを前提にしてるアプリが多くて、
互換性に支障をきたすから、64bitな処理系でもintを32bitにする事が多い。
基本ルール
sizeof(char)==1
char<=short<=int<=long
int>=32bit
最後のだけは守らなくてもANSI C準拠になったはず。
C99じゃlong longも正式採用になったしどうなったんだろ?
>int>=32bit longだったかも・・・。 憶えてないや。
いい加減スレ違いだからやめて欲しいけど、 上2段は正しいけど、規定されているのは、short>=16bitとlong>=32bitだけだよ。 intのサイズは間接的に>=16bitと決まるだけ。
このスレ的にはC99を期待できるならintN_tやuintN_tを使えってことでいいんじゃないの
結局誰も正確なことはわからんということでいいのでは? 必要ないしね、開発する処理系のビット数だけ把握してればいい話 まだほとんどint = 32なんだから
んなことわかっててもたいしたソフトも組めないのじゃ意味ないけどねw
こういうクズがのさばれるような業界だから IT土方って呼ばれるんだよな。
混じれ酢すると 言語仕様をいくら顧客に語ったところで、お金にはならないよ 生産性も向上しないよ、ないようによってはするものもあるけど 技術は技術でもアルゴリズムとかUIの既存以外のアイデアをいくつ持ってるか 応用して作り出せるかのほうが重要 それができないならただ言語仕様に詳しいだけのコーダー(土方) って発想が普通では?
例えば、IPヘッダのチェックサムなら、
#include <stdint.h>して、uint16_tを使う。以上。
>>65 プログラマ板行け、この呆け。
16bit=>int==16 32bit=>int==32 64bit=>int==32 な 64bit以外は、確かにCPUにあわせたbit数になるため、最も高速にアクセス出来る。 64bitで最も高速にアクセス出来るのは、long longだ。
大嘘をもっともらしく言えるのも、匿名掲示板特有の現象です
つか、ネットワークプログラミング関係無いし。
>>67 って間違いなの?
俺もそう認識してたけど・・・
CPUや吐かれるコード、最適化等に依存じゃないのか? 妄信的に決め付けるのは間違いの元
>>71 そう、OSも と言うのが重要
CPUだけ64bitでも、OSが16bitDOSじゃ意味ネェよ
いや正確にはリンカがライブラリモジュールを結合する際に32,64を区別してくっつけてるから コンパイラ&リンカに依存してる ただ普通は64OSなら64コンパイラを使うってことだと思われます。
>>67 ,
>>71 それ正解じゃない。
cray-1 なんかは short==int==long==64bitだった筈。
ぐぐってみたけど, 64OSでint = 32にしてるのは AMD と Intel が暫定的にやってるだけの話のようだが?
alphaとかでもintは32bitのままだったような。 まあ、DOSは16bitだし。 とりあえず、自分の周辺の事しか知らない 井の中の蛙にはなりたくないね。
>>77 別に暫定的じゃない。こういうABIの根幹に関わる部分は、一度
決めたら二度と変えないものだし。
UNIX系64bit OSは、crayみたいなスーパーコンピュータを除き、
ほとんど全てで short:int:long:pointer=16:32:64:64 てなってる。
alpha, irix(mips64), sparc64, amd64, ia64 すべてそう。
alpha や mips64 が出た当時は、まだ C99 以前、C89の時代だった
から、C言語標準に long long はなかった。
だから、longを64bitにするのが、ほぼ唯一の妥当な解だった。
で、この時代に longを32bitと常に仮定するようなソースコードは、
UNIXの世界からはほぼ一掃されたので、それ以降の64bitマシンも
同様の定義を使うのが慣例。
えーと、みんな気がすんだ? では何ごともなかったように以下ネットワークプログラミングの話へ
81 :
デフォルトの名無しさん :05/03/08 04:05:48
ネットワークプログラムは他者との強調が必要 プラットフォームに依存しない作りにすることを心がけるためにも 以上の話題に無関心なのは困る
そもそもプラットフォームが違えばAPI仕様が根本的に違うので 意識しても無駄 どうしてもクロスなものが必要ならWrapperクラスを使うのが普通だし そうなると意識する必要もない よっぽどお馬鹿なことでもしないかぎり問題になることもない 桁数が精度に影響するようなつくりをする時点でいくらそういったことが わかっていてもはっきりいって論外 桁溢れする可能性のあるものは文字ベースで扱うのが普通ですよ それにtypdefってのはそういうことのためにあるものだし
散々他の人にバカにされてるのに まだそんなこと言ってるのか
時には割り切ったコーディングも必要だし 理想を求めるのも必要
てゆうか整数型のサイズどころかAPIまで違ってる システムの間でも通信はできるし実際やってるわけ ですが。だからこのスレで話題になるんでしょ。 あとどうでもいいけど整数型のサイズは違う(ABIは 当然違う)が、APIは同じってシステムはかなり多いよ。 UNIX系はそんな感じだし。UNIXとWindowsの間でも ISO-CとかC++で定義されているAPIは同じなんだし。
>>85 はAPIの意味を根本的に取り違えてると思われます。
クロスプラットなソース書こうと思ったら
#if
VC用
#else
ボーランド用
#else
UNIX系用
#endif
って感じで結局別個に書くか、GygwinやMinGwやkylixのようなWrapperライブラリを
使うことになる
まあたしかに、速度の限界を追求するような例えば、圧縮ツールなんかの場合は
上記のように個別に記載することもあるけどね
ネットワークプログラミングでそこまでやってたらバグの元をわざわざ作るようなもんだ
まぁ個々の実力に合わせて適当なところでライン引けや。
前に出ていたがsocket系は刹那的なプログラミングする香具師が多いという意見には同感。 ちょっと作って動けばいいやってそのままブラッシュアップされずに放置、みたいな。 何でいつまでも同じ過ちが繰り返されるんだ?
>>89 つまり低能はプログラミングをするな、ということですね。
>>91 そんだけ開発者にとってめんどっくさいIFだってことだろ。
俺はそうはおもわないんだけども。
BSD socketは概念としてはいいけどAPIはクソだと思うね。
>>94 Unix的な極Primitive指向だもんな。
その代わりにWin32 APIなんかと比べると命令セットの肥大化を
うまく抑えて必要最低限なものだけで済むメリットもある、と。
もともとの意味はそうなんだけど、ポインタ=32bitを前提にしてるアプリが多くて、 互換性に支障をきたすから、64bitな処理系でもポインタを32bitにする事が多い。
>>96 そんなコード、見たことねぇな。恵まれた環境で仕事してるんだなぁ、俺(*´Д`)
ここのみんなは ACE って使わんの? 俺も使ったことはないんだけど、なんかよさげだよ。
64bit UNIX でも 64bit Windows でもポインタは 64bit じゃん。 その「多い」って、いったいどこの処理系の話よ?
しー。 目を合わせちゃ駄目ですよ。
>>99 UltraSPARCとかそうじゃなかったっけ?
32bit互換モードとかあった気がする。
102 :
99 :05/03/08 22:24:21
32bitモードは、sparc64 に限らず、どのCPUにもあるよ。 でも32bitモードは、「64bitな処理系」じゃない。 単なる「32bitな処理系」。
あらら、もしかして
>>96 は
64bitモードでもアドレスをuint32_tとかで扱うってことを言ってるのかしらん。
でも、それじゃ動かないよね?てっきり互換モードの話かと。。。
いや、32bitOS(Win95等)で16bitプログラム(Win3.x用)を動かす、
なんて事は今までも多々あったし、XP64でも当然32bitプログラムは動く。
もちろん、x86に限らず、普通の64bitOS上では
既存の32bitバイナリがそのまま動くのが一般的。
もし
>>96 が「64bitOS上で32bitプログラムを動かす」ことを言っているなら
ただのバカだよ。
いや、「64bitOS(64bit処理系)でもポインタは32bitにする」と言ってるとしても
ただのバカであることに違いはないけど。
もしかしたら同一人物かもね。
http://pc5.2ch.net/test/read.cgi/tech/1109121175/38-
105 :
デフォルトの名無しさん :05/03/08 22:58:22
32bit互換モードってまたIntelの8086セグメント方式が復活するみたいで嫌だな
107 :
デフォルトの名無しさん :05/03/08 23:09:08
javaでrawソケットって使える?
せっかく64bit使ってるのに32bitの壁なんて考えたくも無い
unixソケットはあんまりよく知らないけど winsockはひどいもんだな 例えば、Asyncにしようとするとウィンドウへイベントって形でやらないといけないけど クラスにシンプルにまとめようとしたときこれはかなりじゃまになる 接続が成功したか、失敗したか、途中で切れたかって判断がかなり複雑になる からそのつど、プログラム量がけっこう多くなる この辺はunixでもいっしょかな? 単純C/Sだとサーバ側がちょっと複雑になるだけですむけど、分散システムになると もうわけわからんくなるね
そもそもコネクションが切れるって動作は必要ないと思うんだよね 切れたら、再接続に向かってどうしても繋げない状態を検出したら その状態を検知した上でabortするような仕組みにすればいいのに 数十秒待たされたあげくに、実は切れてるねんとかいう今の仕組みはよくない FTPやHTTPはこの切れを前提で作られたプロトコルだからいまさらどうしようもないのだろうけど
これだからトウシロは・・・
>>110 別にAsyncはウィンドウ必須じゃないんだけど。
>>114 、115、116
そこを論理的に教えて使えるようにするのがプロの仕事では?
もう教育係いやだ。。。(´Д⊂グスン
>>117 socketoptで非同期通信にすると当然ぐるぐるまわさないと
即時応答はできない
そうなるとスレッドを使わないといけなくなるわけだが、ぐるぐる回す時点でかなり
リソースの無駄使い
しかもVC++のクラスはスレッドセーフじゃないのでかなりかっちょわるいソースになる
つーか
>>114-117 はwinsock知らないだろ?
>>118 では漏れが。
Winsockでウィンドウとメッセージポンプを使いたくないなら(当然使いたくないが)、
・セッション数が少ないならスレッドで普通にselectしつつ動作
・セッション数が多いならWSAEventSelect とかIOコンプリーションルーチンやらを使う
あたりが定番。
サーバアプリなどで性能が要求される場合には、IOコンプリーションルーチンつきの
IOリクエストを常時複数投入しておいて、カーネルが待ち時間無しで随時IO処理できる
ようにすることもある (IOキューイングという手法)。
UI オリエンテットなアプリで、通信のスループットなんかどうでもいい場合にはウィンドウ
メッセージを使う場合もある(のか?やったことないけど)。
>>113 は単に TCP に対する愚痴じゃないの?
>>124 いやしかし、
>>113 の
>切れたら、再接続に向かってどうしても繋げない状態を検出したら
>その状態を検知した上でabortするような仕組みにすればいいのに
ってまさに今のTCPそのもののように思うんだけど・・・
数十秒も頑張らなくて良いよ、ってことなのかな。
>>125 今のTCPのどこがそこまでしてくれるんだ?
コネクション確立っていっても定期的に状態確認しあってるわけでもないし
ちょっと瞬断しただけで、コネクションが切れて
しかもデータのやり取りが発生するまでは無反応
それが今のTCPの仕様
>>126 KeepAliveをONにすればしてくれるでそ。
んで、KeepAlive始めるまでの時間の諸口が長く、またコネクション毎にこの時間を設定できないOS/
プロトコルスタックが殆どで使いにくいのは確かだけど、これはTCP/IPの責任ではないと思う。
じゃあ誰のせいだ、というとよくわからないけど。
TCP/IPのKeepAliveは使わないで上位プロトコルでやるという伝統のせいか?
>>127 訂正: 「使いにくい」⇒「使い物にならない」
ネット速度もかなり高速化してるし この際、新しいプロトコルを考えてもいいかもね
プロトコロの問題じゃなくて、利用する側の問題だろ。
再接続したければ、再接続すればいい。
>>126 は低能だから無視。
>>120 >>113 も同様。
> 再接続に向かってどうしても繋げない状態を検出したら
出来る時はしているのに、
低能ゆえ出来ない時がどういう時か理解できずに見当違いの愚痴を言う呆け。
>>130 ネットワーク高速化してるのに、低脳ゆえ出来るときが多様化してることにも
気づかないのですね?
元気、元気、元気な子供は腋毛がざるそば! こんにちわ。プロトコロジョージです。
>>129 window scalingとかselective ackとかTCPも進化してるぞ。
ネットワー君です。
再接続ワラタ
最近はNATの内側にいる人が多いから
本来のTCP/IPの再接続が出来ない環境に
なっている人も少なからずいる。
>>113 >>120 >>126 は
それを知らずに愚痴ってるだけ。
>>137 > 本来のTCP/IPの再接続
って何よ? TCPのRSTのこと?
全然血が牛
改行スタイルの話だろう。
>>139 あってます。multiline response の形式としては、termination octet (.) で始まる行は
先頭にもう一つ termination octet を付けることになっているが、メッセージのオクテット数
を数える上では行頭のtermination octetを2倍に数える必要はない(数えてはいけない)、
ということです。
改行については特に質問されていないようですが、改行は当然2オクテットで数えます。
ラインバッファ方式のサーバもあるから あんまり長いとバッファオバーフローおこしちゃうでしょ まあこれくらいにしといてよってことの話でしょ 70以下に抑えときゃまああんま深く考える必要もないかもしれん
>>143 なんか質問とは全然関係ないような気もするが・・・
確かに、以前調べたときは1024バイト程度でJISのシフトINとか無視して
勝手に改行入れてくれるMTAが結構あった。
仕事でMUA作ってたんだけど、そういうので化けてもOKにする必要が
あってメンドクサカッタなぁ。
145 :
デフォルトの名無しさん :05/03/13 11:40:39
selectで待ち受けられるディスクリプタの 登録の上限数ってどこに書いてあったっけ OSはredhat9でカーネルは2.4.26使ってます 何も考えずに800本くらい使ってるけど このくらいなら大丈夫だったっけか
FD_SETSIZE を再定義しているのであれば、
select 側には特に制限はない。
むしろファイルディスクリプタ数の方の
制限で決まる。
ただ、800ぐらいの数になると、epoll(4)
とか kqueue(2) とか使った方が速い可能性
がある。こいつらは今のところあまり移植性が
ないので、libevent を使うのが吉。
ttp://www.monkey.org/~provos/libevent/
147 :
デフォルトの名無しさん :05/03/14 22:30:18
質問です。 MSNメッセンジャーにあるような、NATの種類を判別するプログラムはどのようにすれば良いのでしょうか? シンメトリックの場合とそれ以外の場合とで処理を別にしたいのですが・・・。 よろしくお願いします。 WinSockで組んでいます。
両端のプログラムを書けるなら出来るかもね
UDP hole punching
151 :
デフォルトの名無しさん :05/03/15 09:35:01
FD_SETの戻り値はなんですか?
0
>>151 マクロなので sys/select.h か sys/types.h あたり見て確認しる
仕様上は戻り値なし(void)と解釈しておいた方が 良いと思われ。引数範囲チェックとかもなし。
155 :
デフォルトの名無しさん :05/03/15 19:30:15
>>154 FD_SETを1万回やったらどうなるかなというちょっとした好奇心
100万回生きた猫
157 :
デフォルトの名無しさん :05/03/15 21:10:15
質問です。 UDPは到着順も保障されないと言う事ですけど、 これは、送信時に大きなデータをWinsockが勝手に細かく切って送信した場合の到着順も保障されないのでしょうか?
フラグメントは、受けとったカーネルが組み立ててから アプリに渡すので、アプリからみると、分解されてない ように見える。 もし、フラグメントが一つで途中で失われると、パケット 全体が失われる。
>>159 失われるだけで、順番は正しくなるのでしょうか?
失われるだけだと、再送処理を行えば良いだけなんですが・・・。
>>160 逆に不ぞろいだったとして、カーネルが制御してるものをどうやって順番に並べるの?
>>161 いやー、だからエラー処理は出来ないのかなぁ?と
最初から分割されるサイズを考慮して、プログラムでそのサイズを超えないように分割しないといけないのかな?と
てゆうか、フラグメントに分割されたパケットに 関しては、カーネルが順番どおり並べてくれるの で問題ない。ただし、全パケット届けば。 パケット損失確率がある程度高いネットワークだと、 フラグメントが失われる→全再送が生じてネットワーク バンド幅を無駄使いすることが多くおきるので、 UDPの1パケットは、あんまり大きくしない方が良いことが 多い。
バイトオーダーってWindowsもLinuxもFreeBSDもその他PC UNIXも全てリトルエンディアンですか? CPU依存とのことなのでCeleron, Pentium, Athlon, K6を使うOSは全てリトルエンディアンですよね?
> CPU依存とのことなのでCeleron, Pentium, Athlon, > K6を使うOSは全てリトルエンディアンですよね? これは、その通り。 > LinuxもFreeBSDもその他PC UNIXも全てリトル > エンディアンですか? Linux や FreeBSD は、PC だけでなくビッグエンディアンの マシンでも動くので、OS だけからは何ともいえない。
>>165 FreeBSD同士でも企業の使ってるでかい箱とPCとでは
バイトオーダーが違うこともあるということですか?
SPARCで動くFreeBSDが無いわけじゃないからなぁ
互換性のためにエミュレートしてでも同じにしてると思っていたので。
>>169 それは勘違い。
*BSDやLinuxはそういうレベルでの互換性を保ってはいない。
なんとか理解できました。ども>ALL
transactions per secondを一定量にコントロールするコツってなんでしょうか? 多様なバイナリならば、ヘッダ部とデータ部が分かれていると思いますが 1度処理したら次の処理許可まで、ヘッダ部を解析してデータ部は読み捨てを繰り返すしかないのですか?
>>166 ちっちゃいMac miniもPowerPCでビッグエンディアン。
1秒間に何回同期処理をするか。連投禁止処理だね。
僕のちんちんは大きくならないんでしょうか?
177 :
デフォルトの名無しさん :05/03/16 10:43:29
SNMPってポート何使ってたっけ
UDP:161,162 ていうかそんぐらいすぐ見つかるから調べれ。
179 :
デフォルトの名無しさん :05/03/16 11:05:03
>>178 ありがと
ググッたらすぐ出てきた。これ有名なプロトコルなのな。
知らなかった世。
これって、UDPだけど双方向にデータやり取りするよね。
どうやってるの? 送信してきたポートに返してるの?
162の方は片方向みたいだけど。
>>180 ありがと
RFC日本語見つからなかったからパケットキャプチャしてみた。
これって発信元ポートに返してるんだな。
なんでTCPにしなかったのかな。
ブロードキャスト?とかするから?
なおさら、RFC嫁
>>181 てか、おめぇ調べる気ねぇだろ。
やってる事がずいぶんと半端じゃねぇか?
TPSの調節なんてみんなしてないのか。 まあゲームとかチャットとかコミュニティ向けの技術だしな。
>>184 何言ってんだ?
突然、
>>172 > 多様なバイナリならば、ヘッダ部とデータ部が分かれていると思いますが
って頭おかしい人かと思ったぞ。「ならば」て
ゴミレスしかできないなら黙ってればいいのにw
でも客観的に見て何を言ってるのか理解の出来ない文章ではあるよ。
目的は何?帯域制限の話?それとも何か別の事?
そして
>>172 の書いてる俺技術についての中身が全くわからないし。
とりあえずエスパーきぼんぬに該当するなとしか思えなかったからね。
>まあゲームとかチャットとかコミュニティ向けの技術だしな。
これにはちょっと興味がわくので、他の人にもわかるように書きなおしてほしいね。
受信の帯域制限ってソフトウェアで調節できるものなの?
遅くしたけりゃいくらでも遅く作れるべ?相手に待ったをかけれるように作れば。
読み取り量を減らせばそら作れるけど 送受信バッファが溢れる〜ってことになったりせんの?
速度のまったく異なるPCが混在しているこの世の中じゃ ポイズン
>>193 バッファがページファイル化されて余計だめっぽかった。
むしろ溢れろよと。
いったいどうやったら195みたいな結論に 至ることが可能なんだ? TCP使ってるなら、受信可能なバイト数は常に ウィンドウサイズとして受信側のカーネルが 送信側のカーネルに伝えているから、読みとり を減らせば、ウィンドウが閉じて、送信側が 勝手に待ってくれる。溢れることもなけりゃ、 ページアウトされることもない。少なくとも UNIX系OSの場合、ソケットバッファに滞留して いるデータは、物理メモリに常駐しているから。 この場合、まず送信側のカーネルメモリに溜り、 SO_SNDBUF のサイズ越えて溢れそうになったら、 今度は送信を行おうとするアプリケーションが、 送信システムコールを発行するところで止められる。
197 :
デフォルトの名無しさん :05/03/17 09:04:10
前から思うんだけど、Winsockって関数自体にタイムアウト設定が出来る仕様があれば便利だよね。 connect()とかrecv()とか、指定時間たっても結果が得られなかったらfailedを返してしまうみたいなオプションがあればどれだけコードがスマートになるか・・・・ なんで実装しないんですかね?
そんなの簡単に実装できるんだから、必要なら ユーザが実装しろってことじゃなくて?
>>197 激しくガイシュツなんだが、
WinsockのI/0タイムアウトはやばいから気をつけろ。
特に2000Pro以前。詳しくはMSDN読んでくれ。
HTTPは、 503 Service Unavailableの時に Retry-After: 60 で、retry間隔を指定して、Layer 7でのcongestion control。
>>198-199 いやぁ、その処理の為にわざわざ別の関数を持ってきてコード書くんだったら
connect()とかにそういうオプションをつければ行で済むしスマートじゃないかなぁ と。
詰めて三行程度で書ける、たかが三行だけど出来上がったコードはスマートじゃないよね。
接続 と言う目的以外の処理コードがあるんだから・・・。
1つの関数の引数を複雑にするくらいなら、関数の数を増やした方が良い って考えはわかるけど
この程度の為に色々持ち出すのも・・・・。
WindowsのAPIの設計者は
>>202 と同じような考えの人が結構いますね。
引数が山のようにあって、引数で出来ることと出来ないことに対称性が全くない。
>>202 それが気になるなら、タイムアウトつきの処理を
connect_timedwait() みたいな関数として独立
させて、メインの処理からはそれを呼ぶだけに
すれば?
>>202 そんなこと言いだしたらconnectに限らず時間のかかる全ての関数に
timeout引数が欲しいってことになってくるじゃねーか
int memcpy(void *dst, const void *src, size_t len, const struct timespec *timeout);
>>204 だから、みんなが独自に connect_timedwait() を作るのは馬鹿らしい
ってことでしょ。OS に同梱されているならともかく。
>>204 に同意
単純に接続するだけの、connect関数と
その関数に対する待機は別問題とおもう。
connect なりなんなりの、ただ一つの要求だけタイムアウト 待ちしたいというのがむしろ特殊な要求で、むしろselectで 複数待つ方がふつうだから用意するまでもないんでしょ。
いつでもコネクトできるか失敗するまで待つわけでもなかろう。
UNIX Socket FAQ
6.11 Connect with timeout (or another use for select() )
Winsock Programmer's FAQ
2.14 - How can I change the timeout for a Winsock function?
URLは
>>1 で
ちなみにWinsockはタイムアウトじゃなくて非同期ソケット使うのが良いよ。
>>200 にも書いたが、タイムアウトが起きると先頭のデータ失うから。(古いWindowsで)
>>207 自分用ライブラリには標準装備した。
簡易的なクライアントソフトってセッション1つで
十分だからselectは接続後にしか使わない
そんな感じ
各自がバラバラに実装するのが馬鹿らしいからこそ、そういう ライブラリを公開して広く使ってもらえるようにすればいいのに。 Windowsユーザって、なんでそういう発想ないの?
それは、すべてMSの仕事ってわけでもないだろう。 ライブラリライブラリっていうが、 もともと使いにくいと言って出てきた関数は言うなればAPIみたいなもんだろ。 それらを組み合わせ使いやすいように拡張するのがライブラリなのであって、 そのライブラリはMS製だろうが、オープンソース物だろうが関係ないんでは? Windowsユーザーだなんだって話じゃなく、便利なライブラリがほしいだけ、 そのライブラリ作成者になろうとすら思わない、お前に一つも問題はないっていうのか?
非Windowsユーザではなかろう
>>214 が(サブとしては持ってる?)
何で
>>215 のためにライブラリを作るの?
非Windowsユーザであろうだな なくなくない?みたいな間違いをしてしまった
え、俺メインはLinuxなんだけど・・。いらないよWinsockのラッパライブラリなんて。
あ、
>>214 が言ってるのは、MSがなぜ用意しないのかってのじゃなくて、
ライブラリ作成者が便利なものつくったのなら、なぜ皆に公開してあげないの?
って言いたいのね、読み違えまくった・・・吊ってくる orz
Windows系の開発者さんたちは、確かにそういう傾向の人多いかもしれないね。
確かに作ってもバイナリ配布が多いな。配布条件も厳しい。
1クライアントにソケットを2つ使うべきか、ひとつで頑張るかで迷ってる。 直感でいいから、きゅぴーんと来たほうを言ってくれ。頼む。
いやFTPでいうところのPassiveモードだけど、それが何か?
まあ、その場合だと、普通は二つだな。
Broken pipeってどうやって解決したらいいと思う? FreeBSDの鯖にWinの倉でコネクトした後色々通信してクローズするとそうなります
Broken Pipe が起きるってことは、こちらの返事を相手が 全部読まないうちに、相手側がコネクションを切断してし まったってこと。正常に通信してても頻繁に起きるような ら、どちらかがプロトコル処理を間違えてる可能性がある。 FreeBSD 側に関しては、ネットワークトラブルでそういう ことが起きることはあるし、クライアント側が勝手にこけ てもそういうことは起きるので、サーバ側としては正しく 動作を継続するために、signal(SIGPIPE, SIG_IGN) として おく。こうすると SIGPIPE が飛んでくるんではなく、 write(2) や close(2) が EPIPE を返すようになるから、 エラーコードをきっちり見て、きれいに後始末すること。 クライアント側でもネットワークトラブルでそういうこと が起きることがあるのは同じだけど、この場合、むしろ サーバー側のプログラムミスの可能性の方が高いかもね。 って Winsock って、Broken pipe の場合どういう反応を するんだっけか?
例えば、CLOSE_WAIT中にRSTが来た時、 送ろうと思ったけど、何らかの理由で送れなかった時。
ソケット閉じる前に一回リード処理したらBroken pipe出なくなりました その他色々参考になりました。ありがとうです
>>224 よっしゃ、2つでがんばるよ。
最大で5つくらいまで必要かも知れんけど。
>>226 > Broken Pipe が起きるってことは、こちらの返事を相手が
> 全部読まないうちに、相手側がコネクションを切断してし
> まったってこと。正常に通信してても頻繁に起きるような
> ら、どちらかがプロトコル処理を間違えてる可能性がある。
これ逆だよね。
>>229 half-closeだったってことだね。
>>230 その場合は5つだよ。俺も経験から言って間違いない。
>>231 逆? 合ってると思うけど…
それに half-close とは限らないよ。
1. クライアント側が shutdown(, SHUT_WR) で half-closeする。
2. サーバー側がクライアントになにか書く
3. クライアント側がその内容を読み込む
4. クライアント側が完全に close する。
5. サーバー側がクライアントになにか書く
とすると、5で初めて Broken Pipe になる。
つまり、half-close とは関係なく起きる。
234 :
おしえて君 :2005/03/22(火) 18:38:08
int型の二次元配列を送受信するUDPクライアント&サーバを 作りたいんだけど、なんかこれって簡単に実現できないのかな?? String型をbyte型配列に変換して送受信するようなサンプルはよくあるんだけど、 int型の二次元配列の場合、同じようなやり方だとできないよね?? なんか解決策ないでしょうか。
よりにもよってUDPですか。
236 :
& ◆hJb7GWrzxo :2005/03/22(火) 18:58:40
UDPってことには とくに深いこだわりも意味もないんだけど、UDPって何か問題ありなの?? あと補足なんだけど byte型配列にいれないと、ネット送受信できないって理解は正しいのかな?? int型二次元配列をbyte型の一次元配列に入れて、 そしてbyte型一次元配列からint型二次元配列を取り出すうまいアイデアが あればいいのかなあとか思うんだけどこのアプローチはあってる??
クソして寝たまえ。
238 :
234&236 :2005/03/22(火) 19:23:58
大事なことを言い忘れていた。 言語はJAVAです。アドバイスよろ
だろうとおもった。
>>234 みんな教えてもらえなかったかわいそうな君へ。
■ UDPがどうしても必要なとこ以外はTCPを使え
■ その程度の質問してる奴にUDPが必須なアプリは作れない
■ TCPでパケットがくっついちゃうんですけどって質問はするな
242 :
234&236 :2005/03/22(火) 21:10:00
受信したDatagramPacketをpacketとすると それをString型にもどすには String data = new String(packet.getData(),0,packet.getLength()); となると思うんだけど、 これがint型の二次元配列の場合はどうすりゃいいのかさっぱり分からん。 packet.getData()がbyte型の配列を返すのかと思って、 packe.getData()[i]でiをインクリメントして表示させてみたりしたけどだめですたし。 どうしろってんだYO!!
いまは、というか、古典的プロトコルは文字列化が大好きなので、 intの二次元配列を文字列にして、文字列を送信して、文字列を受信して、 intの二次元配列に復元しなさい。区切りに\nとか\tとか,でも挟んどけ
244 :
デフォルトの名無しさん :2005/03/22(火) 21:44:10
エックスエムエルにすると便利ですよ
UDPって何か問題ありなの??
>>245 特にUDPが必要な場面じゃないなら、
余計な苦労はしない方がいいでしょ。
会社のある案件で動いているプロキシあるのですが、このプロキシ 入り(クライアントが接続する部分)が socket、 出(接続先へのアクセス)が XTI というソースになってます。 このようなケースは良くあることなのでしょうか? 両方 socket で良いように思うのですが、あえてこのようにする意図が分かりません。 意味は有るのでしょうか?別に意味は無いのでしょうか? どなたか、この意図を解説していただけないでしょうか?よろしくお願いします。 # ちなみに、今このプログラムの設計者は社内に在籍していませんです。
>>247 実は片方は IP だけど、片方は IP じゃないとか?
さもなくば意味ない希ガス。
socket 使った方が便利な機能と、XTI にしかない機能が微妙に
あるので、それらに依存している場合は使い分ける意味がない
わけでもないが、そういうのは非常にマイナーな機能なので、
普通は要らない。
XTI使ってるとこって存在するんだな リチャード・スティーブンス本の中でのファンタジーだと思ってた
そいえば昔のMacOSのネットワークはXTIベース。
251 :
234&236 :2005/03/23(水) 10:48:05
>>243 バイト配列は DataOutputStream と ByteArrayOutputStream を組み合わせて作り、受け取る側は ByteArrayInputStream と DataInputStream を利用して int 配列に戻す
という方法って、どうなの?どうやればうまくいく?
1次元にすればいいじゃない♪
つーかネットワークプログラミングと関係ない
255 :
234&236 :2005/03/23(水) 11:07:54
256 :
http://www.geocities.com/tokyufubai/ :2005/03/23(水) 11:33:36
メモリ使用率は、値が大きくても使用状況が最適化されていれば 特に問題はありません。具体的言えば、メモリ使用率が90%であっても その値が常に一定しているのであれば、リソースの競合も 発生していないと言えます。
javaを使ってIDというか会員制みたいなHPを作りたいんだけど・・ヤフー、Googleとかが IDとパスワードいれたらログインできたりするプログラムなんですが、プログラム辞典なんかで 調べたんだけど載ってないし・・・だれかわかる人いますか?
クソして寝たまえ。
>>257 規模と予算を書いてソフト会社へ問い合わせたまえ
>>257 生データをそのまま送るなら、別にこのスレに来なくても良いだろ。
>>257 何で誰も言わないんだ。「ス・レ・違・い」だと。
262 :
247 :2005/03/23(水) 21:55:48
>>248 なるほど、ありがとうです。
両方 TCP です。
今日 再度ソース見ましたが、XTI の部分で特に変わった部分は何も無いようでした。
特に意味無しと思っときます。
# 当時の設計者が XTI を使ったのは単なる気まぐれか... 気になるなぁ (-_-?
>>262 もしソレが 10〜15年くらい前の官庁関連の仕事なら、
OSI参照モデルに沿ったプロトコルスタックが採用されるという話などもあったので
その辺への対応を想定して片側にXTI を使っていてもおかしくはないと思います。
都庁の初代ネットワークなんかがそんなんだったような気がする。
264 :
262 :2005/03/24(木) 01:28:39
>>263 この案件自体は割と最近(ここ5年以内)の物です。
ですが、ソースの方はもっと古いらしく、遡ると某大手電器メーカから買った物が元になってるらしい、との話も聞きました(保身モード)。
もしそうだとすると、その説明が元ソースに対して当てはまる可能性も十分有り得そうに思えます。
というか、そう考えると結構納得出来ますね。ありがとうございます。
# 島のボスもその頃現役のはずだから、ひょっとするとその辺りの昔話が聞けるかも
最近のYahooやGoogleは擬人化されてるんだね
WinSock勉強してるんですけど WinSock2.0プログラミングに Win2000なら重複IOで完了ルーチンより完了ポート使った方がいいとかあったんですけど そんなに違うものなんですか
268 :
& ◆hJb7GWrzxo :2005/03/24(木) 14:35:29
269 :
& ◆QWv3R1XL8M :2005/03/24(木) 15:03:34
↑どうやら凡ミスでした。変数名が本当はin2なのにinになってるところが ありました。 で、一応期待通りに動くようになったっぽいんですが、 やはりBindExceptionはでてしまいます。これは何故でしょうか。 どちらもlocalhostに送受信しているからでしょうか? 別のコンピュータ同士で実験する場合、このエラーはでなくなるのでしょうか。 おしえてください
>>268 大くの実装では、同じポート番号で受信するためのUDPソケットはlocal側の
IPアドレス毎に1つだけしか作れない。
(これがマルチキャストでも同様なんだから困ったもの・・・)
何か調停役のレイヤー(このレイヤーが作成管理する単一のソケットで全て受信し、
その後要求元それぞれに分配)を作るか、同時に動くコード同士でポート番号を変えるか
するしかない。
>二つのコードをそれぞれちょっとズレたポート番号に変えたりしてみたんですが
>やっぱり無理みたいです・・・。
これが無理ってことは無いと思う。コード見てないけど。
271 :
& ◆QWv3R1XL8M :2005/03/24(木) 15:56:52
>>270 調停役のレイヤーなんてどうやって作るの
>>271 C++ / Windows なら Outproc COM オブジェクトを作るのが最も簡単だと思う。
C# なら .NET Remoting でやるか、あるいはごく簡単に UDP から recv しつつ
接続してきた(複数の)クライアントに受信内容をコピーして渡すEXEを起動作って、
それを用いるとか。
273 :
& ◆QWv3R1XL8M :2005/03/24(木) 16:40:38
>>272 どうやら僕には高度すぎて分からないことのようだ。
時間があるならもっと詳しくおしえてください
例えば同じコードでマスタ・スレーブと動作を分けたこういう実装をすることもできる。 受信用のUDPをポート5555で作成 ・作成に失敗⇒スレーブとして動作 ⇒既に別インスタンスが動いているとして、適当なポートで受信用UDPソケットを作る ⇒そのソケットから5555に分配要求を送ってみる ⇒返事が来たらOK。そのポートで受信を続ける。 ・作成に成功⇒マスタとして動作 ⇒そのソケットで分配要求を受信したら、転送先リストに送り元のアドレス:ポートを追加 ⇒その他のデータグラムを受信したら、受信データを処理。 ついでに転送先リストにあるスレーブにも送っておいてあげる。 終了したスレーブへ転送しないようにするには、例えば転送先リストを揮発性(古いエントリは消える)に しておいて、スレーブは一定間隔で分配要求を送るとかする。切断要求で消す式だと切断要求がlost したときへの対応が面倒だから。 まだスレーブがいるのに、マスタ側が終了したいときの処理は面倒。ちょっとパケットを受信し損ねても いいなら、スレーブのどれかをマスタに昇格させるような処理を行えばよい。 できるだけパケットを失いたくないなら、マスタは終了せずにUIだけ消して受信転送処理は続ける。
>>274 のマスタ側だけを取り出して、
>>272 のようにしても良い。
あとこういう実装だと自分が送ったものも受信してしまうので、パケットに載せる
ペイロードの中身に識別子などつけて適当に区別できるようにしたおく必要も
あるかもしれない。
276 :
おしえて厨 :2005/03/24(木) 20:31:42
>>276 うるせえな
1から基本を身に付けてこい
278 :
& ◆hJb7GWrzxo :2005/03/24(木) 21:12:37
>>278 うるせえな
1から基本を身に付けてこい
>>280 その程度ならソフト作成依頼スレにでも書けば?
言語問わずなら5分もあれば十分に作れる
俺は作らんけどな
282 :
& ◆QWv3R1XL8M :2005/03/24(木) 21:41:23
>>277 socketをクローズしてないから問題なんだな?
おいそれぐらいおしえてくれよ
.NETなら恐ろしく簡単にできたはず。
285 :
280 :2005/03/24(木) 21:52:06
WSHで実現可能でしょうか?
WINDOWS上で動いて、notepadなどで作成できるものがいいのですが。
>>281 URL教えてください。
287 :
280 :2005/03/24(木) 22:11:46
>>286 お手数かけました。ありがとうございます。いってみます。
288 :
おしえて厨 :2005/03/24(木) 22:49:53
>>284 おいsocket.close()したらBindExceptionでなくなったぞ。
でも100回ループする完了する前に途中でフリーズする。
なぜだ。
何回目でストップするかはランダム
289 :
デフォルトの名無しさん :2005/03/25(金) 01:12:41
recvfrom()ってナル文字まで受信するみたいですけど。 これは、指定したポインタにnull文字を含む文字列を入れるのでしょうか? それとも、null文字までを入れて、null文字は含まないのでしょうか? どうも、フフフフフが発生してまして・・・。
>>289 > ナル文字まで受信するみたい
みたいってなんだよ
ネットワークプログラミングじゃなくて、 初歩のプログラミングの方を勉強した方がいいような奴が 一気に湧いてきたな。春のせい?
フフフフフ
ウフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
>>289 recv、recvfromはnull文字かどうかなんて判定しない
それに受信はバイナリだからnull文字=’\0‘=0x00(普通なら)ということ
受信したサイズは戻り値を確認しる
フフフフフフフはVCがデバックの時
初期化されてないメモリを埋める時に使ってる
いつも思うことだけど、日本のこの業界は本格的にダメだな。
猫だとわかるネットワークプログラミングってサイトがないからだよ
すべてBSDがクソなせい
むしろ Windows のインスタント至上主義のせいだと思うな。
何十年前のOSのシステムコールなんかが生き残ってる方が問題。
kqueueとかepollとかじゃないかぎり全部Javaにすりゃいいよ
UNIXは無計画にクソに接ぎ木してさらにクソ度を高める事を繰り返したクソOSだからな。 そろそろ洗い流してすっきり忘れるべきだ。
>>301 例えばどんなだったら良い感じか、代案キボン。
あくまで例えばで。
//bindとかetc.. SETSOCK(&clsock, onaccept, onread, onclose) addsock(&svsock,&clsock); //あとはコールバック
MFCでもつかっとけ。
305 :
& ◆hJb7GWrzxo :2005/03/25(金) 11:20:39
>>288 288で起きている問題はある種のデッドロックでしょうか。
それとも別の問題が原因だけど見かけ上そうみえるだけなんでしょうか。
306 :
おしえて厨 :2005/03/25(金) 14:27:55
100回全部届くとは限らんのです。それがUDPクオリティ。
308 :
デフォルトの名無しさん :2005/03/25(金) 14:35:31
UDPは到達保証がない。LAN内であっても落ちる。 同一PCならなおさら落ちてもおかしくない。
DNS以外にUDPでおなじみの鯖ってある?
RIP とか SNMP とか TFTP とか
snmp, ntp, bootp(dhcp), ping, syslog
ping は ICMP。
314 :
& ◆hJb7GWrzxo :2005/03/25(金) 15:18:31
UDPの場合はバイト配列におしこめなきゃいけないってことだったが、 TCPの場合はバイト配列じゃなくても送受信できるんかね? int型の二次元配列をバイト配列に変換するようなことしなくても送れますか
>>314 これはバイト配列じゃない!って認めなければできるんじゃない?
>>314 sendmsg/recvmsg(またはwritev/readv)のことか?
317 :
& ◆QWv3R1XL8M :2005/03/25(金) 15:52:18
TCPでint型の二次元配列を相手に送信するとしたらどういう関数を使いますか (java&windows XPの環境で)
bb.put(n.length); bb.put(n[0].length); for ( //略
319 :
デフォルトの名無しさん :2005/03/25(金) 16:22:45
ログに出てたタイムアウト付きの関数って、 #define _recvfrom(a,b,c,d) int clen=sizeof(c); recvfrom(a, b, sizeof(b), 0, c, &clen) #define time_init(a,b,c,d) fd_set fs; timeval tv; FD_ZERO(&fs); FD_SET(a, &fs) #define time_recvfrom(a,b,c,d) time_init(a,b,c,d); tv.tv_sec=d; if(0>select(NULL, &fs, NULL, NULL, &tv)){return -1;}; _recvfrom(a,b,c,d) /* time_recvfrom(SOCKET s, char FAR *buf, struct sockaddr FAR *from, int timeout) */ こんな感じので良いの?
>>319 くぁwせdrftgyふじこlp;@:
汚すぎ
無理して#define使わんで関数使えよ馬鹿
>>319 式にならないマクロは大文字で書いた方が良いと思うけど。
do {〜}while(0)使うとか。
さらに言うと、 recvfrom() の返り値はチェックしてないし、 select() が EINTR を返した場合のケアもないし、 _で始まる名前はシステム側に予約されているから、 アプリケーションが勝手に使うのは規約違反だし。 なぜたかが3行のプログラムで、これだけ(ry
>select() が EINTR を返した場合のケアもないし
これ書いてない本多いね。
『Winsock2.0プログラミング』(ソフトバンク)
には
selectの戻り値の説明に
>指定の条件を満たす記述子の総数、0(timeoutパラメータ値が満了した場合)、またはSOCKET_ERROR。
と書かれてる。
そのまま鵜呑みにすると、
>>319 のように0>の判定だけで済まそうとする人続出の悪寒
最近は入門書が、わかってない人が書いてるのが困り物。
>>323 自分用に作られたラッパーなんてこんなもんでしょ。
汎用性を重視するならともかく、限られた状況であれば、戻り値も想定の範囲内だけで十分。
そうやって馬鹿を量産するつもりか
>>323 おいおい、お前も突っ込みどころ満載だな
プログラム板の鉄則は、3行以上の長文を書くと殆どの確立で穴を掘り突っ込まれる。
限定的な使い方しかできないなら、 システムコールや標準ライブラリに入れろつーのはおかしな話だ。
っていうか汎用性の無いコードならチラシの裏に書いとけ
>>324 わかってないのはおまえ。
もはやWSAEINTRが上がる事なんてない。
>>331 >>324 が例示している「Winsock 2.0」ならその通りだよね・・・
Unixの類ではsignal受けたときなどにEINTRが帰るのかな。
>>332 UNIX上では、signal処理の設定の状況によってはEINTRが返る。
SIG_IGNやSA_RESTARTを指定してた場合には返らないけど。
UNIXといっても、しっかりとした商用UNIXなら、の話だけどね。
>>334 嘘つけ。いまどきEINTRが返らないUNIX系OSなんてないよ。
あるなら例を挙げてみろ。
最近の Linux だと、
>>319 の recvfrom() でブロックする可能性
がある (ブロックさせないためには、socket の non-blocking
モードにして、errno == EAGAIN をチェックする必要がある) って
話が、akr さんの日記に出てたね。
>>328 >プログラム板の鉄則は、3行以上の長文を書くと殆どの確立で穴を掘り突っ込まれる。
今さらながら、このたった1行の日本語にもつっこみどころがある件について。
なんだこの粘着厨は
こだわり職人だろ(w
どっちもどっちだな
selectってなんか無駄が多い気がしてきた。 Winでもkqueue試してみたいよ・・・
お前には無駄
WINには、非同期ソケットにオーバーラップI/O、EventSelect、 NTならIO完了ポートがあるじゃあないか。
試してみるべ
347 :
デフォルトの名無しさん :2005/03/26(土) 13:42:08
ノンブロッキングについて教えて下さい。 現在selectの直後にrecvをループで回す関数を用意して、 指定バイト数分のデータを受信するような作りにしています。 この場合ブロッキングにしてると、 recvしている関数から抜けられなくなってしまいそうなので、 ノンブロッキングにすることにしました。 (最初の数バイトはソケットに届いたが、 それ以降のデータが届かなかった場合などを懸念しています) ノンブロッキングにした場合はEWOULDBLOCKの判定をしなければいけないと思いますが、 EWOULDBLOCKなら無条件にrecvをリトライするような作りにしてしまうと、 ブロッキングの時と同じくrecvしてる関数から抜けられなくなってしまいますよね。 そこで一定回数リトライしてもEWOULDBLOCKが返ってくる場合は エラーにするという処理にしようと思うのですが、 考え方としてあってますでしょうか? いろいろ調べてみたのですが、具体的な方法が書いてあるところが見つからなくて。 EWOULDBLOCKとはどういう状態なのかとか、 ノンブロッキングの時にはEWOULDBLOCKを考慮する必要があるとかが 書いてあるところは腐るほど見つかったんですが。
348 :
347 :2005/03/26(土) 13:43:16
すいません。sage忘れました。
いや、質問はsageるな。
>>347 対象のソケットをselect()して読める時だけrecv()する。
351 :
347 :2005/03/26(土) 15:26:53
>>350 なるほど。
毎回recvの前にselectしてデータの到着を確認しておけば、
recvではまることはなくなりますね。
ん??そうするとわざわざノンブロッキングにしないでも
ブロッキングのままでOKということですよね?
ノンブロッキングがなんのためにあるのかがわからなくなってきた・・・
select()したあと、読みたいだけ読めるか、 EWOULDBLOCKが返るか、失敗するまでrecv()しまくればいいだろ。
書き込み可能と読み込み可能を 一度にひとつのselect文でやろうとすると
Winsockならこれで問題ないの? inline int time_recvfrom(SOCKET s, char FAR * buf, struct sockaddr FAR * from, int timeout) { fd_set fs; timeval tv; FD_ZERO(&fs); FD_SET(s, &fs); tv.tv_sec=timeout; if(0>select(NULL, &fs, NULL, NULL, &tv)){ return -1; } int clen=sizeof(from); return (recvfrom(s, buf, sizeof(buf), 0, from, &clen) ); }
しっこして寝たまえ。
>>354 良いと思う。
っていうか、全く同じコードが某入門書に書いてるなw
良くねえだろ。 select() の最初の引数はホントは int だし。(たまたま平気としても) sizeof(form) も sizeof(buf) も 4 にしかならねーぞ。
form じゃなくて from ね...orz
select()の1つめの引数は、無視される だから問題ないかと 無理だったら、それは無視されてるわけじゃないわけだから、Winsockの規格違い
int のところに NULL はないだろうという話。 Winsock でも void* とかではなくて int だよ。無視されるとしてもね。
ごめん、俺もいつもNULL突っ込んでた。 っていうか、何入れれば良いんだ? 他に手ごろなのが思いつかん。
362 :
デフォルトの名無しさん :2005/03/26(土) 17:56:50
0でいいんじゃないか?
nullpo
364 :
デフォルトの名無しさん :2005/03/26(土) 18:01:18
小規模板へいそげ! 陸、○、空オンラインっていうゲーム おもしろそうだ! プログラマ募集してるんだって
365 :
デフォルトの名無しさん :2005/03/26(土) 18:02:45
小規模板へいそげ! 陸、○、空オンラインっていうゲーム おもしろそうだ! プログラマ募集してるんだって
この宣伝ちょくちょく見かけるな 如何にも何も作れなさそうな主催と そのウォッチャーのスレだった
>>354 どうしてもサイズ指定を省略したいってなら、#defineでかいたら?
関数にすると、sizeof()は4しか返さないぞ。
368 :
354 :2005/03/26(土) 18:39:06
あれ?inline使ったら置き換えになるから大丈夫だと思ってた スマソ
藻前はネットワーク以前にCなりC++なりをちゃんと使えるようになりたまへ。
>>368 おいおい…
inlineと#defineを一緒にするなよ
>>369 inlineはC++からだから、恐らくCしかやった事無いのにちょっと頑張ってみました ってタイプと俺は見たw
>>366 それどころか、主催の奴のサイトからリンクたどっていったら、
他のMMOを作ろうコミュニティからはじき出された鼻つまみ者だったよ。
質問ですが WSAEventSelect を使うと、WSAEventSelect のパラメータに かかわらず、すべての関数が非ブロッキングになるのでしょうか? 例えば、connect だけブロックするという使い方は出来ないのでしょうか?
376 :
& ◆D3ra0B2LiQ :2005/03/28(月) 12:09:30
またお前か readLineはバイト配列を改行コード又は\0まで読み込んで 末尾に\0に据えて文字列として一行分取得するメソッドだ。 String以外のデータもじゃなくて、Stringもバイト配列でやってんだよカス
>>376 Javaの仕様上の疑問は、”殆ど”の物がSDK添付のソースコードを参照することで解決する。
疑問に思ったら、人がああやってるのはどうして?の前にソース読む位の気合持てよ。
&は出没当初から今までやたらバイト配列を目の敵にしてるな
380 :
デフォルトの名無しさん :2005/03/28(月) 12:59:04
質問です。 アライメントに気をつけ、きちんと4バイトで割り切れる構造体を作ったとして それをsend()で送った場合、正常に送信先に整列されたまま届かない可能性ってありますか? その場合、どのような原因が考えられるのでしょうか? よろしくお願いします。
ネットワークで起こりえないことは存在しないんじゃね? ただ、その確率が低いだけで
>>380 電線の中を信号が通るときは4バイト単位もくそもないから
それを実現するのはアプリケーション層で
もしあれならきちんと受信するよう管理するラッパーを
つくつくつくればいいんじゃない?
あぷろーだーで、Java Servletレベルで帯域制限って 可能なのでしょうか? httpdはApache2です。
385 :
383 :2005/03/28(月) 17:51:45
wsock32.dll からエクスポートされている関数で序数が1000以上のもの(例えばdn_expand等)は winsock.hに含まれていないものが多いのですが、何のためにあるのでしょうか?
387 :
おしえて厨 :2005/03/29(火) 13:01:00
コピペしたんだかなんだか知らんけど、 インデントもそろってなくて自分でデバッグも出来ない様な、 きたねぇソース書くな。 クライアントコード側の37行目と39行目がヒントだ。 あとは自分でどうにかしろ。ヒント通りにデバッグすりゃ動く。こっちで確認した。 こんなのネットワークプログラミングの質問じゃねぇぞ。 いいかげんにしろ。糞ガキ。
389 :
& ◆hJb7GWrzxo :2005/03/29(火) 14:09:56
readとwriteの順番を逆にすれば動きますた。 thx。
バイト配列を愛さない奴は無視
ブロッキングソケットと非ブロッキングソケットを 切り替えながら使うってのはOKでしょうか? 何か問題あるのでしょうか?
全然問題ないよ。 ブロックするしないにしか関係しないから。
>>394 そうですか、ありがとうございます。
心配しているのは、タイミングによって
通知(イベント)が受けられない事はないか?です。
このような使い方をしている人はいるのでしょうか?
>>395 プログラマをはじめて幾年月立つが、そんな使い方は初めて聞く
ソケットの使い方ってどうせ数えるぐらいのパターンしかないだろうから、 はじめからそういうフレームワーク用意して欲しいね。
おまえがつくれ。
オレ専用フレームワーク、略してオレフレ だったらいくつか用意してある。
フレームワークなんか無くなって性能は100%発揮できます 偉い人には分からんのです
なんのひねりもなく面白くない
フレームワークとはいつでも会えるから
いま winsock を生でいじってサーバーを作ってるんですが、うまくいきません。 サーバー側は WSAAsyncSelect で FD_ACCEPT を登録して、 クライアント側は同期で connect しています。 ローカルでのテストではうまく FD_ACCEPT が呼ばれるのですが、 自分のポートを開いて、グローバルテストをしたときに なぜか FD_ACCEPT が呼ばれるまでの間に遅延があります。 クライアント側の connect は瞬時に終わっているので、接続は確立していると思うのですが。 グローバルで動かした場合にこのような事態にあることってあるんでしょうか?
>>403 > 自分のポートを開いて、グローバルテストをしたときに
ってなんやねん?
ポートを開いて(たとえば3000)、自分のグローバル IP (たとえば 100.100.100.100)を取得して、それに接続するということです。 この場合なら 100.100.100.100:3000 に接続。
それはローカルのテストなんじゃないの?
えっと、要するにローカルからローカルに接続するんですはなくて、WAN にして接続するということです。 さきほど、なんかいか同じことを繰り返していたら、うまくいきました。 しかし、すこし時間がたつと同様の現象になってしまいました。 もしかしたらプロバイダー側の制限なのかもしれません(DIONです)。 ポート番号を変えていろいろと試してみます。
おそらくルーターを使っているのだと思うけど、ローカルからグローバルに接続するのは無理じゃなかったっけ? 可能な場合ってルーターが誤魔化しているだけで実際はWANにデータは出てないと思った。
>>407 何言ってんだかよくわかんないんだけど、
> えっと、要するにローカルからローカルに接続するんですはなくて、
これはループバックアドレス(127.0.0.1)、あるいは、
自分のインターフェースに付けられたアドレスを接続先アドレスに、
> WAN にして接続するということです。
は、自分のインターフェースに付けられたアドレスじゃなくて、
ルータの外側に付けられたアドレス(つまりNAT環境)を接続先アドレスにしてるって事?
燃しそうなら正直ルータ次第だな。
>>3 のwindumpでパケットキャプチャしてみてちょ。
>は、自分のインターフェースに付けられたアドレスじゃなくて、 >ルータの外側に付けられたアドレス(つまりNAT環境)を接続先アドレスにしてるって事? そうです。 ポートを 21 (FTPと誤解させるため)にしてみたら、うまくいきました。 なにやらプロバイダの制限くさいです。 みなさんどうもありがとうございました。
411 :
デフォルトの名無しさん :2005/04/06(水) 00:11:10
listen してるポートを何らかの方法で外部から落とす方法ってありますか? 提供したプログラムのlistenポートが落ちてクライアントが接続できなくなる事があって困ってます。 テスト環境を作りたくて考えてますが思いつきません。 OSはMSが出してるWindows2000ってヤシです。
クライアント側のクローズに問題があって listenキューの数を越えてるって事は無いの?
413 :
デフォルトの名無しさん :2005/04/06(水) 00:26:03
>>412 netstat -an | grep <portnum> とすると LISTENING がありません。
キューの限界超えると、そうなりますか?その辺は勉強不足です。
すんません。
>>411 制御用のポート別に立てておけばいいだろ
>>413 うん。接続待ち状態でブロックか、タイムアウトで接続できないか。
ちなみに、そのアプリの正規の切断手順では
1. クライアント側から切断
2. サーバー側から切断
3. 状況に応じてどちらからかは分からない。
416 :
415 :2005/04/06(水) 00:46:49
途中で切れたorz
切断手順は1〜3のどれかな?
>>414 切断時のTIME_WAITかなんかで、ソケットが残ってる状態で
接続を繰り返すような作りになってた場合、コントロールポート用意しても
おなじ事になる恐れがあると思う。
>>415 正規の切断手段はクライアントからの切断ですが、アプリレベルのシーケンス異常が
起こった場合はどちらからでも切る恐れがあります。
ちなみに、切れたときの状況はつかめて無いのですが、繋がらないと連絡を受けてか
ら netstat -an の状態を見ると、そのポート宛では LISTENING も TIME_WAIT も
とにかくそのポートに関係あるものは何も残ってません。
listen のキューがあふれたときサーバの listen ポートが閉じられるのであれば、
TIME_WAIT を沢山作ったり接続を山ほど行ったりすれば現象が再現するのでしょうか?
同じライブラリ(自作)を使って、今まで遭遇した事の無い現象なので、途方に暮れ
てます。
>>417 >>うん。接続待ち状態でブロックか、タイムアウトで接続できないか。
ごめん。コレ間違い。
キューが一杯の場合
クライアント側にECONNREFUSED(10061)が返って、エラーで接続できない。
クライアント側のエラー値で確認してみたらどうかな?
>>TIME_WAIT を沢山作ったり接続を山ほど行ったりすれば現象が再現するのでしょうか?
listen()に指定したキュー数を超えた接続をすれば、上記の状態になる。
>>418 ですよね。。。キューを超えても拒否られるだけでlistenポートは閉じませんよねぇ。
だめだ。。。お手上げ・・・|||| _| ̄|○ ||||
せめて現象を再現出来れば手の施しようもあるんだけど・・・
気になるのが、ウィルスバスターなんかについてる、ポート閉じる機能。あれが動いたら
listenしてるポート閉じるとか、そんな現象聞いたことありませんか?そのパソコンにも
VBコーポレートエディションとかいうヤシ入ってるらしくて・・・
それなら頑張ってPCとソフト揃えれば出来るかも。
今、テスト出来る環境が無いので調査出来ないんですが・・・
ZoneAlarm で似たようなことしてみようと思ったけど、昔と感じが変わってて、戸惑った
あげく、出来なかった・・・漏れ、餓鬼・・・・|||| _ト ̄|○ ||||
単にサーバ側がバグってて異常終了してるって落ちじゃないの? てゆうか、サーバ側を直接デバッグってできんの?
snifferについてどうにも上手くいかず困っているのですが、 ヒント等頂けないでしょうか? 内容ですが、win2k&C#で SocketのRAW・RCVALLを使ってglobal/privateIPは スニファ出来たんですが[127.0.0.1]のIPを指定した場合、IOControlで SocketException例外落ちで上手く動いてくれないんです。 検索してみたんですが参考にしたソースと同じコードだったり、他のソフトとかも IP指定方法がアダプタやソフト側で取得したIPから選択などloopback側を 見れるソフトも方法もみつかりませんでした。。。 C/C++/C#/VBでも何でもいいのでなんらかしらの情報/情報先を 教えてもらえないでしょうか。。。 どうかよろしくお願いします。
>>411 俺には何がいいたいんだかさっぱりなんだが、
みんなよくわかるな。誰か翻訳して。
>>420 サーバ側のプロセスは終了してません。これは保証できます。
プロセスは終わってないけど、listen が異常終了している恐れはあります。
でも、なぜそのような現象が起こるかが知りたいのです。
同じモジュールを使用していて今までそのような現象に遭遇したことが無いので、
ローカル環境でデバックしたいと思ってます。そのために現象をローカル環境で
再現したいと思ってます。
それと、残念ながら、現地のサーバは手軽に触れるところには無いのです_| ̄|○
>>423 > listen が異常終了している恐れはあります。
調べろ!この糞が!
> それと、残念ながら、現地のサーバは手軽に触れるところには無いのです_| ̄|○
言い訳はいいから。
ただのバグってことか。
>>424 う〜ん。。。異常終了してるかどうかはこの際関係なくて、異常終了させることが
出来るかどうかをしりたいんですね。ってか、そういう事が起こること自体不思議
で、どんな条件があればそうなるのか知ってる人がいれば、と思ったんですが。
ここの住人は賢い人が多そうなので・・・
それと、言い訳ではなく、手軽に触れられないから、同じ状態をローカルで構築し
たいんですね。それで現象を再現できて、その対策を講じることが出来れば、それ
で良し、です。
>>425 かもしれません。し、そうじゃないかもしれないです。
少なくとも listen ポートが落ちた後再立ち上げ処理を入れてないのはバグです。
それは直します。が、再立ち上げ処理を入れたところで、何かの問題で立ち上がら
ない状態になるかもしれません。その状態が再現できればテストがローカルで出来、
先方に説明も出来そうです。
が、そろそろ S/N 比が落ちる頃なんでしょうかね。
ここでの情報収集は限界かな?
サーバにデバッグ環境突っ込んで常に監視出来れば手っ取り早いんですけどね。
そういう環境でしか開発したことが無い人が羨ましいわ(w
>>426 オマエは事務員にでもなったほうがいい。
>>426 listen()を落とす方法を知りたがる気持ちは分からなくも無いけど、
ここで、君が知らなければならないことはそう言うことではないはず。
今まで問題が無かったモジュールを使っていて初の現象とも言っているが、
今まで運が良かったと言う可能性は0ではないだろうし。
どうも、話を聞いている分には、サーバーは自社開発じゃなくて以前から導入済み、
クライアントは自社開発って事なんだと思うけど、
(サーバーも自社開発なら、ローカルでの環境構築は通信部分に限ればは苦ではないはず。)
客側からの情報で、最低限どの程度の時刻に落ちるのか等の情報は、得てるでしょ。
そうすれば、その時間帯に起こるトランザクションも見えてくるんじゃないかな。
(客によっては、トランザクションのサンプルも取らせてくれるだろう。)
まず、エラーの再現ではなく状況の再現が先なんじゃないかなぁ。
デバッグするにしても手順と考え方がちとずれてるような気がする。
>>サーバにデバッグ環境突っ込んで常に監視出来れば手っ取り早いんですけどね。
>>そういう環境でしか開発したことが無い人が羨ましいわ(w
君のような環境でデバッグするなんて事はいくらでもやったが、
順を追っていって解決できなかった案件は今の所ないけどなぁ。
>>427 了解。事務員になってオマエをクビにします。
>>426 再現させようにも、お前は状況すら把握してないだろ。氏ね!
>>428 丁寧な説明ありがとー。
サーバもクライアントも自作です。
私も今まで順を追って作業して解決しなかった事は無いです。
今回は「なぜ、それが起こるのか」「どう解決したのか」を客先に報告する必要が
あります。そのため、「なぜ、それが起こるのか」を突き止めたいのです。
そのために状況の再現をしたいのですが、ローカルではいくら同じような環境にし
ても現象が発生しないのです。
唯一の手がかりが「何らかのタイミングで listen ポートが閉じられている」と
いう事実のみです。
これはプログラムのログから判断してます。全接続が一気に切られて、それ以降、
接続のログが残りません。プロセスは動きつづけています。
そこで、なんとかして listen ポートを閉じてみたいと思っています。
それが出来たら、「オタクらうちが入れたサーバに何かしてない?」と問い詰めて
責任範囲を限定していきたいと思っています。
説明下手ですんません。
再現試験のためソース改変せずにlistenを落とす攻撃方法を知りたいと。
そんなもん幾らでもあって話にならん。 サーバの状況を調べろ。
プログラマじゃないだろ。 listen()とaccept()の区別すらついてない奴は。 TCP接続のACCEPT状態うんぬんなんてまるで理解してないよ。 放置しる
>>431 ごめん。既にスレ違いの方向に流れてるから、俺のレスはこれで最後だと思ってくださいな。
客先への詳細報告が必要なのは当然でしょう。
ローカルで再現しないってのを、もっと早く聞きたかったなぁ。今始めて聞いたよ。。
あと全接続が切られるっていうのは、
その瞬間においてサーバーから切断なのか、クライアントから切断なのかが分からないし。
下手すりゃ、物理的な切断の可能性は?って事もわからない。
(例えば無線LAN使用時など)
あと、全体的に受け取れる感想なんだけど、まず自分のことを疑ってないね。
そりゃ技術屋だし、自分の技術には最低限自信もあるだろうけど、
同一システム上の他のネットワーク関係もおかしいなら話は別だけど、そうではなさそうだし、
貴社製作アプリケーションでしか再現しない不具合なら、
最初に疑うのは自分で有るべきだと思う。
最後に、予想で物を言わせてもらうんだが、
接続が全切断しているってことだけど、それがサーバーからの切断と”仮定”した場合、
接続中に起こりうる処理の中に不具合があり、その為例外的に
切断処理のコードに飛んでしまうことも考えられると思う。
てか、どういう仕組みのアプリか分からないし、通信だけが原因かも特定できてないから、
これ以上言いようがない。
てことで、あとは頑張って。皆もスレ汚してごめんね。
で、APIの戻り値はどういってるんだ? 唐突に全コネクションが消失するなら、ネットワークカードの トラブルで下位レイヤが落ちたとかも考えられるが。
>>432 当たりです。
>>433 そうなんですかぁ。。。私は知らない。それを教えて欲しいなぁ。
サーバの状況ですか。Win2003 サーバ、VBコーポレートエディション、PCAnyWhere
くらいは入ってるかなぁ。当社から提供したのはアプリだけなので、他に何を入れら
れてるかわかりません。が、おそらく上記のものがメインです。
ちなみに、状況って?具体的には何が必要?見ることが出来るのは落ちてからしばらく
したあとの netstat -an くらい。関係するポートは一切なし。これは前も書いた通り。
>>434 listen と accept の違いがわからないってどこで気づいたんだ?もしかして、おぬし
超能力者か!?それもユリゲラークラスの!?
>>435 丁寧な反応ありがとー。
接続は全て有線。物理的に線を抜いても listen ポートは閉じない。ローカルテストで
確認済み。それと自分は常に疑ってる。だから、自分のプログラムデバッグしたい。
でも、現象が再現しないからテストも出来ない。で、現象を再現する手立てを模索中。
狙いは listen ポートを運用中に閉じること。
435ありがとー。がんばっちみる。
433、434以外の皆様スレ汚してスマソ
>>436 最終的にはそこも疑ってる。既製品じゃ無いんだ〜(汗
なんだ一人言か。。。
とりあえずデバイスマネージャからイーサネットの「デバイスを無効にする」 にしてから、また有効にしてみるというのはどう? まあ、HWエラーなら、イベントビューワになんか出てる気もするけど。
accept()でエラーが起きているかどうかもわからんなんてネタだろ?
>>437 listenが異常終了とか言うから誤解したんじゃねーの?
>>440 やってみましたが、それでは listen ポートは落ちない様ですね。
>>441 ネタなら、もう少しましなの考える。
サーバプロセスは生きてるわけ? だったら、そのソケットをクローズしちゃったってのを まず最初に疑うべきだと思うけど。 ハンドルをクローズしているところで引数を間違えてる とか、そういう奴。
イーサネットのカード引っこ抜いてみれば?
>>445 listenは死なないと思うよ
eth0が無くてもloがあるし
何がしたいのかよくわからんな。
>>444 ちょっとその周り疑ってみる。ライブラリは実績あるし。それを使ってるヤシが怪し
いのには賛成。
>>446 その通り。
結局外部から listen ポートを落とすなんて荒業はあんまり聞かないって事で、使っ
てるヤシら、てってーてきに洗いなおしてみる。
でも、ローカルで同じ現象が出ないのがくやすい。。。_| ̄|○
449 :
デフォルトの名無しさん :2005/04/06(水) 20:50:24
やっぱりここで情報収集するのは無理なようですね。
>提供したプログラムのlistenポートが落ちてクライアントが接続できなくなる事があって困ってます。 これの根拠は?
プログラムが悪いんだからソース公開すれば? ここの人ならすぐわかるでしょ。
>>450 根拠は
>>413 の「netstat -anで LISTEN と出てない」って
いう症状でしょ。少なくともUNIX系なら、これは確実な証拠。
Windowsだと違うの?
>>451 クローズの引数間違えてるってのが当りだとすると、全然
関係ない部分でも起きうるから、ソース見るだけだと結構
面倒だと思う。もっともクローズ呼んでるところなんて、
そんなにないだろうから、全部の個所でログを吐くように
して症状を再現させれば、即効で判明すると思うけど。
クローズの引数間違えてなかったっす_| ̄|○
うーん、これがUNIXなら、異常が起きたら知らせて もらって、リモートからデバッガを attach して 様子を調べるとかするんだけどなあ。 デバッガから、対象となるソケットに対して accept() や fstat() を呼びだしてみれば、どういう間違いを 犯したかぐらいは、すぐ判明する気がする。 こういうのって、Windows だとどうするのがいいの?
ローカルで再現できないってpacket dropが無いからに一票。 よくみるバグだけど tcpの切れ目が常にクライアントとサーバで同じと見なしたコーディング。 うちの 会社ではネットワークシミュレータ(パケットの遅延、ドロップ)をはさんでテストするよ。 こういうバグはそれですぐ引っかかる。
>>455 packet drop すると listen してるポートが落ちるんですか?
でも、listening socketをcloseしちまったら、acceptが文句を言わない?
後は、ほとんどのスレッドが死んでて、WsaCleanupも呼ばれてるけど、 プロセスが最後の最後で死に切れてないだけ、とか。
クローズした後 別のソケットをオープンしたら、たまたま 同じハンドル値に割り当てられて、select()待ちに入って 抜けてこないからaccept()が呼ばれないとかいうのは、 ありうるような。 実はaccept()のエラーを見てないだけだったりして。
>>452 > 根拠は
>>413 の「netstat -anで LISTEN と出てない」っていう症状でしょ。
> 少なくともUNIX系なら、これは確実な証拠。Windowsだと違うの?
サーバはWindows(
>>437 )なのだが…
この話題止めない?
ろくな情報ももたらさず、(エラー処理&ロギングもなければ、パケットトレースもない)
プログラミングとは関係ない話(トラブルシューティング)するのは荒しと同じだよ。
後はWindows板でも行って。
>>427 の言うように技術の話じゃないから、プログラマ板の方が適当かも。
461 :
452 :2005/04/06(水) 23:10:38
いや、当該サーバがWindowsなのは知ってるよ。 でもnetstat -anの状態表示に関しては、Windowsも UNIXと同じだと思ってたんだけど、違うの? この話はデバッグ時に実際に役立つから、ム板でいいよね?
>>456 バグは要するにデータを誤って読むから論理が破綻してクラッシュしたり想定してない
異常処理にいく。 それで症状としてlistenしてない状態になるとか。 あくまでも
サーバーの論理の問題。
>>461 ソケットがnetstat -naで捉えられないことは、
一部の呆け以外もうみんな分かっている。
じゃあ、何故なのか、それはサーバのプログラムを調べないと知りようがない。
少なくともaccept()がどうなっているかくらいは調べるべきだ。
これでもうこの話題はいいか?
>>463 > ソケットがnetstat -naで捉えられないことは、
修正します。
ソケットが存在しないことが、netstat -naで確認されていることは、
というかさ・・・デバッグぐらいしろよ。 それとエラーが返る可能性のある全てのAPIはちゃんとエラーチェックしてログ吐け。 ネットワークが関係ないレベルの話だ。
お前らが相手にするからダラダラ長引くんだろ
472 :
デフォルトの名無しさん :2005/04/07(木) 16:28:59
教えてください. Linuxでサーバプログラムを作っています. bindでIPアドレスを指定していますが,そのネットワークインタフェースの IPアドレスが変更された後も,引き続き接続要求を待ち受けたいのです. 思いついたのは,いったんsocketをクローズしてはじめからやり直す方法ですが, もっとスマートな良い方法はありますか?
bind()でIPアドレスの代わりにINADDR_ANYを指定する。 TCPならこれで無問題。UDPだと場合によりけり。
474 :
472 :2005/04/07(木) 16:51:28
>>473 どうもです.
Etherが2つあって,そのうちの1つだけでサービスを提供したいんです.
それでそのEtherのIPアドレスを使ってbind()していたんですが,
INADDR_ANYだとすべてのインタフェースから受け付けることになってしまいますよね?
ちなみに,TCPを使用してます.
サービスを提供したくないインターフェースは別途 packet filtering ではじくって手があるけど。 それが嫌なら、やっぱりクローズしてやり直すのでは?
> ネットワークインタフェースのIPアドレスが変更された後も,引き続き接続 > 要求を待ち受けたいのです. (;´Д`)
477 :
472 :2005/04/07(木) 17:49:38
組み込みってことで,Filteringの導入は難しいんです. やっぱり,やり直すのが王道なんですかね? クローズしてしばらくはそのPortが使えないみたいなことを言われて躊躇してまして...
>>477 SO_REUSE{ADDR|PORT} のことか?
479 :
472 :2005/04/07(木) 18:30:19
>>478 なるほど,完全に理解はできてませんが,これのことを言われたんだと思います.
ちょっと勉強してみます.
さんくすです.
>>474 > Etherが2つあって,そのうちの1つだけでサービスを提供したいんです.
INADDR_ANYで、接続受けてから、getsockname(2)して、
駄目な方な場合のみ即close(2)しちゃうって手もあるが。
これならサービスダウン期間ができないし。
あー、たしかに。 その手の方法でいいなら、自分で getsockname(2) しなくても、libwrap をリンクして、安直に TCP wrapper に任せちゃうって手もあるかもねえ。
482 :
472 :2005/04/08(金) 17:24:41
>>480 そうすねー,他人の書いたコードを流用するっていうんで,
先の考えになったんですけど,
こっちのやり方の方が良いように思いますね.
後は実装して,実験してどっちをとるかですかね...
483 :
デフォルトの名無しさん :2005/04/09(土) 06:55:02
質問です。 TCPのコネクションについてなんですが こちらがSYNを送る 相手がACKを送ってくる 相手がSYNを送ってくる こちらがACKを送る これで接続が完了するようですが、最後のACKが正常に送れたかどうかのチェックはどうしてるのでしょうか? 送りっぱなしで相手に届いてない場合、相手の処理とか困るだろうし・・・ 宜しくお願いします。
プログラミングと言うよりプロトコルの理解が足りない ネットワークプログラミングではまるのは下位プロトコルの理解が足りないってUNPに書いてあった
まぁ、質問ってのは、理解してないから理解するためにやるもんだがな。
ちょっとこの前TCPの解説書としては定番の「マスタリングTCP/IP」を読んでみたが
下位レベルのプロトコルの説明が不十分で、接続に関しては本当に
>>483 くらいの事しか書いてなかった。
そのくせやけに他が詳しく書いてたり、バランスが足りないっていうか・・・
とりあえず、TCPの事しるには、洋書読むしかないよ。
もしくはその手のMLをROMしてると理解できる。
ACKが届かなければ相手はタイムアウトしてリトライしてくるなり あきらめるなりするのでわないの? ACKの確認が必要なら、さらにその確認が必要で、さらにまた....
なぁ…。前から思うんだが、ここもそうだが質問系のスレでよくある全然関係ないウンチクを並べてるヤツって 質問の内容そのものに対しては一切触れてないことが多いんだが、本当にわかってるの? 質問スレで、質問そのものにウンチクするのって本当に無意味だと思うんだが・・・ そんな余力あるなら答えてやれよって思うのは俺だけ? じゃあ俺が答えろって?正直言って俺は分らん
488 :
483 :2005/04/09(土) 07:16:56
レスありがとうございます。
>>486 なるほど、ではその場合
こちらは繋がってるつもりで、相手が繋がってないという状況になりますね?
この状態でデータを送って、もし送れなかったらコネクションを切ると言うことなのでしょうか?
>>483 TCPのACKは、ACKパケットってのが特別にあるんじゃなくて、
全てのTCPパケットのヘッダに埋め込まれていて、
シーケンス番号のここまでは一つの欠けもなく全部受け取ったよって意味。
だから「バイトごとのACK」「TCPパケットごとのACK」って考え方だと、
その後の送出TCPパケットの全てにおいて、ACKを「再送」している、ことになっている。
つまりACKは接続が生きている間、ずっと送り続けている、ってのが、
あなたの質問にあわせた(考え方での)答え。
タコ本はこういうことはちゃんと解説できてない。
そういう意味であなたの疑問は非常にいいところを突いていた。
基本部分をちゃんと理解できているからそういう質問が出るんだろうね。
>>485 > とりあえず、TCPの事しるには、洋書読むしかないよ。
Steavensの「詳解TCP/IP」シリーズがあるじゃない。
あれは問題も解くと非常に非常に非常に力がつきます。
「マスタリングTCP/IP」については同じ考え。
490 :
489 :2005/04/09(土) 07:30:07
>>488 相手はSYNを送ってきているのだから、
接続を放棄するにはFINを送ってくるはずです。
相手が何らかの問題を抱えている場合、(FINを遅れないような)
ICMP(port unreachableなど)が送られてくる可能性もあります。
全く何も反応がなければ…どうしちゃったんでしょうね。
タイムアウトしかないですね。
http://www.faqs.org/rfcs/rfc793.html に、
ほとんどのことは、初級レベルだと全て、書いてありますよ。
491 :
483 :2005/04/09(土) 07:45:02
>>485 なるほど・・・
何もコネクションの時だけ、そのような処理をしてるわけじゃないんですね。
rfc793を読んで勉強してみます。
どうもありがとうございました。
492 :
489 :2005/04/09(土) 07:57:24
マスタリングTCP/IP のシリーズは、外人の書いた本の 翻訳物だけ買ってまつ。SSL/TLS編とかRTP編とか。
エセ中国人は消えろ
中国人も消えろ
496 :
デフォルトの名無しさん :2005/04/10(日) 16:24:50
相手から受け取ったデータを処理して、その相手に返信のデータを返す というプログラムを書いてたんだけど、何故かデータが後半しか届かない。 おかしいと思ってキャプチャしてみたら 相手からのPSHに対するACKにデータの前半が乗ってた。 ふつー、こういうときって[PSH,ACK]にならないか? TCP_NODELAYだとこうなるのかね・・・ 識者の見解キボン
初歩的なことですみません。 socket()で得たディスクリプタの番号をbind()してsockaddrと結びつけますよね。 その後で、ディスクリプタ番号だけをひきずり回してプログラムを組みたいので すが、ディスクリプタの番号だけからsockaddrを取得することはできますでしょ うか。 やっぱりsockaddrもいっしょにひきずり回すしかないでしょうか?
>>497 getsocknameとかgetpeernameとかでソケットから引ける気がする
499 :
496 :2005/04/10(日) 17:03:45
クライアントのTCPの実装がどうもヘボいみたいだ。 ようするに、piggybackを抑止すれば良さそう。 でもどうやって・・・?
>>498 どうもありがとうございました。わかりました。
このスレで wininetって欠片も出てきませんね。。
誰も使い方知らないからね・・
>503 おまえは知ってるのか? 教えてやれよ
505 :
デフォルトの名無しさん :2005/04/10(日) 18:42:13
質問です。 相手がプライベートIPアドレスしか持ってない場合 その相手に関してユニークな情報ってありますか? 相手がプライベートIPアドレスしか持ってない場合、相手が二重にクライアントを起動していたら 送信先がわからなくなってしまうんで・・・
LAN内ではユニーク NAT使え ってこと?
>>506 いえ、途中でグローバルなノードを経由するので、ポートが正しく開いて無くても(NATを設定していなくても)到達出来るようにするつもりなのです。
ただ、その場合の、送信先をどのように定義すれば良いのかが・・・
>>507 相手がクライアントなら二重起動(接続)されても
ソケットが二つになるだけだから、それで区別する。
あとはアプリケーション層で解決。個別IDなりなんなりを
クライアントから送らせるとか。
>>496 ,499
そういうレベルの問題があるようなTCP実装は、
他にも大問題がボコボコあるに決まっているので、
早急に上司に相談して、別のまともな実装に乗り
換えるべし。
さもないとプロジェクトがオオゴケすると思われ。
>>496 読んでも、状況が特定できんよ。
> 相手からのPSH
1. local ←[PSH+データ]− remote
> に対するACKにデータの前半が乗ってた。
2. local −[ACK+前半]→ remote
3. local −−[後半]−→ remote
ってことか?
PSHは受け手側のTCP moduleが勝手に取り除く可能性のあるflagだよ。
3.8. Interfaces, User/TCP Interface, TCP User Command, Receive (p.48, RFC793)
>>507 TCPの接続は、
<localのIPアドレス、localのポート番号、remoteのIPアドレス、remoteのポート番号>
の四つ組でユニークに識別できます。世界で唯一です。(でなければルーティング不能)
OSのTCP moduleもこの方法で接続を識別しています。
NATやグローバルなノードでの<remoteのIPアドレス、remoteのポート番号>を得て、
NATやグローバルなノード先のことは気にしないでいいです。
それはNAT, LAN内で解決するべき事ですから。
そうしないとあなたのアプリはNAT透明性がなくなってしまいます。
512 :
質問age :2005/04/11(月) 00:07:37
RedHatLinux7.1 + gcc でソケットプログラミングをしようと思っております。
なんとか環境までは構築できて、HelloWorld はコンパイル&動作はできました。
次にいよいよソケットプログラミングなんですが、、、なんかこう、シンプルな
サンプルソースなぞはありませんか?
apacheとかのソースは膨大過ぎて・・・。
ttp://www.hellohiro.com/socket.htm ぐらいのシンプルなのがあれば助かります。
↑次にintの配列の送受信の方法が解りませんとか言い出すんじゃないぜ。
514 :
質問age :2005/04/11(月) 00:18:20
>>513 一応組込屋です。探したんだけど、Winsockのサンプルしかなくて。。。_| ̄|○
JavaやWinならサーバ側もクライアント側もやった事はあるんだけどね、
お客様がLinuxでやりたいとか仰ってトホホなんでつよ。。。
accept()で、次々と接続を受け入れても、ポートは消費しないですよね? みんなlisten()しているポートを使用するということでOKでしょうか?
TCPパケットをよく見ろ
listenポートは、次から次へと男を乗り換えていく魔性の女だな
521 :
デフォルトの名無しさん :2005/04/12(火) 05:02:18
質問です。 TCPで typedef struct{ int hoge1; int hoge2; char *hoge3; }SEND_DATA; こんな感じの構造体を送るようにしたんですが、 どうも上手く受信出来ません。 もちろん#pragma packを使ってアライメントの問題も解決してたはずなんですが・・・ なぜでしょう? charが受信できないのです。
ポインタ送ったってしょうがないだろボケ。 Cの勉強し直して来い。 っていうか、これって前にも見た気がするんだけど。 釣られたのかしら。orz
523 :
521 :2005/04/12(火) 05:11:25
THX!! ホントだ・・・orz いえ、さすがにこれは初めてですよ。 しっかし、配列あらかじめ固定にしてしまうのはちょっと無駄に感じてしまうんですけど・・・ どうにか可変長にする方法ってないですかね?
Lengthつけて実体送ればいいだけの話ではないの。
525 :
521 :2005/04/12(火) 05:16:01
>>524 それだと、構造体の大きさが送信側と受信側で変わってしまう事になりますよね。
受信側でキャストした時に正常に受信できるのでしょうか?
>>524 キャストしなければ良いだけのことでしょ。
それに少なくとも、int 2つとlengthに関しては固定にはなるし。
charデータ実体だけ別処理でも良いんでは?
というか、後々の事と自分以外がメンテする時の事考えて、
俺の場合は、受信データをキャスト一発で処理っていうのは、
ほとんどやったことが無いよ。
あ、そうそう
>>521 での人違いゴルァはすまなかった。
そっくりなのを以前見たことがあったもんで。
struct SEND_DATA { int length; char buf[1]; }; これとか。
>>528 きっと、次の質問は
「データが1byteでは足りないのですが・・・」
の(゚∀゚)ヨカーン
lc.exeだと
struct SEND_DATA {
int length;
char buf[];
};
は通らないんだっけ?
なんか間抜けなフォローが重なってる希ガス。
別に構造体は
>>521 のままで良くて、単に
void send_data(int sock, SEND_DATA *d) {
int32_t netint, len;
netint = htonl(d->hoge1);
write_nbyte(sock, &netint, sizeof(netint));
netint = htonl(d->hoge2);
write_nbyte(sock, &netint, sizeof(netint));
len = strlen(d->hoge3);
netint = htonl(len);
write_nbyte(sock, &netint, sizeof(netint));
write_nbyte(sock, d->hoge3, len);
}
みたいにしろって話でしょ。
(hoge3 の長さが strlen(d->hoge3) でいいかは
知らないけどさ)
#pragma pack で解決するってのは移植性悪いし。
そのコードのどこでhoge3のメモリ確保してんのさ。 そう言う話だろうよもともとは。
>>531 >>523 の「どうにか可変長にする方法ってないですかね?」
から始まる流れだとすれば、
>>528 や
>>530 は別に間抜けでもなんでもないと思うけど?
構造体を可変長っぽく扱うためのよくある方法を書いただけだし。
構造体のタグが一緒なのはちょっと間抜けっつーか、誤解を招くなとは思うけどさ。
そう?
>>521 のままで問題ないってことを説明しないで
すぐに
>>528 や
>>530 のような解を勧めるのって変じゃない?
送りたいデータ形式が、アプリケーション内でSEND_DATAとは
別の構造で保持されているとすると、
>>521 の構造体の方が
無駄なメモリコピーが少なくて済む点でもマシだし。
アプリケーションで扱う構造そのままを渡すインターフェース
にする方がもっといいだろうけどね。
固定長でいいよ
>>519 便乗で質問ですが使用しているポート番号ってどうやって知りますか
netstat?
>>520 乗り換えるっていうか、同時に付き合ってるでしょ。
>>539 いやいや、他の女に振り分けちゃうじゃん
この辺の話って勘違いしている人おおいよね。
UDPなんかは一度寝た男でも簡単に捨てれるよ
TCPの接続は四つ組みで識別されるので、 <192.41.192.40,80,192.168.0.1,1000> <192.41.192.40,80,192.168.0.1,1001> <192.41.192.40,80,192.168.0.2,1000> は別の接続です。
よーし、listenポートにconnectしちゃうぞー。
じゃぁ俺はポートを消費しちゃうぞー。
ついでに SYN Flood Attacks しちゃうぞー。
・WSAECONNRESET ・WSAECONNABORTED ・WSAESHUTDOWN これらってどんな場合にでるかわかる方います? ノンブロッキングソケットを使っているのですが、 WSAECONNABORTEDしか出なくて・・・
MSDNによれば、 ECONNRESETは相手がHARD CLOSEしたときや、keep-aliceで切断されたあと。 ESHUTDOWNは、shutdwon(SD_SEND)したあとにsendしようとしたとき。 に出るような事が書いてあるなぁ。
アリスを維持します。
>>548 リンク先は障害情報では?
知りたいことですが、RST受けた時に、
ブロッキングソケットでは、WSAECONNRESET が返るのですが、
ノンブロッキングソケットでは、WSAECONNABORTED が返るので
何でかなぁってことです。
RPCもこのスレでいいんでしょうか。 下のコードで最後のsvcudp_create()がNULLを返すんですが、 理由が分かる方いますか?(errnoはEBADF。) int sFd; SVCXPRT *transp; struct sockaddr_in addr; sFd = socket(AF_INET, SOCK_DGRAM, 0); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = 0; bind(sFd, (struct sockaddr *)&addr, sizeof(addr)) transp = (SVCXPRT *)svcudp_create(sFd); socket()とbind()は正常に返ってきているんですが・・・。
555 :
デフォルトの名無しさん :2005/04/14(木) 17:33:32
質問失礼します。 winsock初めて2日目の初心者です。 UDPで離れた場所との通信を行おうと考えています。 LAN内での通信は成功しました。 gethostname gethostbynameでhostent(ローカルIP)を取得し、sendtoで使用しました。 離れた場所との通信を実装する場合、sendtoで与えるhostentをグローバルIPにすれば良いと単純に考えているのですが、認識は合っていますでしょうか? 他の場所にマシンが無く、確認しようが無いのです。。。orz (127.0.0.1 との通信はできました)
>>555 認識はそれでOK
ただ、間にNATとかあると考えもの
こんばんわ。質問です。 NAIのSnifferや、SmartBitsでできるような、任意のデータリンクフレームを 送出するという機能をもつツールを作ってみたいと思っています。 LinuxやBSDでは、PACKETやBPFで出来るようなのですが、 Windowsでこのようなものを作る時に使えるライブラリや手段等はありますでしょうか? 「NE2000の仕様を読んで自分でNICのドライバ書け!!」というのでなく、 LinuxでSOCKETを使ってできるくらいのボリュームだとありがたいのですが。 (raw socketで自由に記述できるのは、IP層のヘッダから、という認識でいいんですよね?)
558 :
555 :2005/04/15(金) 00:53:57
>>556 返答ありがとうございます。
このまま突き進んでみます。
悪用か…
>>554 横だがポート0にバインドするってなんか意味あるの? やったら確かに成功するのだが
(特権も無いのに)。 ちなみに自分は上のコードでtransp帰ってきたよ。
561 :
デフォルトの名無しさん :2005/04/15(金) 05:04:29
質問です。 send()はブロッキング関数ですが これは、相手とのsocketが無効になったなどの要因による送信不可の状況でも、永久ブロックしてしまうんでしょうか? それともエラーを知らせる戻り値を返して終わりなのでしょうか? 私は後者だと思ってたんですが、ちょっとWinsockを勉強してるんですけど、どこかでブロックしてるんで ここが怪しいと思うんですけど・・・
>>どこかでブロックしてるんでここが怪しいと思うんですけど・・・ もっと曖昧でないレベルになるまで調査してこい。
563 :
デフォルトの名無しさん :2005/04/15(金) 06:05:18
まあ無知なバカほど調査してこいって言うもんで バカは無理して答えなくていいよ?
バカ厨ウザ
プログラマが、自分の書いたプログラムが、どこかでブロッキングしているのに、
どこでブロッキングしているか調べられないなんて、問題外だと思います。
>>561 エラーとして処理すべきかしばらく待つべきなのか分からないことがあります。
分からない場合には、設定された時間(keepaliveタイマなど)だけ待ちます。
566 :
デフォルトの名無しさん :2005/04/15(金) 06:35:00
質問に答えられないバカの巻
>>562 >>564 >>565 561 名前:デフォルトの名無しさん :2005/04/15(金) 05:04:29
質問です。
send()はブロッキング関数ですが
これは、相手とのsocketが無効になったなどの要因による送信不可の状況でも、永久ブロックしてしまうんでしょうか?
それともエラーを知らせる戻り値を返して終わりなのでしょうか?
562 名前:デフォルトの名無しさん :2005/04/15(金) 05:09:46
>>どこかでブロックしてるんでここが怪しいと思うんですけど・・・
もっと曖昧でないレベルになるまで調査してこい。
563 名前:デフォルトの名無しさん :2005/04/15(金) 06:05:18
まあ無知なバカほど調査してこいって言うもんで
バカは無理して答えなくていいよ?
564 名前:デフォルトの名無しさん :2005/04/15(金) 06:24:08
バカ厨ウザ
565 名前:デフォルトの名無しさん :2005/04/15(金) 06:27:14
プログラマが、自分の書いたプログラムが、どこかでブロッキングしているのに、
どこでブロッキングしているか調べられないなんて、問題外だと思います。
>>565 がお前の質問に答えてくれてることすら理解できねぇのか。
どうし様もねぇカスだな・・お前。
568 :
デフォルトの名無しさん :2005/04/15(金) 06:46:48
またふえたバカ
>>567 567 名前:デフォルトの名無しさん :2005/04/15(金) 06:39:35
>>565 がお前の質問に答えてくれてることすら理解できねぇのか。
どうし様もねぇカスだな・・お前。
バカ厨は放置よろ。> ALL
570 :
デフォルトの名無しさん :2005/04/15(金) 07:01:49
このスレバカばっかり 二度とこねーよこんなスレ
別にバカばかりなのはこのスレだけじゃないがな。
>>561 エラーが起こればブロックしないで返ってくる。
winsock なら戻り値として SOCKET_ERROR が返ってきて、
その時に WSAGetLastError() を呼べば原因がわかることになっている。
偉そうに見当違いのレスをするから荒らされる。 荒らされないためには、知らない奴は黙って見ていること。 回答だけするべし。
>> 560 UDPのポート番号0番は、NFSで使ってるろ。 RPCと関係あるんじゃない?
NFSは2049番だろ。 0番でbind()すると、ephemeral port を割り当ててくれるの。 実際に0番を使うわけじゃない。
なんだこりゃあ・・・・最悪な厨房が大暴れしてんな。
ごめん、フラグメント化されたUDPパケットは、 ポート番号が入っていない(0が入っている) ってのと間違えた。
578 :
560 :2005/04/15(金) 19:39:29
>>575 おお、そうでしたか。 だから特権なしでokなわけですね。 ありがとうございます。
579 :
554 :2005/04/15(金) 22:22:46
解決しました。 /usr/ucblib/librpcsocをリンクしたらうまくいきました。 (OSがSoralis, SunOS5.6の場合はこれが必要) rpcsocをリンクしなくてもコンパイル&リンクが 通っていたので油断してました。 お騒がせして申し訳ありませんでした。
select待機後のrecvの受信中でLANケーブルを断線 した時 タイムアウトか何かでブロックしたままの状態になる場合があるのですが、 対策できませんか。
>>580 HeartBeatメッセージのようなものを定期的に送受信して監視する。
582 :
デフォルトの名無しさん :2005/04/16(土) 10:17:03
こんにちは。質問です。 ソケットに関しては雑魚ですので、ご了承ください。 今、winsockを使用しインターネットを介しての通信に挑戦しています。 が、インターネットを介して(ルーターを介して? WAN?)の通信で詰まってしまいました。 (接続先は 230.216.110.??? ポートは8000・2340・2400と試してみましたが全部駄目でした) ハブを介して(LAN?)の通信はできました。 (接続先は 192.168.0.? ポートは2340・2350、共に成功しました) 230.216.110.??? = グローバルIP 192.168.0.? = ローカルIP と、自分は思い込んでいます。 質問は2つです。 @sendtoで与えているローカルIPをグローバルIPに変えたのですが、通信できません。 この症状はどの様な事が考えられるのでしょうか?考えられる限り列挙していただけると幸いです。 「ルーターが通信をブロックしているのかな?」などと雑魚なりに考えています。 A現在グローバルIPは、wininetを使用しcgi(Perl言語)にアクセスして、$ENV{'REMOTE_ADDR'}で取得しています。 もっと簡単に取得する方法は無いでしょうか? 以上です。 よろしくお願いします。
ローカルIPの自分から、グローバルIPの自分にsendtoしたのか? なら、通信できなくて当然だなぁ。 グローバルIPの自分ってつまり、ルータのことになるんだが。
>>582 NATで自分に割り当てらえているグローバルIPに、
自分自身が接続しようとしているって事?
それが出来るかどうかはルータ依存。
出来なくても何の不思議もない。
>>403 と同じ状況?
586 :
582 :2005/04/16(土) 11:15:57
ありがとうございます。
>>583 >ローカルIPの自分から、グローバルIPの自分にsendtoしたのか?
いえ違います。
別の場所(10km程離れています)のグローバルIPです。
>>584 さんも、同じ質問をしてくるって事は、
「sendtoで与えているローカルIPをグローバルIPに変えた」
これで上手く行くはずって事ですよね!?
>>403 さんとは似ていますが、違う様です。
これ書いてて思ったのですが、少々お馬鹿なデバッグをしていたのかも知れません。
@に関しては保留させてください。確認してみます。
確認が終わったら報告します。
休日だというのに10km自転車で行かなきゃいけないのか。。。orz
すいません。
追加質問させてください。
B皆さん、グローバル通信環境(?)でのデバッグってどうされてます?
ようするに別の場所のPCを扱いたいのですが。。。
NATが原因
588 :
582 :2005/04/16(土) 11:22:13
あっ >「sendtoで与えているローカルIPをグローバルIPに変えた」 >これで上手く行くはずって事ですよね!? ↑これが出来ればローカル環境でデバッグできるじゃん。。。 なに言ってんだ俺。。。orz
ポート閉じてるだけじゃねーの?
>>586 > B皆さん、グローバル通信環境(?)でのデバッグってどうされてます?
プログラミング的には、別にグローバルだとかローカルだとか関係ない。
NATだけ気をつければ、何も変わりはない。
マ版的なデバッグ環境話としてはsshでログイン。
591 :
582 :2005/04/16(土) 14:26:50
ありがとうございます。
>>587 φ(。_。)メモリますた。
>>589 φ(。_。)メモリますた。
>>590 φ(。_。)メモリますた。
意味が完全には理解できていないので、色々調べてみます。
592 :
582 :2005/04/16(土) 14:27:14
今、その10km離れた別の場所に来ています。
で、@の確認の結果報告ですが、やっぱ駄目でした。。。orz
ですが、収穫があった様に思います。
作成したクライアントソフトを起動したのですが、
recvfromでSOCKET_ERRORが帰ってきているみたいなんです。
WSAGetLastErrorで調べる事ができると
>>572 さんが書いていたので早速調べてみました。
結果は10054。MSDNで調べると、
WSAECONNRESET
(10054)
Connection reset by peer.
A existing connection was forcibly closed by the remote host.
This normally results if the peer application on the remote host is suddenly stopped,
the host is rebooted, or the remote host used a "hard close"
(see setsockopt for more information on the SO_LINGER option on the remote socket.)
This error may also result if a connection was broken due to "keep-alive" activity detecting a failure while one or more operations are in progress.
Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
でした。
英検4級の私には理解不能でした。。。orz
(当然、infoseek翻訳しましたよ。しても分からんのですヽ(`Д´)ノ)
593 :
582 :2005/04/16(土) 14:38:02
>>580 selectが非ゼロ返してきて、recvするとblockするってことですか?
なんだか信じられないけど。
Unixの類ならSIGALRMでタイムアウトするようなラッパ関数を作って使うとか。
というか、ネットワーク構成図を書け
598 :
582 :2005/04/16(土) 17:08:12
ありがとうございます。
>>596 >>597 分かりました!
しかも、完璧に!
問題の原因ではなく、私の知識が圧倒的に足りないという事が分かりました。
ソケット以前の問題の様です。
本買いに逝って来ます。
>>596 さんの言われている通り、
ローカルからローカルへの接続をしようとしてたみたいです。
誠に勝手ながら@ABの質問は、無かった事にさせてください。
おそらく答えていただいても、わけが分からないので。
付き合って頂いて、ありがとうございました。
599 :
winsock2です :2005/04/16(土) 17:20:35
socket(AF_INET, SOCK_RAW, プロトコル); で、プロトコルをTCPにしてTCPヘッダを編集することはできないのでしょうか? プロトコルをUDPやICMP、RAWにするとパケット自体は送信できているんですが、 TCPにするとパケットも遅れてないようです。
>>599 遅延が無いなら問題ないでしょ
という冗談は置いといて
番号がおかしい
601 :
599 :2005/04/16(土) 17:40:01
>>600 遅れて→送れて でした。
プロトコル番号ってIPPROTO_TCPじゃないんですか??
603 :
599 :2005/04/16(土) 17:56:36
>>602 ありがとうございます。いろいろ試してみます。
ftpクライアント作ってます。 アクティブモードで、クライアントのデータコネクション用ソケットにサーバから接続することができるんですが、なんででしょうか? ルータでブロックされないのかな...
FTPを認識したルータだと、PORT以下を認識して、 自動的にポートを空け、PASVでなくても通信出来る場合がある。
established
607 :
デフォルトの名無しさん :2005/04/16(土) 21:19:22
特定のサーバーに頼らずに、そのシステム内で被らないポート番号を捜す方法って無いのでしょうか? あと、出来れば外部との接続に有効なポート(NATで正しく設定されているポート)かどうかまで解れば良いんですが・・・。 やはり、一度外部との接続をして試すしか方法はありませんか? 環境はWin2k以降でWinsock2ででの話です。
608 :
デフォルトの名無しさん :2005/04/16(土) 21:47:46
NATで正しく設定されているポートってなんだろうね
UPnPぐらいしかないんじゃねえのかなあ
>>609 マッピングの勉強してこい
というか、今時初心者でもルーターのポート設定くらいしたことあるぞ。(汁
612 :
デフォルトの名無しさん :2005/04/17(日) 12:02:15
質問です。 ネットゲームでよく見られる"ping"って何の値なんでしょうか? 日本のサーバーは20〜70 欧米のサーバー等は200〜300位の様ですが。。。 winsockを使っている事は間違い無い様です。
またすごいのがきたな
614 :
612 :2005/04/17(日) 12:40:18
何か?
616 :
612 :2005/04/17(日) 13:27:08
>>615 考えてみたらそうですね。。。 < ゲームによる
応答時間だと思うので、QueryPerformanceCounterを使う事にしました。
ありがとうございました。
>>599 Windows だと、確かどっかのバージョンだかどれかのSPだかで、
セキュリティ対策としてTCPプロトコルでのRAWソケットからの通信は
できないようにされていたような気がする。
管理者権限で出来るでしょ。
WindowsでQoS RSVPのサービスを動かしていたら、 アプリからQoSを通さずに直接Winsockへパケットを通す事は出来ずに 必ずQoSのサービルにパケットは食われますか? アプリの作り次第ではQoS通さずに直接Winsockへ流せそうな気もするのですが、やっぱり無理なんですかね?
620 :
デフォルトの名無しさん :2005/04/18(月) 22:58:04
どこで質問して良いかわからんので、ココでスマソ グローバルIPから国名を導き出したい。 どうやりゃ良いの? とりあえず、sageときますね(w
622 :
620 :2005/04/18(月) 23:26:02
>>621 トップレベルの番号一覧が出てこねぇんだよ!
よこせ!
623 :
599 :2005/04/18(月) 23:28:11
>>617 それかも。当方XPのSP2です。管理者権限はあるんだけどなー
624 :
デフォルトの名無しさん :2005/04/19(火) 00:41:29
えぇ し ぉ w w ァ kw う う っ ハ wwお ぇ ぇっ ァ ww け とるの ハ うは w
627 :
620 :2005/04/19(火) 01:37:00
>>624 教えてくれよ。
マジ、分からないんだよ。
教えてくれたら、二度と来ないからさ。
628 :
620 :2005/04/19(火) 01:51:12
>>625 いあ、自分の知りたいのはQoSの設定の段階の問題じゃなくて、その後なのですが…
QoSの設定した後、普通のアプリならパケットはRsvpsp.dllを通ってWinsockに流れると思いますが、
Rsvpsp.dllを通さずに直接Winsockにパケットを叩き込んで、
QoSの影響を受けないようなアプリは作る事は出来ないのかって事を知りたいのですよ。
633 :
デフォルトの名無しさん :2005/04/19(火) 14:43:44
Win32API質問箱板で質問したのですが、 板違いの気がしたのでこちらで再度質問させていただきます。 WininetAPIでHTTPSで通信を行い,サーバが仮証明書を利用した場合などに, 警告ダイアログボックス表示の禁止にしたいのですが、 どの関数をつかえばいいのでしょうか?
635 :
デフォルトの名無しさん :2005/04/19(火) 18:33:22
634>>
ありがとうございます。
証明書問題は解決できました。
あともう一つお聞きしたいのですが、
httpsでPOST処理をやりたいのですが、
下記のHPの通りに作っても、
送信処理がうまく走りません。
ttp://support.microsoft.com/kb/q168151/ httpのポート指定だと、POSTできるし、
結果がきちんと返ってきます。
このページ以外の処理も追加しないとダメなのでしょうか?
よろしくお願いします。
>>635 全くわかりませんが、他の方が回答しやすいように
・各APIでエラー等は返されていないか
・IE等では、そのURL (
https:// 〜) に対するPOSTが正常に行えるのか
など書かれてみてはどうでしょうか。
漏れならまず最初はサーバ側を疑います。
638 :
デフォルトの名無しさん :2005/04/20(水) 09:50:31
>>636 色々調べた結果、正規の証明書が発行されないページのみで、
12045のエラーが出続けていました。
証明書のキャンセル処理が走っているのが、認識されていない?ようです。
何が違うのやら・・・
サーバー側を調べてみて、
証明書関係のことももうちょっと調べてみます。
639 :
デフォルトの名無しさん :2005/04/20(水) 14:40:10
サーバプログラムで、こっちがacceptしなくても クライアントのconnectが完了してさらにwriteも完了し PSHに対してACKまで返す なんてことあるの?
640 :
639 :2005/04/20(水) 14:41:33
connectが完了するまでは普通にあるから、writeというか データのパケットもクライアントは普通に送出するか。 ということはそれに対してACK返すのも普通の出来事か。 すまん。
WinSockのsocket関数とWSASocket関数は機能的に何が違うのでしょうか
>>641 マニュアルみればわかるでしょ。
どうみても同じに見えない。
>>639 TCPのACKは、あくまでもプロトコルとして相手のマシンに
データが到着した事を示す為のもので、相手のプログラムが
データを受け取った事を示す為のものでは無いから、
相手のプログラムがrecv()をコールしていなくても
相手のOSがデータを受け取ったタイミングでACKが
帰って来てもおかしくはないと思うよ。
>>639 transparent proxyが間に挟まってたりするとそういう挙動をするね。
>>645 コネクションが確立してて、相手側の受信バッファ(ウィンドウサイズ)
にまだ空きがあれば、アプリケーション側がrecv()呼ばなくても
TCPのACKって帰って来るよね。
なんでこのスレは適当な事をいう奴がいるんだろう
どこにでもいるが
>> 651 やっと味方が出て来てくれた。 THXです。 >> その他の人 まぁ、一度サンプルつくってLANトレースを取りながら 動かしてみることをお勧めします。
そんなのは常識だと思ったが。
反論する時に実行サンプルのソースとログをだせば すぐ済むハナシなのに
655 :
デフォルトの名無しさん :2005/04/23(土) 10:51:40
C#でサーバプログラムを作っているのですが TcpListenerで取得したclientに対して NetworkStream ns = client.GetStream(); StreamReader sr = new StreamReader(ns,enc); StreamWriter sw = new StreamWriter(ns,enc); sr.Read(); となっているときtelnetでこのプログラムに接続し、 文字を入力すると入力した文字がエコーされてしまうのですが Read()はエコーを返すようにできているのでしょうか? telnetのエコーはOFFにしてあります。
出来ているわけねー
あふぉ
658 :
デフォルトの名無しさん :2005/04/23(土) 17:34:30
誘導されてきました
IPヘッダをごにょごにょしたいのですが、
WinSock2のrawモードを細かく日本語で解説した物ってありますか?
Webページでも本でも、何でも構いません。
>>1 の Winsock Programmer's FAQ (日本語訳) でリンクされている
ライブラリ等は使いたくありません。
宜しくお願いします。
>>658 >>2 にあるWinsock2の本。
>
>>1 の Winsock Programmer's FAQ (日本語訳) でリンクされている
> ライブラリ等は使いたくありません。
トロイの木馬ですか? (w
660 :
658 :2005/04/24(日) 02:18:34
???????
663 :
デフォルトの名無しさん :2005/04/25(月) 20:10:56
サーバプログラム作ってるんだけど SSH2のDSAで通信するときののプロトコルが解説されているサイトない?
漏れも漏れも〜
668 :
デフォルトの名無しさん :2005/04/29(金) 20:11:50
OSはwinXPproで、UDPでブロードキャストにsendtoした ところ10022の無効な引数となりました。 ところが、別なマシン(win2Kpro)やwinXPheだと 正常に処理されます。 winXPproのファイアーウオールの設定でしょうか? 考えられる原因は・・・。
669 :
658 :2005/04/29(金) 21:41:00
>>659 すみません、本屋でその本を見かけて立ち読みしたのですが、
生ソケットと言うタイトルで、ICMPを発射するサンプルしかありませんでした・・・
これは Winsock Programmer's FAQ (日本語訳) に載ってたのとと全く同じような
気がするのですが、もう少し詳しく解説してある書籍はないでしょうか?すみません
各クライアントPCのセキュリティレベル項目を一定にするために、どうされていますか? 今は、各自でやってもらってます。 バッチファイルによる control.exe inetcpl.cpl, ,1 ではコントロールアプレット→インターネットオプションまで表示されました。 ここでセキュリティレベルを一律”高”にできないでしょうか? バッチファイルをクリックすることでアプレットの表示でなく、設定を行いたいです。
プログラミングよりもWindows板がいいと思う。
>>672 ありがとう。
Windows板にはどこに書いていいかわからなくって。
スレよごしてしまった。すまん。
control.exeの引数みてもないからなんらかで
直接レジストリに書き込まなきゃいけないのかなー。
674 :
デフォルトの名無しさん :2005/05/09(月) 20:38:53
こんにちは たぶん私は何もわかってないのでが
できたら教えてください
WinSockでプロクシ経由で外部に通信の場合
WEBでしたらProxyに通信はってGET /<
http://対象となるサーバー >
で、通信できるのはいいのですが
UDPとかを通信するのはどうすれば・・・
MFCのCInternetSessionでないとダメ?
そもそもプロクシ自体 HTTPとかの規格しか通さない物でしょうか?
HTTPのプロクシなら、HTTPとFTPあたりが普通。 よくてHTTPSということにしたTCPしか通さない。 UDPを通すようなプロクシは聞いたことがない。
>>675 ありがとうございます
やはりそうですか プロクシの設定で
このポートはスルー とかってできるんでしょうか?
RouterとFirewallとGateway(Proxy)の違いが判らない人ですか? Gatewayは中継するProtocolを知っている必要があります。
レイヤ IV
>>677 すみません、区別ついてないです
ただ、Gatewayはファイアウォールと違って
内部の効率を上げるのが目的と認識しているので
キャッシュする必要の無いプロトコルはスルーするのかな?
と思っただけです
そもそもDNSサーバがそう。
squid
>>677 Router も Gateway じゃないの?
IGP とか EGP とかいうくらいだから
ルーター⊂ゲートウエイ プロキシ⊂ゲートウエイ って事だな。
>>680 > gatewayはレイヤー7のプロトコル中継です。
Should not confuse!
RFC1392より
gateway
The term "router" is now used in place of the original definition
of "gateway". Currently, a gateway is a communications
device/program which passes data between networks having similar
functions but dissimilar implementations. This should not be
confused with a protocol converter. By this definition, a router
is a layer 3 (network layer) gateway, and a mail gateway is a
layer 7 (application layer) gateway. See also: mail gateway,
router, protocol converter.
ゲートウェイとは、似た機能を持つが異なった実装を持つネットワークの間で データを伝送する装置またはプログラムのことである。
そゆことだね。
>>680 ちゃんとアプリケーションゲートウェイって言わないと
通じないよ。
CもしくはC++を使ってのネットワークプログラミングの入門書を紹介していただけないでしょうか
winsockですけどサーバー側が先に closesocketしてもいいですよね? サーバー側がsend->closesocketとしてて クライアント側がrecv->closesocketとしてるんですけど たまにrecvがSOCKET_ERRORを返すみたいなんです。
690 :
689 :2005/05/11(水) 15:14:47
サーバー側が1バイトsendしてすぐにclosesocketしてるのが まずいのでしょうか?1バイトって小さすぎ? sendしてSleep(1000)、その後closesocketにしてみようかなぁ
他人の過去の資産の不具合追ってます。が、そもそもネットワークプログラミングが よくわかっておらず、漠然とした質問になっちゃいますが、ヒント頂けると有難いです。 XPのSP2をあてたら動かなくなった、ソケット通信処理があります。 可能性として考えられるのは、どの辺りでしょうか・・・ Windowsファイアウォールは切ってみたりもしましたが関係なさそうです。
性的リンクしない
694 :
692 :2005/05/11(水) 19:32:04
書き忘れました。環境はVC++6(SP3)です。 また、同じプログラムが正常動作するXP SP2環境もあり・・・ # どうもウィルスバスターの最新版が入っているとダメなような・・・ # 関係無いと思いますが。バスターのファイアウォールも切ってます
>>694 まず問題の切り分けをすること。
SP が原因なのか、ウィルスバスターが原因なのか。あるいは他か。
アドバイスできるのはそれだけ。
>690 shutdown(SD_SEND)して、recvが0を返すまで待て。
>>695 すみません、バスターの件は余計でしたね。
SP2適用後に動かなくなったので(バスターはその前から入ってた)
SP2が原因というか、トリガーであるのは間違い無いです。
ひとまずは、
>>693 さんのいうところを試してみます。
# loadlibraryしてないので、静的リンクとみていいですよね・・・?
# はいすみません、VCも初心者です・・・・(つд⊂)
SP2 になると、RAWソケットが Admin 権限がないと開けなくなるとか なかったっけ?
699 :
デフォルトの名無しさん :2005/05/11(水) 22:34:32
age
>>697 おれの会社ではバスターアンスコ運動が始まってるぞ
しかし対抗馬は、悪名高い某しまんてっくだ
とりあえず、スニッファでも仕掛けとけ。 APIの戻り値を無視しているなら氏ね。
トレンドマイクロ、x64版をさくっと出せば 失ったユーザーを多少は回復できる見込みもあるんだけど 今は無理だろうね。 ・・・スレ違い失礼。
704 :
697 :2005/05/12(木) 13:43:57
みなさんレスありがとう御座います(TдT)
今
>>703 のリンク先と格闘中ですので・・・取り急ぎお礼まで・・・
環境依存の質問だとは思うのですが、WinSockで大きいデータを分割し て送る場合、どれくらいのサイズが良いと言う目安はありますでしょうか? 一応ADSL1M以上の環境限定で、500バイトぐらいに分割して送って います。この500バイトという数字があまりにも小さすぎるor大きすぎ るということはありますでしょうか?そんなに厳密なものを求めている わけではないので、ある程度のずれは気にしないのですが…
パケットサイズとかでいいんじゃないかな
>>706 そのあたりの具体的な数字が見つからずに質問しました。
同じような環境でプログラムを組んで、何かの資料や経験上から
具体的な数字が分かる方がいないかなと…
テンプレのリンク先で別に8KBという数字は見つけたのですが…
mtu
って、よく考えたら 「小さく分割して送る」と考える時点で socketを理解してないような。
分割は再送を考えてるのか? でもそんな心配もイラン品
補足ですが、正確にはすでにあるでかいファイルを分割するので はなく、もともとファイル自体が細切れになっていて、それを500 バイト単位でまとめて送っている状況です。 Winnyなどが暗号化して細切れになったファイルを送っているのに 近い感じです。 そういう経験があって、具体的な数字が分かる方がいらっしゃると 良いのですが…そんなに簡単にいませんよね…
だから500バイトを100回sendして 500バイトのパケットが100個届くと考えている点が ネットワークプログラミングの初歩を理解してないって事だよ。
>>705 一体何が知りたいのかさっぱり判らんよ。フロー制御がしたいのか?
その500バイトってのは1秒に一回送ってるの?
だったら小さすぎだけど、1ms毎に送ったりしてるなら大きすぎに思える
自分と相手との明確な回線速度は判らないから、1M限定で考えるなら
1割引して120KB/sくらいでいいんじゃないか。
もっと適応性を持たせたいなら、送る量をだんだん増やしていって、
send時にブロックしはじめたら、そこを限界あたりにするとかさ。
TFTPか何かか? TCP使うとは書いてないしな
>>705 ・サイズを気にする理由が書いてない。よって目的不明。
・プロトコルが書いてない。よって技術的検討不能。
・環境が書いてない。よって技術的検討不能。
>>711 答えだけ簡単に書くぞ。
・送る側は何も気にせず全速力で500バイトでも5000バイトでも
好きなバイト数ずつsendすればよろし。CPU能力がボトルネックに
なりそうなら、できるだけ大きい単位で送る。
移植性等を考えないなら、1回のTransmitPacketsで全て送る。
・受信する側は出来るだけ大きい単位で recv して、その後処理する。
頭4バイトにサイズがあるから、などといって4バイトだけrecvするとか
は しないように。
718 :
デフォルトの名無しさん :2005/05/13(金) 14:12:01
スレ違いならすみません Winsockにて Proxy越しに通信してますが リクエストヘッダに Proxy-Connection: Keep-Alive 指定してますが レスポンス後に クライアント-> Proxy間で 通信がきられます。 Proxy->オリジンサーバーでは Keep-Aliveされてるんですが この場合、毎回ソケットを作成して通信しないといけないのでしょう?
Keep-Aliveたんがちゃんと機能しないのおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
>>719 やさしくしてやれ
あと、ときどき思い出させるんだ
rfc嫁
RFCにKeep-Aliveヘッダの説明はない罠 (昔そんなものがあったねと書いてるだけ)
>>722 だからそういう事が言いたいんだろ?
KeepAliveの動作なんて実装依存。
>>718 が環境も書かないアホな以上どうしようもない。
書いたとしてもどうしようもないけどな。
724 :
デフォルトの名無しさん :2005/05/15(日) 20:36:11
winsock2つかってarpパケットを送信するプログラムって作れますか?? ウィンドウズでは無理なのかな・・・
RAW使ったら出来るかもね
726 :
724 :2005/05/16(月) 00:11:14
ありがとうございます。やってみます!!
727 :
デフォルトの名無しさん :2005/05/17(火) 22:39:54
初心者です IEでHPとか見る時って上のレイヤーからどんな風にプロトコルが使われているのですか
728 :
デフォルトの名無しさん :2005/05/17(火) 23:12:19
ソケットってあるけど、どんなプロトコロ使用しているの? TCPで通信。とか、UDP。とか、TCP/UDP ってのぐらいしかしらないんだけど、ソケット使うとき 設定とかしないよね・・・?
するよ
unix ドメインとか
TCPのPは何のPですか?
TCP の P HTTP の P でも UDP の P でも無いよ
なぞなぞですか
いろはのいの字はどーかくの?
こーしてこーしてこーかくの。
バークレイ厨のおかげでスレのレベルが下がってるな
この前もここで質問した者ですが、中々良いドキュメントが見つかりません。 Cで、Windows2k/XPでIPを偽装しTCP/UDPパケットを送信したいのですが、 何か良いのはありませんでしょうか・・
今時、srcipなんか偽装しても、NATとかISPの壁があるとおもうので、 インターネットに対しては使えないと思うが、用途は何?
LAN内で試してみたいだけです、RAWソケットを
740 :
デフォルトの名無しさん :2005/05/19(木) 01:20:54
プログラミングとは直接関係ないのですが… Linuxでtcpdumpを使って以下の動作を確認しました。 lo(ローカルループバックデバイス)に対してパケットを送信するときは常に ・127.0.0.1宛てのパケットなら送信元も127.0.0.1 ・127.10.11.12宛てのパケットなら送信元も127.10.11.12 というように、送信先アドレスと送信元アドレスが同じパケットが送信される。 これを、 ・127.*.*.*宛てのパケットなら送信元は必ず127.0.0.1 というように、送信元のアドレスを固定したいのです。(固定されていればアドレスは何でも良い) このような設定は可能でしょうか? また、このような設定が不可能であるとすると、これはどのレベルで決まっている仕様なのでしょうか? (RFC?loデバイスドライバの実装?) ちなみに、loのサブネットマスクを255.255.255.255にした場合、127.*.*.*(127.0.0.1以外)宛てのパケットは eth0を使って送信されるので、送信元アドレスはeth0に割り当てられたアドレスに固定されますが、 私が実現しなければならないのは、あくまでloデバイス(eth0以外のデバイス)を使ってパケットを送信することなので、 これは解決策にはなりません。 どなたかお知恵をお貸しください。
741 :
740 :2005/05/19(木) 01:21:42
以下は/etc/sysconfig/network-scripts/ifcfg-loの内容です =========== ifcfg-lo =========== DEVICE=lo IPADDR=127.0.0.1 NETMASK=255.0.0.0 NETWORK=127.0.0.0 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) BROADCAST=127.255.255.255 ONBOOT=yes NAME=loopback BOOTPROTO=none ================================
source addressもbind(2)しろ。 man 7 ipしてINADDR_ANYも調べてね。
743 :
740 :2005/05/19(木) 02:02:11
>>742 申し訳ありません。言葉が足りませんでした。
127.*.*.*へパケットを送信するのは私の作るプログラムではなく、sshやftpやtelnet等任意のアプリケーションなんです。
そのパケットを受け取って加工して利用するプログラムを作っています。
>>743 Linux板言って、iptableの使い方聞け。
>>744 iptablesを使って作っています。
送信元=送信先だとIPアドレスだけでは送信方向を判別できないので、
IPアドレスだけでフィルタリング条件を書けないのが不便なので困っています。
ポート番号をフィルタリング条件に利用する場合のプログラムは完成しています。
あらゆるアプリケーションに対して固定の送信元アドレスを強制するのは不可能ってことですかね?
>>745 iptablesにパケットが通らない状態でどうやって制御すんのさ?
一番の疑問はなぜそんな事をしたいのさ?
MSNMessengerの様に、有効なネットワークがあるかどうかを判別するにはどうしたらよいのでしょうか? ネットワークに接続したときに何かメッセージが来るのでしょうか?
749 :
デフォルトの名無しさん :2005/05/19(木) 11:48:19
wininetでGETリクエストをメッセージ付きで送信する時は、 HttpSendRequestにPOST処理と同じようにメッセージを渡せばいいのでしょうか? それとも他の方法を使わないとダメでしょうか?
750 :
デフォルトの名無しさん :2005/05/19(木) 16:07:53
windows98上でcygwinのgcc使ってネットワーク系のプログラム作ってるんだが データリンク(ethernet)を扱うにはどうすればいいんでしょうか ソッケトでは無理らしいし・・・
752 :
デフォルトの名無しさん :2005/05/19(木) 16:19:36
Ford-Fulkersonって偉大ですね。 50年も前にあんな理論を導くとは。
753 :
デフォルトの名無しさん :2005/05/20(金) 18:24:08
WSAAsyncSelect() を使用した非同期通信を行っていますが、 1000バイト以上溜まった受信データをFD_READイベントで引き取る際、 500バイト読み出し、としてrecv()後、次のFD_READがポストされるまでに 500ms近くかかっているようなのですが、この時間って、 変更できないものでしょうか??
754 :
デフォルトの名無しさん :2005/05/20(金) 21:42:33
マイコン(ルネサス製R8C/TINY)にIrLAPを実装しようとしています。 IrLMP、TinyTPも実装しようとしてますが、まずは手始めにIrLAPを 考えています。 Irのトランシーバーモジュールはアジレント製かシャープ製かを採用 するつもりですが確定ではありません。 当方、プロトコルドライバー、あるいはプロトコルスタックの実装経験 がありません。 まずは、リンク層の動作を学びたいと考えてます。 そこで、参考になりそうな下記のサイトを見つけました。 Ethernetの動作過程 www.ese.yamanashi.ac.jp/~itoyo\lecture\network\network07\ethernet.htm ここでは、『回線監視』、『送信』、『受信』の大まかな流れが解説されて ます。 もう少し詳しい解説が欲しいのですが、適当な書籍、WebSiteを教えてください。 よろしくお願いします。 www.irda.orgよりIrLAPの仕様書(英文)は入手済みですが、なにぶん 英語が苦手でスラスラ頭に入ってこない状態です。
巨大ファイルをソケットで送受信したいんですが、 途中で切断された場合に備えてリトライ付けるべきでしょうか
ひどい。。
リトライは不要。それはただのおせっかい機能だよ。
つーか仕様次第。 デーモンみたいに裏で稼働してる奴なら自動で数回リトライしてみる 事もあるし、リトライ可能な作りにはしたけど疎通試験段階で「やっぱ 無くていい、つーかあると処理キュー埋まってまずいからリトライ回数 0に設定」なんて事もあるし、普通のGUIアプリならエラーダイアログ 出してリトライするかユーザーに選択させる事もあるし。 まぁ後々「やっぱ必要だわ」となる可能性があるなら、リトライ可能な 作りにしておくのはいいと思うけど。
いや、やっぱりいらないよ。自動リトライのような甘ったれた機能はダメ人間の育成につながる。
リトライよりも中断したとこからの再開だろう、有用なのは
762 :
デフォルトの名無しさん :2005/05/21(土) 20:18:10
リストに対するオペレーションのログを取って、相手先のマシンでそのログを適用するとかは?
ハッシュをキーとした連結リスト作るとかは駄目かな?
765 :
762 :2005/05/21(土) 20:59:58
すいません。質問の仕方が悪かったようです。 リストに対する挿入・削除のときにポインタでアドレスを直接指定することが出来ないので 何か間接的な方法でセルを指定できないといけなんですよね。 今考えているのは リストのセルを追加するタイミングでセルごとに一意な共通の整数値を割り振って、 その整数値に対して挿入・削除を実行すれば連結リストの構造を保ったまま通信が出来る、というものです。 要するに論理アドレスみたいなものを導入するという…
766 :
デフォルトの名無しさん :2005/05/21(土) 21:02:58
論理アドレスの管理や探索が大変になりそうな感じだけど、 これがベストなのかな?
>>763 >リストに対するオペレーションのログを取る
リストに対して例えば挿入を指示するとき、そのセルへのポインタを引数として渡すよね。
異なるマシン間でポインタは一致しないから、それだとダメっぽいけど
768 :
デフォルトの名無しさん :2005/05/21(土) 21:07:19
>>762 あーそういう問題があるんだ
昔ネットワーク上でソート済みのListを受け渡してたら
なぜか、受け側でソートが元に戻ってたんだよな
そういう理由があったのか
論理アドレスはどういうデータ構造にするの? 指定されるたびに一々走査したら効率悪くない?
>>767 リストなんだから、直アドレスが分からなくてもオペレーションの書き出しは
可能でしょ
771 :
770 :2005/05/21(土) 21:22:28
リストを探索したくないというなら知らない
772 :
デフォルトの名無しさん :2005/05/21(土) 21:28:28
パッソプチプチプチトヨタ
773 :
770 :2005/05/21(土) 21:43:56
>>765 そのやり方なら ID はセル内に持たせるのではなく、外にアドレスマップ作った方が
キャッシュを有効に使えるかもしれないね
インターネット接続状況を取得する方法を教えてください
775 :
デフォルトの名無しさん :2005/05/22(日) 07:31:23
なんか重要な更新インストールしたらRAWソケットで送信ができなくなった。 ipconfigでv6のアドレスが出てくるようになったし・・・
難しいんじゃなくてスルーされてるだけじゃん 聞き方が悪かったんじゃないの?
やってやるよ。でも結構めんどいな。火曜まで待ってくれ。
780 :
デフォルトの名無しさん :2005/05/22(日) 19:25:37
>>775 漏れは1とか255とか17とか登録されたプロトコルだけしかパケットが送信できない。
781 :
777 :2005/05/22(日) 20:01:01
>>779 マジですか!?ありがとうございます!待ってます!!
>>781 おい信じるなよ。宿題スレ以外で宿題やってくれる香具師なんぞいないぞ。
やってやるよ。でも結構めんどいな。週末まで待ってくれ。
よくわからんが、自分でやって分からないところを質問したらどうなんだ
JEDI Server ってなんですか?
フォースの使えるサーバー
787 :
デフォルトの名無しさん :2005/05/24(火) 00:06:40
つかぬことをお聞きしますが、UNIXドメインのソケットで スレッド間通信をすることができるのでしょうか? ぐぐっても、スレッド間通信にソケット通信は出てこないようなので。
example.ne.jp って例のための予約ドメインだと思うけど こんな感じの 例のための予約IP ってあるかな
793 :
777 :2005/05/24(火) 23:00:43
>>777 騙されてるのに気が付いてない馬鹿(´ー`)
とりあえず、授業中にあったらしい細かい仕様の説明の内容を教えれ。
796 :
779 :2005/05/25(水) 01:39:38
>>793 ごめんごめん。おれアメリカに住んでるから PST での火曜日ね。
797 :
779 :2005/05/25(水) 01:42:44
あ、今夏時間だから PDT だね。 あと 14時間くらいだからマターリしてな。今ごりごりコーディング中だから。
これって、画像、素材用意しないといけないのじゃ...
まあ普通に頼んだ側が悪いな
>>796 何で武蔵工業大学(MITw)がアメリカにあるんだよ!!
802 :
デフォルトの名無しさん :2005/05/25(水) 20:30:42
Win2kでVC++6とwinpcapを使ってパケットモニタを作ろうとしているのですが、受信したパケットを IPとかARPとかに仕分けるところではまってます。 参考にしている本では受信してきたパケットの先頭をstruct ether_headerなる構造体に キャストして、メンバのether_typeで判定しているのですが、VCのinclude以下にあるファイルを すべてgrepしても該当する構造体が存在せず、また、winpcapにも該当する構造体が存在せず コンパイルできません。 参考書は「基礎から分かるTCP/IPアナライザ作成とパケット解析 第2版:小高知弘:オーム社」で、 中に書いてあるコードはLinux/FreeBSD対応とのことです。 よって、VCではそのままでは動かないのは分かっているのですが、ether_headerなる構造体と 同等のものが提供されていないか、されているならなんと言う名前なのか教えていただけないでしょうか
イーサネットのヘッダなんかWinとLinuxで違うわけもないんだから、 Linuxのほうのソースから引っ張ってくればいいと思うが。
804 :
777 :2005/05/25(水) 21:42:39
struct ipなる構造体と(ry
807 :
805 :2005/05/25(水) 22:08:24
おまいら、すまんこ。
メールのUIDLの取得方法を教えてください
>>809 pop3で接続してUIDLリターン
なんてったってIDOL
811 :
デフォルトの名無しさん :2005/05/27(金) 11:21:10
ネットワーク障害のテスト用に やたらと遅延したりパケットを失わせることができる ブリッジを作成したら、売れますか?
残念ながらもう売っているよ。
そういうブリッジには日勤教育が必要
814 :
デフォルトの名無しさん :2005/05/27(金) 13:22:24
>>812 マジですか
作るの面倒なのでそれはありがたい
なんかソフトウエアでそんなのあったような
FreeBSD bridge で検索すると、わらわら出て来るよ。
ネットワーク シミュレータ パケットロス で検索すると、わらわら出て来るよ。
サーバアプリ作ってまして、 不正なクライアントということが判った後に 通信をその時点で打ち切りたいんですがshutdown/closeで良いですか?
819 :
デフォルトの名無しさん :2005/05/28(土) 02:04:03
FAQサイトが見れねーんだけどよ?
俺は見れたんだけどよ?
821 :
デフォルトの名無しさん :2005/05/28(土) 02:15:01
822 :
デフォルトの名無しさん :2005/05/28(土) 02:30:07
やっぱみれねーぞゴルァ
他のところをみろよ。
LinuxからWindowsに1パケット(1500B以下)だけ送ると2パケット以上送るより 処理が5倍ぐらい遅いのですがなぜなのでしょうか?
>>824 どうやって、測ったん?
まずは、そこから検証してみようじゃないか?
>824 ・1500B以下とは、(826をみると、TCPのようだが)TCPのペイロードサイズなのか、 IPのペイロードサイズなのか、L2のペイロードサイズなのか、L2のフレームサイズなのか? ・L2は何なのか?Ethernet?GRE、IP-in-IP、IPsecなどのL3トンネル?L2TPv3、SoftEtherなどのL2トンネル? ・途中の構成はどうなのか?クロス直結?リピータハブ?スイッチ?ソフトウェアルータ?ハードウェアルータ(GSRとかMとか)? ・送信完了までの処理時間なのか、受信完了までの処理時間なのか? ・どうやって測ったのか?送信側でtcpdump?受信側でtcpdump?途中のスイッチでポートミラーか、sniffer proみたいなスルー機能つきの測定機でキャプチャ? ・Linuxのカーネルバージョンは何なのか。libcのバージョンは何なのか。 ・NICは何なのか。(いろいろオフローディングできるカードなのか、蟹みたいにPHY層しか持たないカードなのか) 俺の予想→LinuxにTCP_NODELAYが実装されていない。
環境は、光回線+WebCasterにDELLのノート2台接続しています。 余計な機器を間にはさんだりなどはしていないです。 簡単なHTTPのデータを投げてそれを相手側で取得するようなプログラムを作成 しています。Windows同士だと400Bのデータが最大55msec平均38msecで送受信されます。 Windows/Linuxだと最大で170msecで送信がなされ平均150msecで送受信されます
Linuxの糞さ加減は今に始まったことではないが、 こうしてデータが出てくると「やっぱり乞食OS・・・」と思ってしまう
>>829 Linuxが貧乏OSだってそれで商売してる人には関係ないよ。
アホクライアントがLinux使いたいって言えば、それだけで
Windowsよりも高い開発費と保守費がゲットできるんだ。
だからおれはLinuxは大好きだぜうぇっへっへ
>>827 >俺の予想→LinuxにTCP_NODELAYが実装されていない。
なんでこんな予想が出てくるか理解に苦しむ。
>>828 で、TCP_NODELAYは試したの?
winsockのWSAAsyncselect()での非同期というものがよくわかりません。 lEventで指定したものだけが非同期になるんですか? それとも、lEventというのは飛んでくるメッセージを指定するだけのものですか? あと、非同期でのsend()の方法がよくわかりません。 FD_WRITEってどういうときに飛んでくるのか、MSDNの説明だといまいちわからないんですが。 送信可能なときというのがよくわからない。 send()が終わったときに飛んでくるのではないんですか? 非同期で、 int x ; char *buf = (char *) malloc(100) ; x = send(s, buf, 100, 0) ;//帰ってくる値が100より小さかった場合、差分をもう一度sendしないといけないの? //malloc()したメモリはここですぐにfree()していいの?
833 :
デフォルトの名無しさん :2005/05/29(日) 16:14:31
>>832 >lEventで指定したものだけが非同期になるんですか?
NO
setsockoptでSO_RCVTIMEOやSO_RCVTIMEOを0にすると非同期になる。
>それとも、lEventというのは飛んでくるメッセージを指定するだけのものですか?
YES
>送信可能なときというのがよくわからない。
文字通り送信可能なとき。バッファに空きが無くて、sendされてもデータを受け取れないときや、
送信側のpeerが切断されているときは発生しない。
>//malloc()したメモリはここですぐにfree()していいの?
かまわない。
834 :
832 :2005/05/30(月) 00:27:35
>>833 ありがとうございます。
もうひとつ、
send()って、一度に送れるデータ量って決まっているんですか?
それとも、何十MBだろうと一気に送っていいものなの?
あまり大きいとエラーになるけどね
837 :
デフォルトの名無しさん :2005/05/30(月) 02:38:33
戻り値はちゃんとチェックしろよ。 指定したサイズ以下しか送られない場合もあるぞ。
838 :
デフォルトの名無しさん :2005/05/30(月) 06:14:49
プログラミングの立場としてではなく、どちらかと言うとユーザの立場から 質問します。 現在の私のhttpアクセス環境は以下の通り OSLinux(2.0よりは上) ウインドウマネージャ(でしたっけ、とにかくX環境)kde 一応自分なりにipchain だとかの設定は強固にした(つもり)です。 どうやらアプレット系のウイルスかワームをもらったようです。ですが それを特定できません。したがって、そいつが悪さを起こすたびに ADSL接続の電源を切り、リブートという始末です。 システムモニタプログラムとかでも監視していますが、私の技量では 問題を特定できません ~/home/MYFolder/ 以下の .kde の中を覗いたり /tmp/ 以下を 覗いたり、"netstat -alp(または-anp) | less" コマンドを打ったりしますが、私の技量では問題を特定できません だいたいX環境というものは、manにたいおうしていないのか、 man kde とかやっても、kdeinit をなのる各種のプロセス?がなにを どのようにしているのか調べられず、困ってしまいます
839 :
デフォルトの名無しさん :2005/05/30(月) 06:20:03
ウイルスの症状は、突然マウスフォーカスが定まらなくなり、 画面の下のメニューバー?がちらちら動きだし、なおかつ不特定多数の ウインドウやプロセスが起動しようとして画面上で暴れる、というものです。 マウスフォーカスのコントロールを失っているため、システムモニタで 調べたくても調べられず、キーボードフォーカスも失っているため、 わたしのしっている数少ないコマンドも使えません 私の環境に付いて、ほんらいならもっと詳しく述べるべきでしょう。 でも私の今の状況では正直、UNIX系OS を通じたhttpアクセス全部が 信頼できず、したがって linux(ver2.0以上) & kde としか 申し上げられないという事をお詫びしておきます。
840 :
デフォルトの名無しさん :2005/05/30(月) 06:27:24
>>838 man kde とかやっても、kdeinitをなのる各種のプロセス?がなにを
どのようにしているのか調べられず、困ってしまいます
説明がたりませんでした。
それは、そうやっても、マニュアルとはつながっていないためです
雑誌付属のCD-ROM(当時)のディストリビューションだからでしょうか、
商用ディストでないのに、(kdeの)ソースコードすら付いていないのです
> プログラミングの立場としてではなく、どちらかと言うとユーザの立場から > 質問します。 激しく板違い 犬板池
- アプレット系ウイルスってどういうものだと思っているの? 説明してみ - httpアクセス全部が信頼できない理由は何? なんでアプレット系ウイルスで http が出てくるの? - httpアクセス全部が信頼できない場合は OS 名を書かなくてよい、という理論が わけわからん。 - (kdeの)ソースコードが付いてなくても何も問題はない。つーかおまいソース あったって何もできないでしょ。 - スレ違い。
httpについて調べようと思ってhttpでI'm feeling luckyでググったら変なところに飛ばされました。
844 :
デフォルトの名無しさん :2005/05/30(月) 11:42:57
http規格にはパグが居るよ。 最初のリクエストヘッダの前に、生ソケットのICMPで 相手にキューの準備を要求するんだけど、そのときに、 もしも前のhttpパケットの最後のバイト値が、0x450xff0xffだとすると、 それが、次のパケット要求になるので、 もしもキュー要求の最初のバイト値が同じだと、 直立するレッサーパンダよりもパグのが見つけにくいよ。
845 :
デフォルトの名無しさん :2005/05/30(月) 11:45:07
> 最初のリクエストヘッダの前に、生ソケットのICMPで > 相手にキューの準備を要求するんだけど キティガイ?
>>839 wheel 付マウスの設定の X に
あとから 3 ボタンマウスを繋ぎ替えたときに
同じような症状になったことがある。
とりあえずマウス換えてみそ。
いずれにせよすれ違いだが。
848 :
デフォルトの名無しさん :2005/05/30(月) 20:36:46
先程すれちがいしてしまったのはBokuです。
>>847 3ボタンのwheel付きマウスは使っていますがつなぎ替えた事は無いのですが。
/home/katyo/.kde/share/config/
の下にリソースファイルなどを書き込むのは、Kdeプログラムの何と言う
関数がかかわっているのでしょうか?
せめて .c や .h, .cpp 名が分かれば、KDEホームページのCVSで
(バージョンは違うのですが)ソースを覗いてみたいと思います
そこのフォルダ下に不審な(?)ファイルがあるのですが、確信が無いため取り除けません
"ブラウザ名称: 英数値列40個くらい" という名称です
末尾に"rc"もつかず、そんなファイル名なので不審に思いました
だまされたと思ってマウス替えれ
850 :
デフォルトの名無しさん :2005/05/30(月) 21:05:29
>>849 842ですが、マウス交換を検討してみようと思います。
ところで
ここで netstat コマンドの出力で生成される UNIX Domain Socket の出力項目に関する
質問をするのは、これまたすれ違いですか?そうでないなら質問したいのですが
>>850 それ、ネットワークプログラミングに関係あるの?
よく考えてから物言えよ。
852 :
デフォルトの名無しさん :2005/05/30(月) 21:29:58
>>851 >>1 に "主にソケットに関しての質疑応答スレです"
となっていたので、(Unix Domain)Socket の質問をしようと思ったのですが
どうやら、立ち去った方がよさそうですね。
この板はプログラム板だから、もしプログラミングに関係するなら
> netstat コマンドの出力 犬板逝け
855 :
デフォルトの名無しさん :2005/05/30(月) 22:17:01
>>837 ってマジ?
sendの戻りなんかチェックしてないわ・・
857 :
デフォルトの名無しさん :2005/05/30(月) 22:36:36
いやー、SOCKET_ERRORかどうかはチェックしてるけど、 こういうのだし return send(sd, buf, bufsize, 0) != SOCKET_ERROR; もしもサイズ分送れなかったら、 繰り返しsendで残りを再送していいのかな。 char *p = buf; int size = bufsize; for (;;) { int r = send(sd, p, size, 0); if (r == SOCKET_ERROR) { // エラー処理 break; } else if (r == size) { // 全部送った break; } else { // まだ残ってる p += r; bufsize -= r; } } こんなんで 上の他に何か必要なものありますかね
858 :
デフォルトの名無しさん :2005/05/30(月) 22:39:30
size -= r; の間違い つーかやべーな 既に稼動してるのとかあるしw
通報しました
やっべーおれもだよ sendの戻り値か・・・ あれ?sendって実行時に送信するわけじゃないよな 実装にもよるけど、たいていはキューにぶち込まれて あとはOSが処理しないか? TCPなら再送もあるし待ってらんないんじゃ? あれ?でもそれはノンブロッキング時のみの話か? ちょっと妹に聞いてくる
>>860 > 実装にもよるけど、たいていはキューにぶち込まれて
これは仕様で保証してないわけでしょ?
てゆうか、キューが中途半端に一杯だと、partial write に なる。キューが完全に一杯ならブロックするけど。 あるいは、キュー自体より大きなサイズを送ろうとしても 同様に partial write になる。 UNP読んでれば常識。WindowsプログラマーでもUNPだけは 読んどけ。
UNPって何? うん(ぴー)こってこと?
>>2 にある UNIX Network Programming のこと
みなさん fwrite とかでも戻り値見ないんですか?
楽しくなってきたぞ
うはwwwww fwriteのは第三引数で与える項目数だけ*出力する*んだよねー 趣が全然違う
>>867 「出力することを試みる」けど、成功するとは限らない。
RETURN VALUES
The functions fread() and fwrite() advance the file position
indicator for the stream by the number of bytes read or
written. They return the number of objects read or written. If an
error occurs, or the end-of- file is reached, the return value is a
short object count (or zero).
つーか“出力する”を強調している理由がわからん
ネットワークのパスを自動化(例えば) EcoPassIEUのネットワーク版、ありましたらよろしくです。
network pathの自動化だって?ripdでも動かしとけ。
>873 ripd今調べてみましたが 一般には敷居が高いようなZebraサーバーとか・・・
話がかみ合ってないのに会話できてるのはなぜだw
876 :
デフォルトの名無しさん :2005/05/31(火) 20:12:02
>>857 sendは成功すると必ず1バイト以上は送ることを保障する
よって
>>857 はエラー処理を除き完璧なソースと言える
普通にプログラム飛ぶでしょ
基本を知らないのにいきなりプログラムしてる奴が多いのに驚いた。 これから時間をかけてそのツケを払うんだろう、スマートじゃ無いなあ
エラー処理が省略(または無視)されたサンプルソースや ネットに転がってる他人のソースを見てモノマネで作るからいけない。 関数リファレンス見て自分で考えて創る香具師がめっきり減った。
JAVAのSOCKETはSENDの戻り値なんてありませんよ? ダサいですね。>UNIX
sendに成功しても向こうに送れてるとは限らんしねぇ。 さらに上のレイヤで確認しないといけないかも。
どちらにせよ確実な確認方法は無いよ。 結局はエラー処理のエラー処理になって、永久に確実な方法にはならない。 無駄にレイヤーが増えるだけですよ
みなさん fwrite とかのあとに verify しないんですか?
send() の返り値をチェックするのは送信できているかどうかを確認するため。 届いてるかどうかは別問題だろ。
TCPだと届いてなかったら届くまで再送する(その間sendはブロックする)んじゃないの? UDPだと送ったというだけで届いているかどうかは知ったこっちゃないが
>>886 届くまで何回か再送を試みるが、sendはブロックしないよ。
再送を試みた結果、駄目だったら接続が閉じられる。
閉じられるまでに、何処まで正常に送信されていたかは、分からないな。
つまりバッファが一杯になるまではブロックしないってことだよな?
送信バッファのことを忘れてたorz バッファがいっぱいになるまでは送信に成功したとしても 届いているとは限らないってことね。
「チッ!UDP使ったけどパケット落ちまくりやがる。やっぱTCPだな」
と言ったことのある香具師のうちの何人かは
>>855 みたいなヤツなんだろうな。
戻り値チェックしなくちゃいけないのはTCPでも一緒でしょ
戻り値チェックしなくちゃいけないのはダムファイルでも一緒でしょ
send()は「送信バッファにmemcpyする」だぞ。 判ってんのかなあ。
>>894 ギャハッハハwwwwwwwwwwwww
RAWsocketについて勉強したいんですけどおすすめのサイトとか本ってありますか?
もちろんありますよ
うむ、オレにもあるな
>>891 返り値調べればパケットが落ちたどうか分かると思っているんでしょうか?
>>896 俺はわかんないことがあったら妹に聞いてる
いいなあ
UDPは黙って捨てることがあるんだったな
ルータのqueueが溢れたらUDPはそのままネットのもくずと消える
もずくで一杯やりたくなってきた
俺はUDPで一杯やりたい。
908 :
デフォルトの名無しさん :2005/06/05(日) 20:57:07
WinSockで、 bind()で、SO_REUSEADDR エラーになる。 bind以前に、同じアドレスでbindしたソケットは、closesocket してる。 ただしその前に、そのソケットでWSAAcceptやって、ソケットを1つ生成してる。 生成したScoketでは、bindしてない。 どこが悪いんでしょうか。
909 :
デフォルトの名無しさん :2005/06/05(日) 20:59:34
間違えた。 SO_REUSEADDR エラーじゃなくて、WSAEADDRINUSE エラー
911 :
デフォルトの名無しさん :2005/06/05(日) 21:17:27
WSAAcceptで生成されたソケットには、元のソケットのポート番号が割り当てられているということ?
913 :
デフォルトの名無しさん :2005/06/05(日) 21:44:02
>>912 2.7 TIME_WAIT 状態について考えてみました
TCPは、closesocketで閉じられたときにも、ソケットが有効に働いてることは、
これはTCPは、あなたのお友達であり、助けであるのです。
喪失されたと思われたパケットは、これは実際にはデータが失われていないで、
ルータを徘徊していたゾンビだったのかもしれません。思い出してください。それは、
きっと大切でしょう。ソケットを賢く使うのにおいて。
しかしだね。
WSAAcceptでソケットを生成しないで、bindしたソケットを閉じて、
すぐに、それと同じアドレスとポートで、新規ソケットでbindしたときは、エラーにならないよ。
914 :
デフォルトの名無しさん :2005/06/05(日) 22:08:17
WSAAcceptで生成されたソケットを閉じて、 WSAAcceptしたソケットをまた使い続けることができる。 ということは、WSAAccept でソケットが生成されたときは、 同一プロトコル同一ポートのソケットが、2つになる?
まあ、そうだ。但し、ローカル側のプロトコルとポートが同じなだけで、 同じものじゃないことに注意
916 :
デフォルトの名無しさん :2005/06/05(日) 23:54:41
>>195 ソケットは、IPアドレスと、プロトコルと、ポートによって識別される。
だから同じじゃんよ
物事は正確に言おうや。 ソケットは、Protocol, SrcIP, SrcPort, DstIP, DstPortによって識別される、と。
>>918 省略語ばっかりで正確さに欠けるので、もう少し正確にお願いいたします。
TCP接続は、
<発信元IPアドレス、発信元ポート番号、発信元受信元IPアドレス、発信元ポート番号>
の四つ組でユニークに識別されるけど、
>>916 から話がずれてきている。
921 :
デフォルトの名無しさん :2005/06/06(月) 18:04:25
>>918 、920
ヘーそなんだ。
そんで、ソケットに割り当てられている、
Protocol, SrcIP, SrcPort, DstIP, DstPort
は、どうやって取得するの?
>>918 socketはsocket descriptorによって識別される、と:b
少しは自分でしらべろよ getsockname() getpeername() をつかえ
getpeernameすれば、DstIP, DstPortがとれる。 getsocknameすれば、SrcIP, SrcPortがとれる。 Protocolは、両方でとれる。
925 :
デフォルトの名無しさん :2005/06/06(月) 18:16:40
getpeernameなんてあったのか。 ソフトバンクの、WinSock2.0プログラミングには、載ってないよ。 どこに載ってるの?(日本語で)
926 :
デフォルトの名無しさん :2005/06/06(月) 18:19:02
ごめん載ってた。 ただし、リファレンスに。 索引は載ってない。つまり、本文の中で扱ってないのか
927 :
デフォルトの名無しさん :2005/06/06(月) 18:37:22
一気にパケットをいくつか送信して 受信側から受け取り確認されてないものだけ タイムアウトを決めて送信するプログラムを作ってるのですが。 送信メッセージとエラー率を多くすると、Interrupted System Call って言うエラーが出てきます。これを回避できる考えがある方、 ご意見お待ちしております。
>Interrupted System Call これは、誰が・どこで・どうやって出してるんだ? あと、環境を書け。
929 :
デフォルトの名無しさん :2005/06/06(月) 18:44:16
そうでした。すいません。 Red Hat Linux 9 gcc 3.2 自分のPCで送信者と受信者、サーバを扱い、シュミレーション みたいなことをやっています。 エラーはサーバから出されました。
930 :
デフォルトの名無しさん :2005/06/06(月) 19:18:24
なんかソケットのソケット番号から OSにIPアドレスとかポートとかを聞き出す 関数ってなんだっけ? あーOSはLinuxでおねがいします。 つーか、ネットワーク関連の関数の 逆引き索引みたいなやつってないの?
わずか10レスも見ないとはひどいものだ。 まったく最近の釣りもレベルが低くなったことよ。
>>927 ,929
たぶんalarm使ってゴソゴソやってんだと思われるが、
readかwriteの実行中にSIGALRMが来てるだけだろう。
sigaction使ってSA_RESTART指定しろ。
933 :
デフォルトの名無しさん :2005/06/06(月) 21:52:10
>>932 ありがとうございます。
今からやってみます。
934 :
デフォルトの名無しさん :2005/06/06(月) 23:41:50
>>931 ありがとう
あとは、逆引きの索引がほしいなあ
スレ違い。
getsockname/getpeernameは、getsockaddr/getpeeraddrだったら、
gethostbyname/gethostbyaddr, getaddrinfo/getnameinfoとの親和性が良かった。
>>934 以上をmanで読むこと。
>>930 の言っている「逆引き」つーのは、
こういう事したいんだけど、使うのはどの関数? ってことでしょ?
昔はman/man -kで探し当てていたけど、
Linux(で日本語)なら、googleで「キーワード JM site:linux.or.jp」でどうよ?
>つーか、ネットワーク関連の関数の >逆引き索引みたいなやつってないの? これって機能から関数名を調べたいっていう意味だろうね
逆引きが必要なほど沢山関数あるかね? UNIX系の場合、たいした数じゃないので、 全部覚えた方がいいような気がするが。 WinSockだとあるのかな?
つーか、man -k
つーか locate と grep
943 :
デフォルトの名無しさん :2005/06/10(金) 00:30:41
getsockname とかに辿り着くまでにすげー時間かかったんですけど
だからソケット関係だけでも一度マニュアルを全部ざっと読んどけ。
945 :
デフォルトの名無しさん :2005/06/10(金) 00:53:28
こういうところがいやなんだよな ろくなドキュメントをそろえもせずに 口を開けば find grep man あげくのはては ソースミロ あほちゃうか
体系化されてない関数群なんてゴミ以下だよ その場しのぎの拡張の連続
特に socket 周りの関数群はひどいね 支離滅裂
そりゃそうだけど、socket(2) 見れよ、って感じ。FreeBSD 以外に あるかどうかは知らんが。
とはいえ、逆引きの資料があったって別にいいわな。読みたい人はいるわけだし。 誰か書いて売ればいいじゃん。 「TCP/IP 500の技」ってのがあるけど、getsockname は買いてないみたいね。
そんなに支離滅裂かなあ。バックグラウンドにある
概念を素直に括り出しただけだと思うけど。
支離滅裂だと思ってる人は、実はソケットの概念を
ちゃんと理解してない希ガス。
UNIX の socket API なんて、4.2BSD の時に定義
されてからほとんど変わってないので、
>>946 の
言うようなその場しのぎの拡張なんてものは、
そもそもないわけだし。(WinSock は知らん)
あと、handbook もいいけど、
/usr/share/doc/psd/20.ipctut/
/usr/share/doc/psd/21.ipc/
も読んだ方がいいような。
*BSD系の場合ね。Linux は知らん。
まあUNP読めばいいんだけどね。和訳もあるわけだし。
> バックグラウンドにある概念を素直に括り出した 言い換えれば、要するに「低水準」「そのまんま」「剥き出し」 なインタフェースなんだよな。 昔から概念が存在するファイルのようには、高度に抽象化・単純化された インタフェースにはなってない。 ソケットプログラミングは、open/read/write/closeでは済まずに 皆にioctlを強要するようなイメージ。 もっと標準に近いところで、Java程度に手軽なC/C++ライブラリが あるといいのだが。
あんまし単純化されちゃうと面白みがなくなる
んなことない。 普通socket/getaddrinfo/connect/read/write/closeだけで 済みますよ。openがsocket/getaddrinfo/connectに変わった だけで、ファイルアクセスとレベルは変わらん。
>>955 おめでたいな・・・
趣味レベルにとどめとけよ
やりたいことにもよるが、
>>955 の範囲で書けるプログラムも
多いでしょ。たとえば古き良き finger なんて、実際その程度
のことしかしてない。
それ以外のAPIが必要なのは、socketシステムコールがファイル
アクセスシステムコールよりも低レベルだからじゃなくて、
背後にある概念がファイルアクセスよりも複雑だからだな。
レベルの高い低いは似たようなもん。
>>945 >ろくなドキュメントをそろえもせずに
>口を開けば find grep man
じゃお前の部署で書いて晒せ
うちには予算が無い いや~ん(//∇//)
>>953 凝ったことしなくてイイんなら、ディスクリプタを fdopen に突っ込めば
イイんじゃないの?俺は使ったことないから知らんけど。
>>959 実際、4.3BSD以降の finger は、まさに fdopen() にソケットを
渡してる。
ただし stdio の実装がタコタコなOSだと駄目かも。
例えば SVR4 の 4.0.3 以降、4.1 より前では、fread() で
partial read を正しく処理してないため、ベンダが独自に
直してない限り fread() を使うと問題が出る筈。
むしろなんでもファイルにしようという概念が好かん fd扱ってても結局ファイル扱ってるのかパイプ扱ってるのか ソケット扱ってるのか意識しなけりゃならないし
生成するときはそれぞれゴチャゴチャと設定が必要だけど とにもかくにも作ってしまえばあとはまあそれなりに ディスクリプタを等価に扱える ってのは便利だよな 問題は生成時の処理のデタラメ加減なわけだが
>>961 「ファイル」って…「入出力ストリーム」です。
デバイスも入出力ストリーム・・・ と言えなくもないか
あんなに簡潔なAPIを、ゴチャゴチャとかデタラメとか 表現する感覚が理解できん。 ストリームをディスクリプタで抽象化するという概念を ちゃんと理解していたら、あれ以外の選択肢は、ほぼ あり得ないのは明らかなのに、そういうことも分かって ないのね。かわいそう。
struct sockaddrをベースクラスのように扱って、サイズを見て判断 みたいなのはCだからしょうがないところはあるが、 キャストだらけの汚いコードを書かされる元 ユーザコード側の至る所でhtons, htonlなどを使う必要があるが、あれも もっと減らせるだろ プロトコルスタック側で変換かけりゃいいんだから
インターフェースは簡潔なんだけどね
getaddrinfo(3) と sockaddr_storage を使ってれば、いまどき キャストなんて要らないよ。 sockaddr は opaque な型として扱うので、sockaddr_in みたいな 構造を触る必要もない。当然 htons や htonl も全く使わない。 感覚古すぎるよ...
いきあたりばったりの拡張であることは事実
windowsのapiよりは…
>>970 socket 関係のシステムコールは 4.2BSD の時に今のものと
ほぼ全く同じものが実装されて、その後、インターフェース
は特に変わってないんだけど。
自分が無知なのを自覚してないのか、それとも分かってて
デマを流しているのか、どちら?
まあ当時はIPv6とかは無かったわなあ
で、IPv6 でも、4.2BSD で設計されたシステムコールが そのまま全く同じように使えると。こういうのは、普通 いきあたりばったりじゃなくて、先見の明があるって言 うよね。
getaddrinfo()とかは新しいでしょ あ、あれはシステムコールじゃないか
まあでも、アドレスファミリー・プロトコル依存性だとか
>>966 の言う汚さを隠蔽するために新しいインタフェースが導入されてるわけで
>>968 の言うような世界はもともとは無かった訳だから
>>970 の言うことも必ずしも間違いとは言えまいよ
そう? いきあたりばったりってのは完全に間違いだと思うけど。 右に左にフラフラしてたわけじゃなくて、まっすぐ自然な拡張 だと思うよ。システムコール自体は、最初っからプロトコル独立 になってたわけだしね。
プロトコル独立だけど透明ではなかったわけだ だから後で隠蔽するラッパーを作る必要があった
>>978 ひょっとして全然分かってないんじゃない?
IPv6を利用する場合のAPIは、システムコールに
ついては以前と全く同じで、ラッパーでも何でも
ないよ。
ライブラリ関数として実装されていた以前の
gethostbyname(3)/gethostbyaddr(3) が、別の
ライブラリ関数である getaddrinfo(3)/getnameinfo(3)
に置き換わるだけ。これも、置き換えであってラッパー
じゃない。
ライブラリ関数=システムコールのラッパーという意味で書いたんだけど まあどうでもいいや 置き換えは置き換え。ようするにインタフェースが代わったのは事実だよね 昔のままでは対応できなかったと。
gethostbyname getipnodebyname gethostbyaddr とコロコロかわってますな
gethostbyname(3) や getaddrinfo(3) を システムコールのラッパーと考える奴は 根本的にモノを分かってないと思われ。
>>981 gethostbyname()とgethostbyaddr()を並べて「コロコロかわってる」って
言うわけね。(w
とりあえず、君はプログラミングはしない方がいいよ。
いいよ俺はアフォでもモノがかわってなくても。
でも、インタフェース変わってるのは事実でしょ。
で、なぜか昔からかわってないんだと主張する香具師もいれば
>>968 みたいに、新しいインタフェースなら綺麗なんだと主張する香具師もいる
>>982 getaddrinfoは本質的にはgethostbyname, gethostbyname2のラッパーじゃないのか
アドレスファミリの差異その他を隠蔽するための
inet_addr()のように使い物にならないとされて消えたのもあるな
システムコールは昔から変わってないし、 ネームサービスのためのライブラリ関数は、昔の プロトコル依存した関数から、プロトコル独立の きれいな関数に変わった。 全然矛盾してないと思うけど? いきあたりばったりっていうのは、拡張に拡張を重ねて、 迷路みたいになったインターフェースことを言うんだよ。 昔よりずっと見通しが良くなったのを指して、いきあた りばったりと表現するってのは、プログラミングだけ じゃなくて日本語のセンスにも問題があるのでは?
なんだ単に「いきあたりばったり」って言葉にこだわってるだけか もしかして? それこそどうでもいい話だな
size_tがsocklen_tに変わったりとか まあ色々あるわな ネームサービス周りだけじゃないだろ
>>981 gethostbyaddrじゃなくて
getaddrinfo
だった
まぁどうでもいいな
しかしなんでそんなに必死なのか
>>989 size_t が socklen_t になったんじゃなくて、
int を使ってる OS と size_t を使ってる OS があった
ので、共通のソースにできるように socklen_t が定義
されただだよ。
つまり実際には型は変わってない。名前が統一されただけ。
行き倒れマッタリ
ひとり基地害がいるね
どこどこ?
商用UNIXではシステムコール並の扱いだけどね。
それが何か?
close(13);
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。