2 :
デフォルトの名無しさん :04/03/31 00:00
3 :
デフォルトの名無しさん :04/03/31 00:02
本、URL等は、前スレに出たものも含めて少し再構成しました。 補足あったらよろしく。
}!Z
6 :
デフォルトの名無しさん :04/03/31 00:58
8 :
デフォルトの名無しさん :04/03/31 07:06
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/raw.7.html に
「raw ソケットが必要になるのは、新しいプロトコルを設計する場合か、
ユーザーインターフェースを持たないプロトコル (ICMP など) を扱う場合に限られる」
と書かれているのですが、新しいプロトコルを設計する場合というのは
オリジナルのプロトコルでもrawソケットなら扱えるということですか?
もしそうであれば、作り方やその扱い方についてのわかりやすいサイトとかないでしょうか?
"raw socket"、rawソケット、生ソケット、SOCK_RAWなどのキーワードで
いろいろ検索してもよい手がかりが見つけられなかったので誰か教えてください。
12 :
デフォルトの名無しさん :04/04/02 06:36
質問です。 FreeBSDの環境でUDPプログラムを組んでの話なのですが recvfrom()をブロッキングせずに素通りしてしまいます。 しかも、始めは問題なかったのですが、タブを消してからブロッキングしなくなりました。 一体どうなってるんでしょうか? ちなみに、 <タブ>fprintf(stderr, "起動\n"); のタブを消しただけです。 今は、この行自体消してます。 あまりにも分かりにくい話だとは思うんですが、よろしくお願いします。 ちなみに、改行コードを疑って、LFでもRF+LF試しましたがダメでした。
>>12 早い機会に病院に行ってください。上司とも良く相談してください。
>>14 言われると思ったw
しかし、こんな意味不明な現象を誰に相談すれば良いのやら(汗
なんか、どこか領域破壊してて、今までは、再現性の無い成功 をたまたましてただけなのかな?
でもなかった 変更前のソースだとどうやってもこんな事にはならない・・・ やっぱ変な話だけど、このタブが原因っぽいです。
そもそもrecvfrom()の返値やエラー状態も書けないあなたは一体… それからCR+LFね。Carriage Return + Line Feed
18 :
デフォルトの名無しさん :04/04/02 07:03
>>17 いや、そもそもエラーなんて出てないんですよ・・・
recvfrom()の戻り値も0ですし・・・
recvfromが成功してもしなくても、 これループからぬけられないのな。
ネットワーク系APIの使い方以前にそもそもC/C++のプログラミングの 基礎がやばい印象が...
>>22 うp用にコード削っただけで
ここから処理分割したりしてるんで、その辺は大丈夫です。
>>21 THX!
そこでしたか・・・
でも、何でタブを残してたら動いたんでしょう?
>>23 一応18年間PGやっててこんなのは初めてですよ。
本当に意味不明な現象です。
>>23 どこが?
定番中の定番コードを書いてると思うが・・・
このコードに基礎も糞も・・・
>>24 いや、strlen(buf)直しても直らんよ
俺も良くわからんが、文字コードとか変なんじゃないの?
一度面倒だけどコピペじゃなくて書き写してみたら?
>>24 >一応18年間PGやっててこんなのは初めてですよ。
エイプリルフールは昨日で終わりましたよ。
>>25 人のコード見ると、こういうケチをつけるやつが居るのは常識だと思われ
スルーしないと宗教闘争に発展するから注意汁
まぁ、文献でよく有るパターンのsockの初期化コードとrevcfrom()のコード見てケチをつけるのもアレだと思うがw
>>24 改行コードだけじゃなくて文字コードを見直せ
>>25 strlen(buf)の間違いに気が付かないところと、
その間違いが判った後だというのに、
>本当に意味不明な現象です。
とか言ってるところが、
>基礎がやばい印象
なんでしょ。
とても18年PGやってきたとは思えない。でなければ、CとかC++は、初めてでしょ。
こんなところで悩むのは、最初の1年で勘弁してくれ。ローカル変数とスタックの関係とか
判ってたら、悩むような所じゃないよ
>>28 いや、、、このコードは、strlen()とかローカル変数とstacとかの問題じゃないと思うが・・・
っていうかお前等気付けw
あふぉばっかりかw
30 :
デフォルトの名無しさん :04/04/02 16:06
>>25 > memset((char *)&me, 0, sizeof(me));
ここでなぜか(char *)にキャストしているところとかじゃない?
>>25 buf の初期化がされてないのが問題では? ってことだろ。十分ありうる。
初期化ミスやポインタのミスは、コンパイルし直しただけで動いたり動かなく
なったりする、というのはありがちだし、多少なりともC/C++ の経験があれば
すぐ想像つきそうなもん。
俺は
>>23 ではないが、コードの質じゃなくって、質問の仕方やその辺から元
の人は経験少なそうに見えてしまうね、悪いけど(18年間何をされてたのか知
らないけど、少なくとも「タブが…」なんてところで悩むレベルはすぐに卒業
して欲しいな)。
32 :
デフォルトの名無しさん :04/04/02 16:07
あとNET_SET::rev_command()のbufの未初期化か
初期化していないものにstrlenを使って何がしたいんだろうな・・・
>>31 bufの初期化は既に試してます。
>>30 俺の読んだ文献にそう書いてあったんですが・・・
>>29 えーと、どういう事でしょうか?
あーわかった。そういうことか。 バッファのサイズを測りたいならstrlenじゃなくてsizeofだぞ。
>>34 >bufの初期化は既に試してます。
どのように初期化したの?
ちゃんと、
memset(buf,1,1023);
buf[1023] = 0;
みたいにしたの?
>>34 voidがない時代の相当古い文献を読んでいるんだな・・・
>>34 多分だけどな。(試したことないからしらん)
recvfrom()の第3引数、len に0以下の数値を渡すと、
こういう現象になるんだと思うよ。
とりあえずstrlen(buf)はsizeof bufにしろ
なんか、ネットワークプログラミング相談というより、 普通のプログラミング相談になってるのは気のせいか?
常にtrueを返しているがいいのか?
>>42 そういうことか。
>>34 fromlenはsocklen_tで宣言しようよ。
(確かこれについて前スレで質問していたよね?)
なあんだ、よく読み返してみたら、
>>15 で
>なんか、どこか領域破壊してて、今までは、再現性の無い成功 をたまたましてただけなのかな?
と、ちゃんと結論が出ているではないか。
とりあえず、strlen -> sizeof で結果待ちじゃね? おーいどうなったんだー早く結果あげろー
>>46 試してみましたが、ダメでした。
>>45 でも、修正前のプログラムだと100%上手く行って
修正後だと100%失敗するんです。
たまたまとは思えないです。
わかりました。(理由はわかりませんが fprintf(stderr, "受信待機中\n"); if( recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)<=0) return true; とあった所の、 fprintf(stderr, "受信待機中\n"); をコメントアウトすると、ブロッキングするようになりました。 何故ですか?w
追記です。 printf("受信待機中\n"); に書き換えても上手く行きました。 これはsocketの仕様でしょうか?
ブロッキングしてるかどうかはどうやって判断してるのでしょうか?
そのマシンはネットにつながってたりするんでしょうか? それとも物理的に接続できない状態にしてあるのでしょうか?
NetBSDで動かしてみた。 根本的な原因は、portが1000なのでpermission deniedでbind()がコケてる、 というだけ。 bind()がコケてるのでrecvfrom()はfprintf()云々に関わらず延々エラーに なっているが、コメントアウトによって(何も表示されなくなるので)ブロッキング してるように見えると。 従ってportを2000とかにしてやりゃとりあえずちゃんと動く。 で、プログラミング歴何年だって?
>>53 いや、外部から切り離して、suで実行してるからbind出来ますよ。
そこが原因ではないと思われます。
というか、実際fprintf()を変えたら、100%テスト用のクライアントと更新できました。
んで、変えなかったら100%出来ません。
55 :
デフォルトの名無しさん :04/04/02 20:26
>>48 あのさ、
>>36 の初期化が出来る頭を持っているなら、
sizeof()とstrlen()を混同したり、しないだろ。
それよりも、その初期化をするときに、strlen()がおかしい
って気が付くだろ?
ネタはもうちょっと考えてやれよな(藁
FreeBSD4.8でやってみました。
確かに、変ですね。
if( recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&fromlen)<=0)
return true;
//受信した場合の処理
num = (int)buf[0];
switch(num)
{
case CH_REQUEST:
fprintf("CH_REQUEST\n");
break;
case CH_RESIST:
fprintf("CH_RESIST\n");
break;
case END:
fprintf("END\n")
return false;
break;
}
このような形に変更してやってみました。
recvfrom()の前でfprintf(stderr,"")をやると、どうやら素通りしてしまうようです。
recvfrom()の直度に書いた場合は、普通にブロッキングします。
なので、
>>53 は明らかに違いますね。
もしかして、コンパイラか何かのバグかな?
おっと、stderrが全部抜けてるわ
で、同じコードを赤帽の8.0でやってみた。
結果はどっちも普通に動く。
何でだ?
>>54 切り離してるなら良いけど、それをそのまま運用するなよ
>>56 自分もFreeBSDの4.8です。
自分も同じ事を既に試してましたが…
やっぱり同じでしたか・・・
>>58 一応、これうp用にコード削ってますけど
正式な方はコマンドライン引数でポート変えれるんで…
>>55 1つのを作ってる間に、日にちが私用で空いたりすると、たまにバカなミスする事あるんですよ(藁
コンパイラがエラー吐いてくれなきゃ危なっかしくてしょうがない(苦笑
12じゃないけど、昔漏れがprintf()のコードをrecvfrom()前に書いて
printf()の結果が画面に表示されずに、プログラムが終了されてから表示されるなんて変な事があった
んで、
>>12 と同じようにfprintf(std,"")で書き換えたら表示は出来たが同じようにrecvfrom()が機能しなくなった事があったが・・・
同じ事か?
62 :
デフォルトの名無しさん :04/04/02 23:27
スルーするというときのrecvfromの戻り値と、それがもしエラーならば errnoぐらいは調べた方がいいと思われる。 プログラム修正するのが面倒ならktraceでも可。
>>62 スレ呼んだけど、戻り値は0でエラーは無かったといってなかった?
本当に18年間もやってきたのか? 前回の型についての質問といい、今回の質問といい、、、
>>64 今回の質問は俺もわからんのだが・・・
お前はわかるのか?
俺もわからんな
是非
>>64 にバカにも分かるように説明して頂きたい
>>14 です。
アフォに構っている人も、早い機会に病院に行ってください。
上司とも良く相談してください。
とりあえずsizeofとstrlenの混同なんていう初心者ミスを全部除いたまっとうなコードをアップしろよ。
原因かどうかわからないけどさ、コメントとprintfの内容から2バイト文字消してみたら? むかし//コメントの中に\と同じ文字コードを持つ漢字はいってるとさ、 次の行がコメント扱いされてコード実行が行われないプログラムになった事あるんだけど。 とくにWindowsと違ってgccはシフトJISをきちんと認識しないでしょ?
それとそん時はワーニングも出なかったからホントに気付かなかったよ。 それ以来コメントは全て/* */に変更かけたし。
fromlenはsocklen_tにしろってのはあくまでも無視か。
変にプライドがあるみたいだから長年やってきたのは本当だろう。
有害なコボラーと見た
お前ら、大ベテランのコボラーを馬鹿にすんな! ・・・確かに、今更Cの基礎なんてやってらんないし プロとして食っていくために無理やりボロボロの土台の上に積み上げていくから 基礎ボロボロで最悪だがな(涙
コンパイラの生成するコードがおかしくなってるというあたりまで 疑われているのでやっぱりktraceかな。カーネルとのAPIレベルで 何が起きているのかの確認にはなる。そもそもrecvfromが呼ばれて ないとかさ。
コンパイラ疑うって? recvfrom()の返値さえ保存してないクズ野郎が?
たいていの場合は自分が悪いことを確認して終わるわけですが、 はっきりと証拠を見たほうが信じやすいでしょ
>>80 相手が自分と同等の能力があると仮定してはいけません。
>>80 相手が自分と同等の能力しかないと仮定してはいけません。
>>79 だからお前このスレ百回読め
もう既に2回も書いてるぞ
12が名無しで荒らしている予感
荒らしてるというか、必死で自作自演をしているんだろ
省略したコードしか晒さない以上、奴が行ったという全てのことが疑わしい。
Winsockにて、未使用のポート番号の一覧を手に入れることはできますか? サーバープログラムであいているポートを自動的に取得して使いたいのです
空いていることを確認できたとして、その後使おうとしたときに 使えるとは限らないと思うんだが・・・
その空いているという表現はFW等で開放されていると言う意味なのでしょうか? できれば未使用で使えるポートを列挙できる方法を知りたいです。
うーん、TCPの勉強をもうちょっとしてください。
>>90 49152〜6535(でしたっけ?)
は動的に自由に使えるんじゃないんですか?
私の質問の意図を理解できないのでしょうか? ここの連中は本当に役に立ちませんね。
>>89 列挙する方法はないです。
>>88 の意味において。
>>87 普通は使っていいところを順番にbind()してみます。
成功したら使えるってことです。
>>87 netstatで使ってるポートは出てくるんだから、
その逆やれば、いーんじゃねーの?
だからといって、次に使おうとしたときに使えるかどうかは
しらんけどな。
要するに 使用できるポートを検索する→発見→bind() ↑ この辺で突然他のプログラムに使用される可能性がある。 って事でそ? まぁ、そんな一瞬の間を突いて使われる事はめったに無いと思うけど、100%使えるとは限らんぞ と
linuxだとbindしないでlistenすれば適当に空いてるポート割り振ってくれる ようになってるんだけど、winsockはそういうのないの?
ふう
みい
101 :
デフォルトの名無しさん :04/04/04 10:02
>>97 まじですか?、そんな一瞬の隙をつかれることがあるんですか?
考えもしませんでしたw
>>101 大丈夫だよ、あるかどうかの判定した直後に bind すれば、ほとんど割り込まれたりしないからさ。
マルチプロセスだったりマルチスレッドだったりするとありうるな
>>102 おいおい、メール欄だけじゃあ、誤解するだろ。
++portしてretryしなきゃダメだよ。
いきなり bind() で使用中だったら ++port で再 bind() すれば 良いだけなんだがな。。
>>101 バッファオーバーランと並ぶ
セキュリティホール基本技の一つでしょ
107 :
デフォルトの名無しさん :04/04/04 16:59
102のメール欄に何が書いてあるのかわくわくしながら見に行ったら単なるsageだった・・・
12のネタが終わったら、途端に寂れたな
多分>12が新しいネタ考えてきてくれるよ。
110 :
デフォルトの名無しさん :04/04/07 04:19
質問です。 今Socketプログラミングの勉強の為に、コミュニケーションツールを作ってるのですが 主に音声チャットや映像配信(これらは一部のパケットの欠陥があってもOK) を考えていて、ファイル転送などのサポートも考えています。 それで、プロトコルを今どうするか考えているのですが、こういう場合はUDPの方が良いのでしょうか? ファイル転送や文字のチャットでは欠陥されると色々困るんですが・・・ また、UDPでエラーチェックをする場合はどうすれば良いのか教えてください。 転送出来てるかどうかのメッセージをやりとりするとしても、そのメッセージ自体が相手に伝わってるかどうかもわからないでしょうし・・・
>>110 別にTCPとUDPのどっちか一方しか使ってはいけないというわけじゃないんだから
そう思うなら使い分ければいいと思う。
エラーチェックというか再送が必要なときにそれをUDPでやるのは、TCPだと
うまくいかなくてそれがなぜかわかってからで遅くはない。そうでないと車輪の
再発明になりかねん。プログラミングの勉強ということなのでそれをやってみる
のも勉強のうちならそれはそれで意味があるだろうが。
欠陥?
113 :
デフォルトの名無しさん :04/04/07 09:58
血管
114 :
デフォルトの名無しさん :04/04/07 11:21
>>110 普通は、音声、映像のストリーミング配信をUDPでやって、
ファイル転送、文字チャットはTCPだろうね。
>>111 も言ってるが、単に一つのツールの中で、つかいわけるだけ。
普通はだまってTCPだろ。ストーリームだろうがなんだろうが。 マルチキャストの実験、とかじゃない限り。 歴史的な理由、って以外でUDP使ってるプロトコルあるか?
>>115 もちっと、勉強しましょう。
たとえば、オンラインゲームとか、ちゃんと理由があって UDPにしてたりする。
>>116 PSOとかはTCPとUDPを使い分けているね。
メッセンジャー系もメンバーのオンライン/オフラインを通知するのはUDPじゃなかったっけ
>>115 前スレのSkypeの話を見てみれば?
それとMOはほぼUDPの天下。
稀にTCPオンリの変り種もいるけどね。
まぁ、今の流行はUDPだね。
Punching hole UDPとか面白そう。
>>118 どうやってUDPで状況確認するの?
まさか、ずっと確認のためのパケット送り続けるとか?
そのケースはサーバ側の負担を軽くしたいんでしょ。 接続張りっ放しでたくさんかかえると大変だから。 すぐに接続切っちゃったら、UDPでポーリングするのと比べて、 それほどアライブチェックの確実性が上がるわけでもないし。
123 :
デフォルトの名無しさん :04/04/08 06:19
質問です。 今Wisosockでコードを組んでるのですが socklen_tを使うと定義されてないって言われます。 winsock2.hをインクルードするだけではダメなのでしょうか?
手元の環境ではws2tcpip.hに定義されてる。 それはどっからも参照されてないみたいだから、必要ならincludeしてやれ。 または、自分でtypedefするかどっちかだな。
125 :
デフォルトの名無しさん :04/04/08 10:18
自分でtypedefって・・・
なんだよ〜inlcudeしたら、なんかエラーでまくりだよ〜 これをinlcudeする前に、なんかincludeしなきゃならんのかな〜 追っかけるの面倒くさいなあ〜 もういいや。 typedef int socklen_t;
>>126 #include <windows.h>
#include <ws2tcpip.h>
とするとエラーが出まくったって事?ならば
#define _WINSOCKAPI_
#include <windows.h>
#include <ws2tcpip.h>
でどうすか? つかゴメン試してないけど。
あと,7ビットフラグが立ったよ〜ヽ(´ー`)ノ
細かいトコは見てないけど #include <winsock2.h> #include <ws2tcpip.h> ってやったら使えたよ。@VS.net ちなみにwinsock2.hをインクルードした時にはwindows.hをインクルードする必要無いみたい なんかの理由でインクルードしたい場合にはwinsock2.hを先にインクルードする必要があるみたい。 まあ、コレも詳しく見てないんで細かいことはしらんけど。
確か、windows.hを先にincludeしたい場合は先にWIN32_LEAN_AND_MEANをdefineしとけば良いとか見た覚えがある。
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> こんな感じかにゃ
msdnに書いてないね、socklen_t。ダメじゃん…
132 :
デフォルトの名無しさん :04/04/09 00:11
133 :
デフォルトの名無しさん :04/04/09 06:38
質問です。 Winsockでの質問なのですが recvfrom()で、指定した時間音沙汰無しだったらブロックをやめて進めるって事をしたいのですが 何か良い方法はありませんでしょうか?
>>133 ブロッキングの時間を延ばしたいの?
それともtimeoutしても問題なく動く方法を知りたいの?
それともブロッキングしなくてもいい処理の仕方に変えたいとか?
ポーリング最強
SIGALRM setsockopt()+SO_RCVTIMEO select() の三者の内、いづれかを使うということになると思いますが、 WinSockにはSO_RCVTIMEOがなかったと思うので、timeoutが指定できる select()を使うのというのはどうでしょうか?
137 :
デフォルトの名無しさん :04/04/10 12:18
CCNAって取ったらどういった職につけるんでしょうか
139 :
デフォルトの名無しさん :04/04/10 13:18
141 :
デフォルトの名無しさん :04/04/10 23:03
そういや2chってphpにすれば負荷減るんじゃないの?
142 :
デフォルトの名無しさん :04/04/10 23:05
負荷減って、専用ブラウザ使う理由消えると ひろゆきの収入なくなるからだめか
ワラタ
144 :
デフォルトの名無しさん :04/04/10 23:26
>>142 PHPにしたところで転送量は減らない。
PHPが、負荷を減らすのが得意なのは、プログラマへの負荷。 すれ違い終了。
fork分の負荷も消えるな。 たしか、「phpはバグがあってメモリを離さないからダメだ」みたいなことを 何年前かにひろゆきが語ってたぞ。
さっさと 2chd でも作れや
148 :
デフォルトの名無しさん :04/04/11 01:04
>>147 独自プロトコル? それとも2ch向けHTTPサーバ?
ひろゆきデーモン
>>148 独自プロトコルだと、IEでも見られないし、
専用ブラウザも作り直しになっちゃうよ。
スレッド式掲示板に最適化された、httpdでしょ、やっぱし。
(mod_2chとかでもいいかとも思うけど)
>>150 以前似たようなものをつくってこの板で宣伝していたやつがいたな。
ようじょとかいう名前だったかな。
153 :
デフォルトの名無しさん :04/04/11 14:20
質問です。 Winsockなのですが recvfrom()のブロッキング時間を設定するにはどうすれば良いのでしょうか?
え〜と サーバーへsendto()でコマンドを送って recvfrom()で一定時間待って、サーバーから応答が無ければそのままブロックを終わらせたいのですが・・・ select()を使うとは具体的にはどうすればいいのでしょうか? recvfrom()の直前にselect()を持ってきて、ブロッキング時間を設定して 読み取り可能ならそのままrecvfrom()、時間以内に出来なかったらスルーするって感じでしょうか?
そうです。 あと、setsockoptでタイムアウトの指定ができるので(WinSockだと 多分できないんですが)確認しておいたほうがいいですよ。
WinSockでもそれくらい出来ますよ。プンスカプン
そうでしたか・・・ 申し訳ない。
SO_RCVTIMEOが使用できるということなので、setsockoptで struct timevalを使って設定するのが面倒無いと思われます。
使えるのはwinsock2.0からだから使えないも同然
>>160 何で?Winsock2使えない環境の方が稀だと思うんだが
どうもありがとうございます。 SO_RCVTIMEOで出来るという事なので、それでやってみます。 あと、Winsock2ですが、Win2k以降のみをターゲットにしてるので大丈夫です。
MSDNより SO_RCVTIMEO and SO_SNDTIMEO (略) If a send or receive operation times out on a socket, the socket state is indeterminate, and should not be used; TCP sockets in this state have a potential for data loss, since the operation could be canceled at the same moment the operation was to be completed. こんな戯けた仕様だけどそれでもいいの?
大変申し訳ない。 実際に確認もせずに安直に薦めてしまって。 しかし、すごいねWinSock
普通select使うからなあ
>>164 > しかし、すごいねWinSock
MSDNのWinsock2ドキュを一読することを勧める。かなり笑える。
Windowsのversionが違えば振る舞いが違うくらいは当たり前。
163だぬ
selectかWSAWaitForMultipleEvents()とか使って 自分でタイムアウト処理書いた方が良さそうだね。
というか、WinSockにはWinSockにあった書き方があるだろうから、 WinSockならWinSockの流儀に従えばいいとおもわれ。 もちろん逆も同じ事が言えると思われ。 片方でできるからもう片方が出来て当然、出来ないのはクソ みたいな発言はあまりに浅慮だと思う。
170 :
デフォルトの名無しさん :04/04/12 01:18
てか単に、仕様がおかしいと思えば使わなければいいわけで WinSockなら>168みたく処理すればいいじゃん?って言っているのでは? どうせ文句いった所でMSが直してくれる分けでもないし つか、普通selectっしょ?
ポーリング最強
WSAAsyncSelect()って良くないの? WndProcで処理できるから結構好きなんだが
175 :
デフォルトの名無しさん :04/04/12 23:05
cygwinのgccでselectのラッパーを書こうと思っていて、 fd_setの中にセットされてるsocketを一覧する必要があるんだけど、 sys/types.hにあるfd_setの中のfd_maskの配列の長さが2なんだけど、 FD_SETは # defineFD_SET(n, p)((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) ってなってる。NFDBITSは32だから、ソケットの番号が64より大きいとはみ出ない? それともディスクリプタって64個しか開けないの?
winsock2のselectは64個までだったと思うズラ
>>176 登録の限界数がそれなのはわかるんだけど、
FD_SETでn/NFDBITSってやてるから、ソケットの番号が100とかだったら
100 / 32 = 3になって、配列の長さを越えてない?
>>176 The variable FD_SETSIZE determines the maximum number of descriptors in a set.
(The default value of FD_SETSIZE is 64, which can be modified by defining FD_SETSIZE to another value before including Winsock2.h.) Internally, socket handles in an fd_set structure are not represented as bit flags as in Berkeley Unix.
FD_SETSIZE は可変できるズラ。デフォルトが64なりよ。
>>178 ちょっと言い方が悪かったかも。
ソケットの数じゃなくて、ソケットディスクリプタの番号が大きかったら困るんじゃ?
ってのが質問。
unsigned long fd_bits[2];
fd_bits[n/32] = (1L << (n % 32));
ってな感じでnの値が64以上だとnが64より大きな番号を持つソケットだとだめじゃない?
ソケットを64個以上生成したら一つはディスクリプタの番号が64より大きな数字になると思うんだけど、
俺何か勘違いしてる?
それともそういう時はFD_SETSIZEを意識的に調整しないとだめということ?
>>179 ま、そういうことだ。selectの設計はそれほど古いのだよ。
だからpollとかkqueueとかに取って変わられつつある。
>>179 ちと調べてみたが、cygwinは意図的にunix風のselectに見えるように
しているみたいだ。winsock2のfd_setとは互換性がない。
unixでもそうだと思うが、selectの第一引数nfdをデカくして、
かつ、デカい配列を渡せばいいんじゃねえの?
ダメなら怒られるだろうし・・・
>>175 とりあえずマクロは無視して、
select(2)の第一引数にどのくらい大きい数を与えられるか、
fileをいくつopen(2)出来るか調べてみてはどうか?
>>180 ,
>>181 サンクスコ。ってことはやっぱりFD_SETSIZEの値を大きくしないとだめなのね。
ちなみにディスクリプタの番号って必ず小さい数から順番にとられていくの?
ソケット開閉を繰り返したら番号がすげー大きくなる、ってことはない?
>>182 >select(2)の第一引数にどのくらい大きい数を与えられるか、
これってどういうこと?
どの数字までならアルゴリズム的に問題ないか、ってこと?
>fileをいくつopen(2)出来るか調べてみてはどうか?
Linuxの2.4.20だとulimit -nのディスクリプタの数の上限よりちょっと少ないくらいだった。
ちなみにCygwinで書いてるのはWindowsで書いてるソフトを移植するために
コンパイルエラーがGCCとVC++の両環境で出ないところまでテストするためでつ。
>>183 > これってどういうこと?
> どの数字までならアルゴリズム的に問題ないか、ってこと?
cygwinで。大きすぎたらエラーが返ってくるはず。
テスト簡単でしょ?
maskの方は0だけ有効にして、第一引数をどんどん大きくして、
select(2)するloopを書けばいいだけだから。
> Linuxの2.4.20だとulimit -nのディスクリプタの数の上限よりちょっと少ないくらいだった。
cygwinで試してみれば?
とりあえず三通りで試してみた。
全部CygwinでFD_SETSIZEはデフォルトの64のままね。
一つは
>>184 の通り。
int result;
int a=0;
fd_set fds;
int b=0;
struct timeval tv;
int i,j;
for(i=0;i<FD_SETSIZE*2;i++){
tv.tv_sec=0;
tv.tv_usec=100*1000;
FD_ZERO(&fds);
FD_SET(0,&fds);
result = select(i,&fds,NULL,NULL,&tv);
if(result != 0){
printf("failed at %d. fd_setsize=%d\n",i,FD_SETSIZE);
}
}
selectは正常にタイムアウト。問題なし。
二つ目はFD_SETSIZEより多くのソケットをfd_setに突っ込むテスト。 一個のソケットでSelect,二個のソケットでSelect...って繰り返してる。 改行が多いって言われたからエラーハンドリングは削りますた。 int a=0; fd_set fds; int b=0; struct timeval tv; int result,i,j,sockets[FD_SETSIZE*2],maxfdnum; struct sockaddr_in localaddr; memset(&localaddr,0,sizeof(struct sockaddr_in)); localaddr.sin_family=AF_INET; localaddr.sin_addr.s_addr = INADDR_ANY; localaddr.sin_port = 0; for(i=0;i<FD_SETSIZE*2;i++){ tv.tv_sec=0; tv.tv_usec=100*1000; FD_ZERO(&fds); sockets[i] = socket(AF_INET,SOCK_DGRAM,0); result = bind(sockets[i],(struct sockaddr*)&localaddr,sizeof(struct sockaddr_in)); maxfdnum=0; for(j=0;j<i;j++){ FD_SET(sockets[j],&fds); maxfdnum = (sockets[j] > maxfdnum)? sockets[j] : maxfdnum; } result = select(maxfdnum+1,&fds,NULL,NULL,&tv); printf("loop:%d a=%d\n",i,a); } 65回目のループ(i=64)で処理が停止した。selectから制御が戻らなくなった。 ちなみにうちのCygwinだとソケットは90弱しかbindできなかった。
最後は大きな番号のディスクリプタをFD_SETしていくとどうなるかのテスト。 FD_SETSIZE+10(64+10)のソケットをbindして、最初の10個以外の64ソケットを FD_SETしてる。エラーハンドリングは割愛。 int result; int a=0; fd_set fds; int b=0; int i,j; int sockets[FD_SETSIZE+10]; struct sockaddr_in localaddr; memset(&localaddr,0,sizeof(struct sockaddr_in)); localaddr.sin_family=AF_INET; localaddr.sin_addr.s_addr = INADDR_ANY; localaddr.sin_port = 0; for(i=0;i<FD_SETSIZE+10;i++){ sockets[i] = socket(AF_INET,SOCK_DGRAM,0); result = bind(sockets[i],(struct sockaddr*)&localaddr,sizeof(struct sockaddr_in)); } for(j=0;j<FD_SETSIZE;j++){ FD_SET(sockets[FD_SETSIZE+10-j-1],&fds); } printf("a=%d b=%d\n",a,b); a=8192 b=0ですた。 長くてスマン
>>186 > 65回目のループ(i=64)で
これは下請のWinsockのselect()の制限だろうね。
> 処理が停止した。selectから制御が戻らなくなった。
これはcygwinの実装のせいかも知れないけど。
fdsってそのままだと64個分しか用意されてないと思うんだが。
>>189 > fdsって
fdsってなんだよ(w
ネットワークアップデート機能をWinアプリにつけたいのですが、 一般的な方法はどのようなものでしょうか? 参考文献があれば教えていただけないでしょうか。 お願いします。
>>191 文献に頼るほどのものじゃないだろw
まぁ、俺がやる方法は
アップデートが必要と思われる部分はあらかじめDLLにしておいて
DLLを開放した後上書きする方法
というか、ネットワーク関係ない。 ネットワークダウンロードだろうが、CD-ROM配布だろうが、やること一緒。
小さいローダを作って、それでアップデートのチェックと ダウンロードやれば?
いろいろな意見情報ありがとうございました。 もうちょい勉強してでなおします。
普通はアップデート用のプログラムを別に作るよな。
たまに、「アップデート用の小さなローダ」をアップデートしたくなるよネ。
201 :
デフォルトの名無しさん :04/04/18 11:51
質問です。 WSASyncSelect()使えばWSASend()とか非同期系不要でしょうか?
203 :
デフォルトの名無しさん :04/04/18 14:35
>>202 でも、WSASyncSelect()使えば、WSASendとか使わなくて良いようになりますよね?
ブロックしなくて直ぐに終わるんだったら、結局一緒のような・・・
204 :
デフォルトの名無しさん :04/04/18 15:20
>>203 プログラムの仕方次第で、同じコトを実現するための複数の方法があるってことよ。
正解は一つじゃないの。
>>203 あなたの頭の中に描いている用途にはそれで十分であっても、
>>201 のような一般的な質問をすれば、答えはノーしかあり得ない。
ちょっと俺の認識が甘かった 非ブロックってブロックしないだけで処理してる間は止まっちゃうんだね。 なら巨大な容量のものを送ったり受信したりする時は、WSASend()とかは必要 か
207 :
デフォルトの名無しさん :04/04/20 14:22
linuxでマシンのIPアドレスを全部取るのってどうすればいいの? Windowsだとgethostnameして、gethostbynameすればとれたんだけど、 同じことをやると127.0.0.1しか取れない。 なんかうまい手ない?
>>207 ioctlでSIOCGIFCONFしる。
man 7 netdevice参照のこと。
208は俺の彼氏だヴォケ
母です。
211 穴兄弟\ 213 212 \ 母↑ /本体? 好き? \ │/ 207←───208←────209 /↑ 愛してる ↑ / │ │ / 彼氏│ 嫉妬 │ 娘/ 210─────┘ 214 複雑だな…
ワラタ
217 :
デフォルトの名無しさん :04/04/22 23:12
受け側と送り側があって、 UDPでデータ転送をすることにして、 受け側が送り側によって送られたデータを処理し切れなくなると バッファが満タンになったりして宜しくない状態になる気がするんですが、 そこのところは世の中ではどうなってるんでしょうか?
UDPを使うならお前が制御せよ。いやならTCPを使え。
221 :
デフォルトの名無しさん :04/04/23 11:25
ネットワークプログラミングをかじってみようと思ってる超初心者です。 ネットワークプログラミングの1番の基礎ってなんですか?Hello Worldてきな ものありませんか?
echo
223 :
デフォルトの名無しさん :04/04/23 11:32
echo?????
224 :
デフォルトの名無しさん :04/04/23 11:42
>>221 Hello worldを送るプログラムと受けるプログラムを書いてみれば。
>>221 俺の一番最初のネットワークプログラミングは、HTTP受信だったが。
ようはそういうことだろ>Hello World
HTTP/0.9, HTTP/1.0までなら入門にいいかもな。 HTTP/1.1はちょっとでかい。
227 :
デフォルトの名無しさん :04/04/23 12:01
どこかに良いサイトないですかね〜?スレの最初に貼ってあるリンクもみたけど いまいちわからなです。 HTTP受信ってなんですか?
228 :
デフォルトの名無しさん :04/04/23 12:01
ぐぐってきます
231 :
デフォルトの名無しさん :04/04/23 13:58
>>222 ハロワくらいのレベルっつーと、確かに TCP echo だわな。
vb.netでFTPファイル転送ってどうやるかわかるかたいます?
234 :
デフォルトの名無しさん :04/04/23 18:56
・
235
>>233 ftp.exeを実行する。
ftp -s:filename
みたいに。お手軽お手軽
>>233 MFCのCFtpConnectionに相当するモノも無いみたいだね。
面倒だけど、Socketを使って自作するしか。
質問です。 UDPって、1つのデータを受信中に別のデータが送られてきても待ってくれるんでしょうか? それとも、その送られてきた時点で受け取れなかったら破棄されるんでしょうか?
待ってくれる場合もあるし、破棄される場合もある。
>>239 それは困るんですけど、どうにかなりませんか?
>>240 setsockopt()で受信バッファを大きくする。
でも、どっかで消えてしまう事は必ずあるよ。
>240 自分でデータの連結や、再送処理をしろ それが嫌なら、TCP/IPを使え いったい何のためのUDPだと思ってるんだと小(ry
244 :
デフォルトの名無しさん :04/04/25 02:10
> TCP/IPを使え
> TCP/IPを使え
もう寝たのかよ!
UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。 中略 UDPを使うならお前が制御せよ。いやならTCPを使え。 UDPを使うならお前が制御せよ。いやならTCPを使え。
(;´Д`)ハァハァ
>>237 それよりはWinInet系のAPIを使う方が楽だろう。
まあ細かいことやりたければSocket直叩きだがナ。
ぐぐればC#によるFTPクライアント実装の例は簡単に見つかるよ。
ftp.exe最強
252 :
デフォルトの名無しさん :04/04/26 19:58
質問です。 ATL/MFC には、SMTPを簡単に扱える CSMTPConnection クラスがありますが、 これを用いてメールを送信する場合、サーバが返す値(エラーコード)を取得するには どうしたらいいでしょうか?
しらね
>>252 VCにはソースついてるんだから CSMTPConnectionクラスのソースみればわかるだろ?
SMTPぐらい実装しちゃえ。
そういう細かいことを気にしなくてもいいためのクラスなんじゃねぇの?
発生したエラー内容によってその後の処理は変わるんだから、 クラス化しようがしまいが気にしないわけにはいかんだろ。
そういう人は、実装しちゃえ。 つか、CSMTPConnectionなんて、漏れの持ってるヘルプには載ってないorz VisualStudio6.0じゃそろそろダメか?
ttp://www.codeproject.com/internet/csmtpconn.asp#APIReference のことかな。
CSMTPConnection::GetLastCommandResponse
CSMTPConnection::GetLastCommandResponseCode
とか、なんかそのものズバリっぽいものがある気がするのだが気のせいか。
>>258 VC7(.NET)以降はCRT、MFC、ATLあたりが大幅に変わってるから、
新しいの買うにしてもVC6は手放さない方がいいよ。デフォのCランタイムが
MSVCRT.DLLじゃなくてMSVCR70.DLLになっちゃってる。これはなにげに
嫌でしょう。
俺はVC6のincludeとlibだけ取っておいて、VC7のcl使ったりという
邪道な真似をやったりもするけど。
MFCでWinsock2を使いたいんですが MFCのafxsock.hの中の記述を勝手に書き換えても大丈夫でしょうか?
かなりよくない
263 :
デフォルトの名無しさん :04/04/29 06:12
.NET Framework 開発者ガイド 非同期サーバー ソケットの使用 サンプルで接続要求待ちに無限ループを使ってるみたいなんですが、これ、いいんでしょうか? なんか、力技に思えてしょうがないんですが。
>>261 stdafx.hの中に#include <winsock2.h>を書く。
(VS6.0しかしらんけど)
C#マンセー.Netマンセーーとかおもってた熱が、すげぇいかす速度でさめてきやがりました!! やはり、C&WTLにしとけばよかったと、微妙に
>>263 ループ終了は例外処理を使ってるみたいだね。
簡単に実装できる方法だし、サンプルでこれを認めているんなら使わない手は無いと思うけどなぁ。
てゆか、Java辺りではすごくありふれた手法だよね。 大分見慣れてきたからそうは思わないんだけど、俺もJavaでこれ見たときはテンション下がったよ。 ロジックで解決しないコードって何だよって(←この考え方自体、既に古いかもしれんが)。
ロジックじゃなくて返値。 てか、三つもレス消費するなや俺……。
ビジーループじゃなければ無問題
ぶっちゃけ、鯖なんて黙って要求に答え続けてりゃ良いんだよ
272 :
デフォルトの名無しさん :04/04/29 15:52
C#で次のようなclassを作って private string SockRecv(Socket tmpS) { int bytes; byte[] RecvBuff = new byte[256]; MemoryStream RecvMsg = new MemoryStream(); Socket pop3 = tmpS; do { bytes = pop3.Receive(RecvBuff,RecvBuff.Length,SocketFlags.None); RecvMsg.Write(RecvBuff,0,bytes); } while(pop3.Poll(100000,SelectMode.SelectRead)); return Encoding.ASCII.GetString(RecvMsg.ToArray()); }
273 :
デフォルトの名無しさん :04/04/29 15:54
//接続成功の応答 RecvComd = SockRecv(pop3); Console.WriteLine(RecvComd); //USERコマンドの送信 SendComd = "USER " + User + "\r\n"; SendBuff = Encoding.ASCII.GetBytes(SendComd); pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None); RecvComd = SockRecv(pop3); Console.WriteLine(RecvComd); //PASSコマンドの送信 SendComd = "PASS " + Passwd + "\r\n"; SendBuff = Encoding.ASCII.GetBytes(SendComd); pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None); RecvComd = SockRecv(pop3); Console.WriteLine(RecvComd);
274 :
デフォルトの名無しさん :04/04/29 15:54
//STATコマンドの送信 SendComd = "STAT\r\n"; SendBuff = Encoding.ASCII.GetBytes(SendComd); pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None); RecvComd = SockRecv(pop3); Console.WriteLine(RecvComd); //STATコマンドの結果からメールの数を抽出 MailCount = int.Parse(RecvComd.Split(' ')[1]); if(MailCount != 0) { //RETRコマンドの送信 for(int count = 1; count <= MailCount; count++) { SendComd = "RETR " + count + "\r\n"; SendBuff = Encoding.ASCII.GetBytes(SendComd); pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None); RecvComd = SockRecv(pop3); Console.WriteLine(SendComd); Console.WriteLine(RecvComd); } }
275 :
デフォルトの名無しさん :04/04/29 15:55
//QUITコマンドの送信 SendComd = "QUIT\r\n"; SendBuff = Encoding.ASCII.GetBytes(SendComd); pop3.Send(SendBuff,SendBuff.Length,SocketFlags.None); RecvComd = SockRecv(pop3); Console.WriteLine(RecvComd); pop3.Shutdown(SocketShutdown.Both); pop3.Close(); return true;
276 :
デフォルトの名無しさん :04/04/29 15:57
のような通信をすると quitコマンドを実行した直後あたりでプログラム が固まるのですが原因は何なのでしょうか?
長い上にインデント潰れまくり、その上sageることも知らんような お前のためにこんな糞コードを読み通せと?
普通、イベントを待つか Thread分けるかするものなのだが・・・ 返ってくる保障が無いんだし、帰ってこなけりゃ固まるよ。
>278 ありがとうございます ネットワークプログラミングをするの始めたばかりなんで・・・ こんな厨な私にちょうどいい入門書ないですか?
UNIXドメインソケットをSOCK_DGRAMで使っています。 recvfromでブロックしているときにsocketファイルが削除されたら 戻るようにできるでしょうか。
281 :
デフォルトの名無しさん :04/04/29 19:35
質問です。 PunchngHoleUDPについてなのですが クライアントのルーターのポートを空けなくても Winsockの送信元ポートを設定し、サーバーへアクセスすると 自動的にルーターでポートが空くので、その穴を別のポートを設定していないクライアントが利用するって技術ですよね? で、どうもサイト見る限り、Winsockで設定したクライアントのポート+1の番号のポートがルーターに開けられるような事が書いてたのですが・・・ これは本当ですか?ルーターの仕様として決まってるとはあまり思えないんですが・・・
UDPを使った場合 NATはどれくらいの時間サーバーを記憶してくれるんでしょうか? サーバーへコマンドを送信してから1時間後くらいにサーバーからクライアントへコマンドを返すようなのを作りたいのですが・・・・
>>281 そのサイト教えれ。
>>282 実装次第なのでなんとも。
設定すればなんぼでも出来るだろうが、
デフォルトで1時間はいくら何でも期待できないだろう。
ちなみにうちの場合は10分。
5分間隔くらいでハートビート送ってくれないとな〜。
>>284 この例だけで、
>>281 のように考えるのはどうかと思います。
ルータを通したローカルの複数のクライアントが同じポートを使用としたときに、
ルータは皆別々なポートにマッピングするべきなので。
>>285 確かにそうですね。
という事は、実装としては
サーバー側で送信元のポートを覚えておいて、他のクライアントにその情報を回せばOK って感じでしょうか?
while (True) { orz; }
>>271 殺伐としたサバですね。
鯖の中の人に聞かれたら、刺されそうです。
にょほ〜
295 :
デフォルトの名無しさん :04/04/30 16:21
>>286 送信元のPortを鯖側で把握する事は可能だが
それはあくまであちらで設定されたWinsockのポートであって
ルーターでマッピングされたPortではない。
よって、鯖は相手のルーターのマッピングされたPortは知る事は出来ない
なので現状PunchingHoleUDPをWinsockベースで利用する事は不可能
生ソケット使いな
「あちらで設定されたWinsockのポート」って意味わからん。 クライアントが[srcip:srcport -> dstip:dstport]でUDPを発射するだろ。 ルータが[routerip:routerport -> dstip:dstpor]にすり替えるだろ。 サーバはrouterip:routerportをとれるやん。
>>282 俺はTCPを7500秒、UDPを60秒にしてある。
データの流れる方向が逆だが、そうじゃないとゲームホストをしたときに、
他の端末から来たGameSpyサーバPingのUDPでNATテーブルが簡単に埋まりつくすから。
まあ内側にホスト立てるとかそういうのは置いといてだw
298 :
デフォルトの名無しさん :04/04/30 19:29
質問です。 RecvFrom()の5つ目の引数に入る(struct sockaddr_in *)&hoge に格納されるポートはルーターのポートなのでしょうか?
winsockを使ったネットワークゲームで、クライアントにデータを送るときにキャラクタの座標などを、数値を文字列に変換する関数を使って一回固定サイズのバッファにコピーしておくっているのですが、 他に良い方法ありますか?
それのどこが悪いと考えているのか述べよ。
>>301 それは、エントロピの無駄、簡単にでも暗号化されてないと解析されて、場合によってはなんかすげぇいかすことに使われちゃうとか、そういう事ですか?
Win系専用でゲームサーバーを立てようとする
>>299 に、みなさん拍手を!!
バイナリで送るとエンディアン問題や値範囲の拡張性がなくなるってことで そういう意味ではテキストで送るのは良いわけだが その場合固定長バッファは危険かもな
>>300 は、ある意味、真理をついていることに改めて気づき、このスレは騒然とする....
>>305 俺は
>>299 読んだだけじゃ「バイナリ」とは判断がつかないな。
「数値を文字列に変換する関数を使って」という頭悪そうな表現は
ともかく、文字列と言ってるからにはテキストなんだろうし、
多分昔のCOBOLの帳票データみたいな、スペース産めされた
固定長のフォーマットなんだろ?
俺も
>>300 に同意だね。
300の自作自演か?
ちょとすみません。数値を文字列に変換する関数を使って のどこが頭悪いですか?
頭が悪いのは263では。
>307 >305 もバイナリじゃなくてテキストだと思って書いてるはず。もちつけ。 >309 とりあえず、一般的過ぎて結局何をどうやってどういうデータにしてるかが よくわかんね、というのはあるかもしれない。 >311 >263 には申し訳ないが、同意せざるを得ないということを否定しがたい。
>>310 全ての送信データを変換関数で変換するので、時間を食ってしまうのではないかと思ったからです。
>>313 > 時間を食ってしまうのではないか
などという問題の立て方は限りなく無駄だ。悩むのは計測してボトルネックが
明らかになってからにしなはれ。
一般論としては、Xのようにバイナリの形でやりとりするプロトコルも
あるけれど、ホスト毎のハードの差を吸収するにはテキスト化するのは
現実的で無難な解だと思われ。
human readableなデータはデバグしやすいという多大な利点があるし
単純な整数以外の型が絡んだりすると、やってらんないぞ。
興味あるんなら
RPCなどで使われてるXDR(External Representation Standard, RFC1014)ってのを
調べてみ。
>>314 なるほど。確かにデバックには便利ですね。
その場の思いつきの方法で不安でしたが、これで安心しました。
どうもありがとうございました。
316 :
デフォルトの名無しさん :04/05/03 23:02
初歩的な質問で申し訳ないのですが WinsockでUDPを使ってファイルの転送をするプログラムを組もうと思うのですが RecvFrom()でファイルを受信する場合、どの型を使うと良いのでしょうか? Fileの始めの位置に印をつけるので、それを取り除くだけの処理をした後 Fileに保存するようにしたいのですが・・・ やはり、char型の配列でしょうか? ちなみに印とは、分割してFileを受信するので順序良く並べる必要があるので、その番号を入れようと思ってます。
その程度だったらint型の方が良いと思われる。 int型のほうが高速なのでな
>>315 まあ、表現形式を切り替えられるようなプログラミングをすることですな。
>>316 RecvFrom()では、byte列を扱うんだから、charの配列でいいんじゃない?
0〜255じゃ小さければ、2 byte使って、(data[0] << 8) & data[1]すりゃいいし。
そして再送要求(中略)TCPの再実装を体験する、と。
>>319 そうそう。何でTCPで実装しないのかと小(ry
PunchingHoleUDPとかTCPで実装出来るか? もしスンナリ転送できた場合、TCPより高速化しないか? 毎度毎度確認するTCPより、転送出来なかった所だけ最後に転送する方法にしたらかなり高速化するぞ
>>321 Skypeとかもそうだけど、今はUDPがトレンドだよねぇ・・・
NAT超えについての解決策が無いTCPだと正直辛い。
回線が高速化した分だけUDPがどんどん有利になってくる。
TCPの方が絶対的に良いと言うのはもう古い話
>>321 > もしスンナリ転送できた場合、TCPより高速化しないか?
スンナリ転送できなかった時、劇遅にならないためには、
それなりのスキルがいる。
TCPのNAT越え、NATルータを騙すだけでいいなら、 ftpのデータセッションのフリをする手もあるけどな。 実装にもよるから100%うまくはいかんだろうけど。
初歩的な質問で申し訳ないのですが ある特定のIPアドレスのある特定ポートが 開いているかどうかってどうやって調べるんですが? まっさらのWinXPで調べるにはやはりtelnetしかないのでしょうか? スレ違いな気がしますが他に適当な所も見つからないので どなたか教えてくださいませ。
>>327 アドバイスありがとうございます。
参考にさせていただきます!
LinuxをサーバーにしてWindowsをクライアントにしたいのですが どうもWinsockとSocketは同期しないみたいなのですが どうしたら出来るようになるのか教えてくださいませんか?
エスパーさん出番ですよ!
>>329 この質問に答えられたら、その質問に答えてあげよう。
なんかプログラムを実行したら変な感じになるんですけど、
どうしたらちゃんと動くようになるのか教えてくださいませんか?
>>331 変な感じになる場所にブレークポイントを設定して
その一文をもう一度調べてみる。
では回答
>>329 同期してないようにみえる場所をもう一度調べてみる。
バッファリングの半分は優しさで出来ています・・・
>>329 同期するように自分で通信プロトコルを作る。
winsockのラッパーDLLってないでしょうか?通信内容を保存するだけでいいのですが。 自分で作る必要がありますかね。
単に通信内容を保存するだけなら、WinDump とかネットワークモニタでいいんじゃ。 自分の目的に特化させたいならそりゃ自作するしかないでしょ。
とあるネットゲームのクラックに必要なんです。 意地悪しないで教えてください。
338は至極まともな回答だと思うが、 それが意地悪に見えてしまう君は一体何様ですか?
俺はお子様だぞ。
ウサマだ。
htonsを、エイチトンズって発音しているのですが何か問題があるでしょうか?
>>345 君がprintfをプリントフと発音しているなら別にいいんじゃないの。
プリントエフと発音しているんだったら、エイチトゥーエヌエスと読むべきだと思う。
>346 htonsがエイチトゥーエヌエスなら、 printfはピーアールアイエヌティーエフと呼んで下さい
>>347 エイチティーオーエヌエスとは読んでいないので
その提案には賛同できません
>348 じゃあ htonsはトン printfはリン ということで
>>347 > >346
> htonsがエイチトゥーエヌエスなら、
> printfはピーアールアイエヌティーエフと呼んで下さい
h(略) to n(略) s(略)
print f(略)
だ。
351 :
デフォルトの名無しさん :04/05/08 02:22
>>345 同じだ。
エイチトゥーエヌエスと読む時もあるけど。
スタジオの綴りはstudioであるにもかかわらず stdio.hをスタジオヘッダと読んでる人 ↓
無駄無駄無駄無駄
スタジオ・エッチ
俺はすたんだーどあいおー若しくはえすてぃーでぃーあいおーだな。 上司にatoi→あとい itoa→いとあ って発音する香具師が居るんだがどうにかならんのか・・・
atoi(3)なんか止めてstrtol(3)使いなよ。
std → すたんだーど cnt → count atoi → あとい itoa → いとあ str → ストリップ
stdio → すたんだーど あいおー cnt → かうんと atoi → えー とぅー あい itoa → あい とぅー えー str → すとあ strtol → すとあ とぅー える char → きゃら (相手が ちゃー という場合は ちゃー)
スレ的には、 inet_ntoa inet_ntop inet_lnaof in_addr sockaddr_in getnetent SIOCSIFADDR 辺りが適当かと。
361 :
デフォルトの名無しさん :04/05/08 13:02
htons ヒートンズ だろ!!??
addr→アドドラ 当然dllはドルル
inet_ntoa あいねっと えぬとぅーえー inet_ntop あいねっと えぬとぅーぴー inet_lnaof あいねっと えるえぬえーおーえふ in_addr いん あだー sockaddr_in そっくあだー いん getnetent げっとねっとえんと げっとねっとえんと、って韻を踏んでて響きがいいな。
addrはアドョロォァー
>>360 >>363 と↓だけ違う
in_addr いん あどれ
sockaddr_in そっく あどれ いん
すげぇ規模でスレ違いですよおあえら
369 :
デフォルトの名無しさん :04/05/09 09:40
口頭でプログラムするのに必要。
どこかでWin2kだったかで直接プロトコル弄って UPnP通信の実験してるリンクがあったと思うのですが 失ってしまいました。 どなたか心当たりないでしょうか?
思いっきりこのスレだOTL すまんかった
374 :
デフォルトの名無しさん :04/05/14 01:53
マルチクライアントサーバを作っています。 WSAAsyncSelectを使用していて FD_ACCEPTを受け取ったら for(iConnect = 0;talk[iConnect]!=INVALID_SOCKET;iConnect++); talk[iConnect] = accept(sock,(LPSOCKADDR)&client, &namelen); の処理をして、SOCKET型のtalk配列のあいてるところで接続確立してるんですが FD_READを受け取ったときにtalk配列の何番で、つまりどのソケットディスクリプタで recvをしたらよいかを調べる方法がわかりません。 どうかお力添えをお願いします。
WPARAMの値でサーチ
おはようございます。 WPARAMでわかるんですか! ぜんぜん気づきませんでした。 ありがとうございました。
すみません解決したのでさげます。
>>377 ちょっとまって〜
同じ質問しそうなので
どう解決したのか教えてください。
WPARAMにはパケしかないと思
解決しました acceptの引数にちゃっかり入れられてました。 (bindと同じやつ入れてた) orz
微笑ましい。
381 :
デフォルトの名無しさん :04/05/17 16:20
ちょっと質問ですが、 sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが どのようにしたらいいでしょうか?
Winsockで特定範囲のIPアドレスから送信された ブロードキャストのパケットを受信する方法について 質問があります。 手違いでデバイスをクラスDのIPアドレスに設定して しまったのですが、このデバイスが送信するブロード キャストを受信するアプリを作成しています。 Winsockを使用した自作のアプリケーションでは取得できず、 WinPcapを使用したアプリケーション(Etherreal)では 取得できました。 WinsockではクラスA〜C以外のIPアドレスからのパケットは 取得することができないのでしょうか?
自己解決しました^^
384 :
名無し@沢村 :04/05/17 16:38
ネットワークプログラミングで質問です。 銀行の口座にこっそりアクセスするには、どうすればいいんですか? 自分の口座の残高を増やす操作はどうやるんですか?
385 :
名無し@沢村 :04/05/17 16:40
ネットワークプログラミングで質問です。 銀行の自分の口座にアクセスするには、インターネットバンキングを使えばいいから簡単ですね。 では残高を増やす操作はどうやるんですか? インターネットバンキングでアクセスして、残高の末尾に0をたくさん書き込めばいいんですか?
386 :
名無し@沢村 :04/05/17 18:38
自己解決しました^^
test
388 :
デフォルトの名無しさん :04/05/18 09:56
ちょっと質問ですが、 sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが どのようにしたらいいでしょうか?
>>388 無理
送信を省略できるようにしたいなら、sendtoするより前でそういう処理を入れれ
non-blockingにして、recvfromを呼び出しまくれば?
391 :
デフォルトの名無しさん :04/05/18 10:07
392 :
デフォルトの名無しさん :04/05/18 10:28
氏ねよ
>>391 お前みたいなクズがいるからアレなんだよ
393 :
デフォルトの名無しさん :04/05/18 10:31
>>389-390 既にバッファーにあるデータのバイト数がわかれば
その分recvfromで受信でいいんですが・・
普通にrecvfromの戻りが0になるまでひたすら受信でもいいっぽいですかね?
394 :
デフォルトの名無しさん :04/05/18 10:33
>>392 他人の質問をコピペして釣ろうとしているお前が死ね
>>393 0になるまでじゃなくて、エラーになるまで。
で、エラーの詳細を見て、ブロックする場合のエラーコードの時
(EAGAINとかWSAEWOULDBLOCKとか)のみ、その後の処理を
するようにすればOKじゃないか?
もちろん、non-blockingにしないとデータがなくなった時点で
ブロックしてしまうんで、non-blockingは必須になる。
396 :
デフォルトの名無しさん :04/05/18 11:14
>>395 すみません、かなり初歩的なことを聞きますが
non-blockingはどうやって行うのでしょうか?
398 :
デフォルトの名無しさん :04/05/18 11:21
>>397 すみません、ググりましたが540000件も出てきてさっぱりわかりません。
400 :
デフォルトの名無しさん :04/05/18 11:54
めんどいから教えやがって下さい
401 :
デフォルトの名無しさん :04/05/18 11:56
>>393 shutdownで無効にするってのはダメかい?
402 :
デフォルトの名無しさん :04/05/18 11:58
>>401 PCの電源を切るのはいくらなんでもまずいです。
>>402 久しぶりに「くすっ」くらいは笑えたレス。
404 :
デフォルトの名無しさん :04/05/18 12:23
>>402 無知な香具師はレスしないでくれ。
ここはお前みたいな厨房がくるところではない。
405 :
デフォルトの名無しさん :04/05/18 12:36
>404 ネタにマジレスすんなと
>>407 すいません、仰っている意味が良くわからないのですが、
電源切ってしまったらプロセスが終了してしまいませんか?
どうしたんすか?
僕 なんかまずいことを…
409 :
デフォルトの名無しさん :04/05/18 14:48
>>393 先方から送られて、まだこっちに着いていない分のパケット(そのうち着く)はどう処理するつもり?
応答毎にシーケンス番号とか付けて、捨てるべきもの、処理すべきものを管理しなきゃダメだと思うよ。
なんでみんなしてコピペネタにマジレスしているんだろう・・・
>>388 > sendtoをする前に受信バッファーに残ってる全てのデータを取り除きたいのですが
この考え(特に「全部」)が猛烈にバッドセンス。
捨てたいパケット(UDP)があるなら、recvfrom()で受け取って捨てればいい。
人に聞くまでもないこと。
ところがあなたは何か「銀の弾丸」のようなものが存在すると思っている。
しかしそれはネットワークプログラミング初心者にありがちな誤解だ。
何を持って「全て」というのか。ネットワークには神の視点は存在しない。
マジレスも出たところで、このネタ、 =======終了=======
413 :
デフォルトの名無しさん :04/05/18 15:14
>>409 こっちが要求したら向こうから返答が返って来るので、向こうからいきなりくることはないんで、
ちなみに、向こうが何らかの理由で遅れて送信することがあるばあい、こっちはタイムアウトで再度要求するので
この辺りで以前に要求したデータが返って来る恐れがあるので、受信バッファーを空にしときたいんですよ
>>411 そんな幼稚な返答は望んでいないから消えていいよお前
マジアホ決定
マジかネタか知らんが、マジならそういう受け答えは
褒められたもんじゃないぞ。
それに、
>>411 の表現はともかく内容は間違っちゃいない。
空にしておきたいと言うが、空にしたあとに到着したらどうする?
無いと割り切って組むのもいいが、100%無いとは言い切れんぞ。
>>413 のような仕組みなら
>>409 の方法で組むことをお勧めする。
>>413 「で」が多いよ。
受信バッファを空にした後に「以前に要求したデータ」が届いたらどうするんだ?
要求再送分の応答を受け取った後に「以前に要求したデータ」が届いたらどうするんだ?
ちゃんとシーケンス管理すれば済む問題でないの?
('A`) ア゙ー かぶっちまった。
> 無いと割り切って組むのもいいが、100%無いとは言い切れんぞ。 < 無いと割り切って組むのは、100%無いとは言い切れないからよくない。
>>413 の前半("空にしときたい"は除く)への答えが、実は
>>409 で、
それを
>>413 が理解できないのは、
>>411 の言うように考えているから。
「全て捨てて空にしたい」
→「ネットワークプログラミングの性質上出来ません」
421 :
デフォルトの名無しさん :04/05/18 17:00
>>413 要求に番号をつけておいて、返答にも要求と同じ番号をつける。
で、要求を送って返答を待つときには要求した番号以外のついたパケットを受信したら捨てる、
って風にすればよいわけ。前回の要求への返事なら、番号が違うから捨てられる。
あと態度悪いよ。
422 :
デフォルトの名無しさん :04/05/18 17:07
そんなことしてるよぉ〜
423 :
デフォルトの名無しさん :04/05/18 17:08
偉そうにほざいてる割にろくな意見でてねーな(´,_ゝ`)
そのろくな意見とやらを聞きたいもんだな(w
腹へったなあ
UDPでSuperTCPを作ればいいんだよ
>>426 せめてTCP/IPスタックを自作しろって言えよ。
もうね、送信のたびにソケット作り直しなよ。
429 :
デフォルトの名無しさん :04/05/18 21:20
>>2 で紹介されている推薦書籍
TCP/IPによるネットワーク構築〈Vol.3〉
―クライアント‐サーバプログラミングとアプリケーション
を洋書で読みたいのですが、同じ本でUNIXバージョン、
BSDバージョン、Windows(WinSock)バージョンと3つに
わかれているのですが、Windows専門の私はWinSock
バージョンでいいのでしょうか?
3冊とも内容的にはいっしょと考えていいのでしょうか?
内容はほぼ一緒ですが、 WinsockはBSD socketと違うところがあるので、 programとその説明が違います。しかしまあほとんど同じです。
WinsockももとはBSDからパクったからな。 WSA系は違うけど。
432 :
デフォルトの名無しさん :04/05/18 21:36
リステン
びんど
ああんあんああああああああああああああああああーーーん!!
437 :
デフォルトの名無しさん :04/05/19 17:47
スレ違いかもしれませんが Linux RedHat9 上で次のようなTCP通信プログラムを作成しました。 クライアント側: 通信先IPアドレスの入力を促す。通信先ポート番号の入力を促す。 通信先に接続。 標準入力からの文字列の入力をネットワークに出力する。 サーバ側: クライアントからの接続を待つ。接続が確立したら connected 文字列をクライアント側に送信。 クライアント側から受信した文字列を標準出力に出力する。 で、同一ホスト上で動かして $ server 別端末にて $ client IPaddr: 192.168.0.10 port: 10000 tcpdump でパケットを見ようとしたのですがパケットをキャプチャすることができないようです。 プログラムは表面上は望んだとおりの動作をしております。 また client と server を異なるホストで動かすとキャプチャできます。 同一ホスト上でキャプチャするには何か設定等が必要なのでしょうか? どなたかご教授下さい m(_ _)m
監視しているinterfaceを流れてないだけだろ 同一ホスト上で動かしているならloopbackに流れてるだろうから そっちを監視してみな。
>>438 解決しますた!
> 同一ホスト上で動かしているならloopbackに流れてるだろうから
こういうことだったんですね。
IPアドレス指定してたんで eth0 に流れていると思ってました。
どうもありがとうございます。
質問です。 VC++ + WinsockのUDPでプログラミングしてるのですが サーバーでクライアント側のルーターでマッピングされたポートを知りたいのですが どうすれば良いのでしょうか?
無理
ちうかサーバが受け取ったデータの、元ポート番号がマッピングされたポートじゃないのか PC自身のポート番号のことなら、通信データの中身に埋め込んで送ればよいかと
普通に受信した(struct sockaddr_in *)&hoge で受信すれば取れないか? 使うのと言えばスレで散々既出のPunching Hole UDPとSTUNくらいだが… そもそもクライアントはサーバーと違ってポートなんぞ知る必要ないからな
いっとくが送信するときに使うポートは普通は不定。 受ける(待つ)側は特定できるけど。
>>444 それじゃあPunchingHoleUDPが実装出来ないジャン
クライアント側が把握しているのはあくまでアプリケーションが使用するポートであって
ルーターがマッピングするポートはクライアント側にも判らんし
ルーターのポートマッピングは外部からのポート接続を 内部のどこにもってくかだから送信するときは関係ない。
一方はsendばっかり、もう一方はrecvばっかりのプログラムで、 sendするプログラムをパラレル実行するとrecvする側がデータ を取りこぼすことがあります。 Windows XPからsendする場合、10パラレルでも宛先ホストは すべてデータを受信できますが、AIXからsendすると、10個に 2つ程度、宛先ホストでおかしなデータを受け取ります。 send側もrecv側も同期型のTCPストリームソケットにしている ので、sendは宛先からのACKを受け取るまでブロックすると 思っていたのですが、受信側の能力を上回ってsendを最後 まで実行してしまっているようです。 AIX側でTCP_NODELAYを設定し、sendとsendの間に1ミリ秒の sleepをはさむと10パラレルで転送できるようになりました。 このような場合、他に解決方法はあるのでしょうか。
データ長とかつけた独自ヘッダはさむようにしたら?
パラレルってのはスレッドのことなのか?
データ長は固定長ヘッダにつけてます。 パラレルはスレッドではなく、プログラムを同時に10個起動した場合です。 Windows は start ***.exe、AIX は *** & のような形で10プロセス起動してます。
> sendは宛先からのACKを受け取るまでブロックすると(以下略) これはちと違うぞ。 sendは送信バッファがいっぱいになるまで、ブロックしない。 ACKとかの手続きはアプリケーションの関与しないところで 勝手にやってるだけ。 ちょっと気になるのが、recv時に受け取れるだけ受け取って 余った分を捨ててたりはしないよな? まぁそういう状態だったら、おかしなデータ以後は全部 ぐちゃぐちゃになるから分かるか…。
>>447 ストリーム型のsocketでそんなことが起きるなら、大抵の場合447さんの
プログラムにバグがあるので、それを直すのが普通だと思います。
stream 型ソケットの場合、
send で送っているデータ区切りと、recv が読み込むデータ区切りには
一致しないのが普通ということには配慮していますよね。
453 :
デフォルトの名無しさん :04/05/21 22:57
このスレで最近STUNとかUDPHolePunchingの話がよく出てるけど、 あれ流行ってんの? 俺はやってるけど。
送信側「10バイト送ったぜ!」 受信側「10バイト受け取ったぜ!」←実は6バイトしか取れてない 送信側「また10バイト送ったぜ!」 受信側「・・・先頭に変な4バイトついてるよー(つд`)ぅゎ-ン」
455 :
デフォルトの名無しさん :04/05/22 03:11
「パイプが切断されました」というエラーは何が原因かわかるかたいらっしゃいますか? メールを送信する簡易的なプログラムです。
>455 そのまんまの内容
457 :
デフォルトの名無しさん :04/05/22 03:52
>>456 レスありがとうございます。
しかし、自分自身パイプというものがわかっておりません。
どのような書籍をみれば書いてあるでしょうか。
>457 OS依存の話になるから WinならMSDNでCreatePipeなどで検索 Unix系なら"Unix パイプ"などで検索すれば 充分情報あると思うよ
459 :
デフォルトの名無しさん :04/05/22 04:56
>>458 ありがとうございました。
たくさんincludeしているファイルのソースに問題ありそうなのでもう少し
調べてみます。
>>455 sendしようとしたときに既にconnectionが切れてたんだろ。
別にEPIPEはいわゆるIPCの「パイプ」のみで起きるエラーじゃないよ。
_,,,,,,,, , - ' ゙ `` ‐ 、_,,,,, ,r' /=ミ / 彡ll',''´ . / 彡lll !-- .、 ,、、、、,,, 彡lノ l,,,,,__ / ___ 'r''゙ヽ . |`゙'' ./ `'゙'''" .〉,l | |. ,' // . ',. ,' , r' . ゙, ゙'ー ‐` l | ゙、''゙ ,,、二''‐ ノ l、 ''''''''7'ヽ ''' / /`〉`゙T'''''''''' l ` 、,,,,、- ' " / /.| | . | | .l i / ./ | | | | | l / ./ .| | . | | | l / / | | | | | ', / / l .l 【ゴールデンレス】 このレスを見た人はコピペでもいいので 10分以内に3つのスレへ貼り付けてください。 そうすれば14日後好きな人から告白されるわ宝くじは当たるわ 出世しまくるわ体の悪い所全部治るわでえらい事です
レスありがとうございます。
>>451 よく調べてみたら、ACKは確かにsendで必ず返ってくるわけではないようです。
だからTCP_NODELAYを設定するとうまくいくのかもしれません。
recvは受信できたバイト数を戻しますので、ヘッダで受け取ったレングス分の
受信が完了するまでループしています。sendも同様です。
>>452 バイナリデータを送信してるので、データ区切りというものはつけていません。
send側プログラムで、送信に対する相手からの応答をrecvする処理を間にはさめば
うまく動くのですが、sendのみを繰り返すとAIXに限りうまくいかないのです。
状況としては454さんの書かれているようなことが起こっています。
聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを
設定する解決方法が正しいのかどうか、ということだったのですが、
このような状況に遭遇された方はいないようですね。
プログラムのバグも含めていろいろ調べてみます。ありがとうございました。
訂正。 454さんの書いている状況とはちょっと違いました。 前データの残りを後の受信処理で受けてるわけではなく、受信処理自体 は成立しています。但しデータの欠損があります。 TCP_NODELAYを設定せずに、sendとsendの間にACK遅延に相当する200ミリ秒 の遅延を入れても正常に動作します。 また、AIXからWindowsやLInuxへsendする場合はTCP_NODELAYやsleepを 入れなくても正常に動作します。 CPU負荷の高い宛先ホストに、10パラレル転送した場合のみデータ欠損が発生 している状態で、シングル実行や2〜3パラレルでは発生しません。
sendが正しく成功したかどうかも確認してる? 送るだけだからエラーチェックしていないなんて事は無いよね?
>>462 > バイナリデータを送信してるので、データ区切りというものはつけていません。
バイナリデータでも、データ区切りつけていいべ。
> うまく動くのですが、sendのみを繰り返すとAIXに限りうまくいかないのです。
特定の環境でしかうまく動かないプログラムなんでしょうね。
> 状況としては454さんの書かれているようなことが起こっています。
> 聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを
> 設定する解決方法が正しいのかどうか、ということだったのですが、
あなたの起こしている障害の解決方法としては正しくないです。
緩和はされるかも知れませんが。
>>464 他にはTCP、つまりSOCK_STREAMなのに、
SOCK_SEQPACKETのようなプログラミングしている可能性があるべ。
TCPがpacket streamじゃなくてbyte streamだってことを理解しているのかな?
書き忘れた。 初心者がTCP使う時は、sendやrecv使うんじゃなくて、 fwrite, fread使った方がいいよ。fdopen(3)してね。 packet size header使えば簡単だし。 recvで二つのpacket(だと初心者が考えている)dataを まとめて受ける可能性だってあるわけだし。
プログラムの障害(バグ)ということで、TCP_NODELAYを使うよりも
別の方法を利用すればよいとのレス、ありがとうございます。
ただ、
>>467 でパケット2つ分を受け取る可能性があるそうですが、
以下のようにrecvで必要なバイト数ずつ読み取れば、まとめてデータ
を受信しようが問題ないように思うのですが。
固定長ヘッダのレングス分sendループ ---> 固定長ヘッダのレングス分recvループ
ヘッダで送ったデータ長分sendループ ---> ヘッダで受信したデータ長分recvループ
プログラム内では「固定長ヘッダ+データ」をひとつのまとまりとして
扱っています。固定長ヘッダにはシーケンス番号をつけており、処理も
この順序に依存します。SOCK_STREAMは順序性が維持されるため問題ない
と判断しましたが、SOCK_SEQPACKETを利用する方が適切なのでしょうか?
また、fdopen(3)を利用すれば回避できるものでしょうか。あるいは、
バグがないように書けば現在のようにsendばかりのプログラムと
recvばかりのプログラムでも問題ないのでしょうか。
>>464 レス見落としていました。ありがとうございます。
エラーチェックですが、sendで戻り値がSOCKET_ERRORの場合だけチェックしています。
SIGPIPEをalarmでハンドリングできるようにしているので、sendの戻り値が
0 の場合は特に何もしていないのですが、チェックすべきでしょうか。
固定長ヘッダの送信も同じような形で行っています。
ヘッダで送信するデータ長はビッグエンディアンの並びになるよう統一
しています。
nSendLength = 0;
while(nSendLength<BuffLength)
{
nRc = send(sock, pBuffer+nSendLength, BuffLength-nSendLength, 0);
if(SOCKET_ERROR == nRc)
{
return errno;
}
nSendLength+=nRc;
}
受信側はこんな感じですよね・・・ unsigned char data[MAX_DATA_SIZE]; uint32 size; size_t to_read = 4; size_t len; unsigned char* ptr = (unsigned char*) &size; while (to_read > 0 && (len = recv(s, ptr, to_read, 0) > 0) ptr += len, to_read -= len; to_read = ntohl(size); ptr = data; while (to_read > 0 && (len = recv(s, ptr, to_read, 0) > 0) ptr += len, to_raad -= len; どこかで間違ったデータ長を渡している可能性はありませんか? あと、 >聞きたかったのは、sendでデータを送りっぱなしにする場合にTCP_NODELAYを >設定する解決方法が正しいのかどうか、ということだったのですが、 パフォーマンスチューニングの一環としてはありえますが、今回のように それなりの長さのデータをばーっと送るときにはそもそもあまり有効ではないと思います。 telnetみたいに間歇的に小サイズの送信を行って、かつdelayが許容されないときなんかに使います。
>>470 サンプルのご提示、ありがとうございます。
受信側はデータ長だけでなく固定長ヘッダをまとめて受信します。
また、recvの戻り値でもSOCKET_ERRORのチェックをまず行っています。
あとは、サンプルコードで書かれている流れのように
・送受信バッファはunsigned charで確保しており、構造体ではない
・TCPバイトオーダーでデータ長を受信する
・ヘッダとデータはそれぞれ必要レングス分ループする
という処理になっており、
>>470 さんのいわれる処理と同じような形です。
またデータ長の誤りは考えにくいのです。
これまで、送信側はsend後に相手から受領確認をrecvし、受信側はデータ
recv後に受領確認をsendするような形で何年かプログラムを使ってきました。
もしデータ長が間違っていれば、これまでの運用でプログラム独自のプロトコル
エラーが出ていなければならないのですが、そのようなことはありませんでした。
今回、send-recvの繰り返しで通信速度が遅くなる点につき、送信側はsendのみ、
受信側はrecvのみに徹して速度向上を図ったところ、問題が生じた次第です。
TCP_NODELAYの設定については不適切とのご指摘を多くいただいているので、
プログラムに問題があるとは思うのですが、まだ問題点を見つけられずにおります。
ちなみに送信元はAIX、宛先ホストはOS/390でパラレル実行した場合にのみ問題が起こります。
同じソースでもWindowsからOS/390へ送信した場合や、OS/390からWindowsやAIXへ送信した
場合には問題は起こっておりません。
sendのみ(recvのみ)の通信処理で一般的に考慮すべき点を調べてみるつもりです。
参考になりそうな書籍やWebサイトがあればご紹介いただければ嬉しいです。
よろしくお願いいたします。
OSの製造元に再現コード送れば?
>>447 この状況についての確認ですが、
> Windows XPからsendする場合、10パラレルでも宛先ホストは
> すべてデータを受信できますが、AIXからsendすると、10個に
> 2つ程度、宛先ホストでおかしなデータを受け取ります。
接続を10本張って、
送り側、受け側それぞれ独立のプログラムが10個動いている、
ってことでいいですか?
>>472 OSを書いてしまうと、恐らくメーカーサポートを勧められると思ってました。
一般的なTCP/IPの仕様でOSに関わりなく何か見落としがあるかと思って質問させて
もらいました。メーカーへの問い合わせは行っていきたいと考えています。
>>473 情報ありがとうございます。
rc.netファイルでtcp_recvspaceを調整して試してみます。
>>474 はい、その通りです。
送信側、受信側は同じプログラムを10個動作させて、別プロセスとしています。
送信側(AIX)から受信側(ホスト)でACCEPTしているポートに接続する単純なものです。
それぞれ別々の10個のポートで接続を貼っています。
ホストではパラレル起動させるために別々のJOB名で同じPGMを動かしています。
もちろんJOBを動かすためのイニシエータも10個用意しております。
で、ヘッダ+データを何回も送ってんだよね。 データ欠損って言うけどどういう症状なの? 1. 正常にヘッダ+データを幾つか受ける。 2. データが欠けていて次のヘッダを受けている。 3. 以後、データ区切りが分からなくなり滅茶苦茶。 こう進行するわけ?
JOB名とPGMとか、オフコンとか方面の人?
簡単なところで、fdopen して fread するっての試してみる手もあるけど、 それでうまくいっても安心できない状況ですよね。。。
NIC(ドライバ)が腐ってるオチだったり
そのレベルでおかしいとTCP checksumでひっかかる。
どう考えても受信側の問題にしかみえないのになんで受信側OSが書いてないの?
と思ってたら、OS/390 かよ。俺には未知の世界だ…。
通信処理で一般的に考慮すべき点、という話では、典型的なストリーム型とパケット型の混同
による受信側のバグにしか見えないなあ。俺にはね。
>>454 風に書くと、こういうことが起こっているように見える。
送信側「10バイト送ったぜ!」
送信側「また10バイト送ったぜ!」
受信側「10バイトくれ! お、来た来た、10バイト受け取ったぜ!」←実は16バイト受け取ったのに気がついていない
受信側「次の10バイトくれ!・・・先頭の6バイトが足りないよー(つд`)ぅゎ-ン」
まあ、それがダントツの第一候補だろうね。
>>481 >>469 を見るとその手の間違いをやっているとも思えん。
全然別の場所にバッファオーバーランをやっているとか?
>>484 だって
>>469 は送信側のコードだし。
受信側は
>>470 で別の人がサンプル書いてるけど、本当にこれと全く同じ
ロジックだったら問題はないはずなんだが、元質問者が「同じような形」だ、
と書いてあるだけなので検証できてない。
そうしてるつもりで実はそうなってなかった、ってのがバグなんだからさ。
他の書き込みも一通り目を通したけど、これが原因だった場合と
矛盾している症状はないと思う。
念の為補足しておくと、
>>470 の処理で重要なのは to_read の処理だからね。
これ以上ソース晒さずに話しても無駄だとオモウ 晒すかサポートに電話するかどっちかにしろ
サーバ側で、接続待ちループとメインループをそれぞれ別スレッドで動かしています。 クライアントを定義したクラスをvectorで持っており、接続待ちループでクライアントの追加イベントがあった場合、 そのvectorクラスのpush_backを呼び出して、クライアントを追加します。 しかしその場合、メインループでそのvectorクラスのインスタンスを操作している可能性があり、ましてpush_backでメモリの再確保が行われてしまったら、動作がおかしくなると思います。 こういう場合、クライアントの追加はどういう風にするべきなのでしょう?
490 :
デフォルトの名無しさん :04/05/26 19:08
fry
>>489 CriticalSection使えば?
メインループに「接続キター」メッセージを送ればよい
"エラーキタ━━━━━━(゚∀゚)━━━━━━!!!!","ERROR"
しばらく見ないうちにレスを多くいただきましてありがとうございます。 みなみなさまのおかげで無事解決いたしました。おっしゃるとおりバグでした。 しかも通信とはまったく関係ないところで・・・本当申し訳ないです。 ホストではJOBLOGに受信内容をHEX PRINTして受信内容を確認していたのですが、 その出力処理がフルワードの受信レングスをハーフワードで解釈しておりまして、 受信は正しくできていたのに内容をレングス分きちっと表示できていないケース があったような次第です。 追加した処理が正しいか確認するための処理にミスがあったというお粗末な結果 となりました。 いろいろお知恵下さった方々、本当すいませんでした。ごめんなさい。逝きます。
ちなみに、パラレルとかシングルとかまったく関係ありませんでした。 送るデータのレコード長がそれぞれ違ってたので、たまたま10個のPGM中で 長いレコードを扱うものだけおかしかった次第です。すいません。
TCP_NODELAYを設定したときだけ出力に問題がなかった件についてはまだ謎です。
>>489 ベクターかよ。リストじゃダメなの?
ベクター+マルチスレッド+push_*()は、iterator使うと悲惨だよ。
まあ、あらかじめallocate()した分しか使わないと保証があれば別だけど。
>>494 あのなあ、無視されるのも辛いだろうからあえて言わせて貰うが、
「氏ねや!」
>>489 私なら別に登録キューを用意して、接続待ちループの追加イベントでは
そのキューに追加するだけ、実際のvectorへの追加はメインループ内の
安全な場所でlook inにするかな。もちろん登録キューの操作はモニタなり
Mutexなりで安全に。
>>499 いや関係あるんじゃないか?
「追加時のメモリの再配置」はおこらんでしょlistなら。
ロックが必要な箇所を減らせる可能性はあるよね。
503 :
名無しさん@お腹いっぱい。 :04/05/27 20:41
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの? NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。 最悪、ipconfig /allした結果を使おうかと思うのだが。。。
504 :
名無しさん@お腹いっぱい。 :04/05/27 20:43
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの? NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。 最悪、ipconfig /allした結果を使おうかと思うのだが。。。
505 :
名無しさん@お腹いっぱい。 :04/05/27 20:48
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの? NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。 最悪、ipconfig /allした結果を使おうかと思うのだが。。。
506 :
名無しさん@お腹いっぱい。 :04/05/27 20:52
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの? NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。 最悪、ipconfig /allした結果を使おうかと思うのだが。。。
JAVAでTCPIP通信のサーバ側に接続するのに、connectメソッドを呼んでいるのですが、 connectメソッドから1分以上応答がありません。 接続タイムアウト時間(即時タイムアウト等)を任意で設定したいのですが設定方法がわかりません。 どなたかご存知の方教えていただけないでしょうか? 環境は、SunEWS + Solaris8です。
>>505 MSDNをiphelperで引いて味噌。(iphelper.lib)
>>506 ゲラゲラゲラ
厨丸出しだな(藁
厨房はMSDNで ip helper api を検索しやがれ。
>>502 少なくとも、お前みたいな足りんやつはやらないほうがいいな。
511 :
名無しさん@お腹いっぱい。 :04/05/28 00:29
Windows2000/XP環境で、MACアドレスを知るにはどうすればいいの? NICにケーブルが刺さっていないような場合でもMACアドレスを取得したいんだけど。 最悪、ipconfig /allした結果を使おうかと思うのだが。。。
512 :
名無しさん@お腹いっぱい。 :04/05/28 00:45
プゲラ
513 :
デフォルトの名無しさん :04/05/28 02:10
汚いやり方だけどDOSコマンドでも不正解とは思わんのだけども…
515 :
仕様書無しさん :04/05/28 11:40
>>503--506,
>>511 の連投をしたバカモノです。
一応言い訳すると、カキコしたあとサーバエラーが出たんで再カキコをしたんです。
別板で、鯖移転がらみでカキコはできてもエラーを返す状態になっていると知ったので、そういうことだったのでしょう。
で、iphlpapiについての情報、サンクス。環境を書かなくてすまんかったけれど、VC++6.0でコンパイルしたいのね。
VC++.NETではGetAddresses()でMACアドレス得られたけれど、VC++6.0だとiphlpapi.hがないからコンパイルできぬ。
プラットフォームSDKを入れてみたら?
>>515 PlatformSDKぐらい入れとけ。
518 :
デフォルトの名無しさん :04/05/28 13:05
519 :
デフォルトの名無しさん :04/05/28 13:53
>> 508 JAVAでは知らないけど、Solarisのconnect(2)を最終的に 呼んでるのであれば、タイムアウトの指定は出来ないと思うよ。 自分でalarm(2) みたいなタイマを用意して、connect(2) に 割り込みって入れられないの? 最近の*BSDなんかだど、setsockopt(2)とかでタイムアウト時間が 指定出来たりするんだけどね。
すまん、
>> 508 じゃなくて、
>>507 でした。
java.io.socketでWANを経由するsocket通信をするのはただのアフォ。 自前のnativeラッパーを作るか、プロキシを立てるのが定石。
522 :
デフォルトの名無しさん :04/05/28 14:29
521をさらしあげ
523 :
デフォルトの名無しさん :04/05/28 14:37
>522 そして漏れは522をさらしあげ
524 :
仕様書無しさん :04/05/28 15:37
>>516 >>517 PlatformSDKを入れました。うん、VC++6.0でもコンパイルできた。サンクス。
ところで、いつもコマンドプロンプトでコンパイルしてるんですけれど、
cl.exeにこの新しいPlatformSDKのincludeとlibのパスを与えるにはどうしたらいいんでしょうかね?
-Iでincludeパスは渡せたんですが、libのパスをどうやって与えるのか。
cl .... /link /libpath:"c:\promgram files\platform SDK\lib" みたいにすると、おバカなLINKコマンドは "files\platform" を開けませんなんて言うし。
525 :
仕様書無しさん :04/05/28 15:43
>>524 自己レスです。8.3表記を使ったらできました(哀)。
実は、clがおバカで、linkへオプションを渡す時に「"」をはずしてるとか。 linkを別途呼び出してみたら?
527 :
仕様書無しさん :04/05/28 16:02
>>526 実験しました。linkに対しては"..."は有効のようです。clが超おバカでした。
色々な実験を経た結果、"\"path"\" のように書けばうまくいきます。
8.3表記しなきゃならないかと思ってカグブルでした。。。
528 :
デフォルトの名無しさん :04/05/28 22:35
Punching hole UDPについて だれか 教えて 過去ログからの 俺の理解だと 1) A -> B UDPにて通信 2) 生ソケでAが使用したポートを調べる 3) Cがそのポートに対して通信 これでOK? ただ ネットで検索するとこんな簡単そうでないし UDPの場合 パケット毎にポートかわるよね? どうも 理解できん・・・ たのむ おしえてください
生ソケットを使わずとも、送信元のポートは分かる。 しかし相手のNATが送信元と送信先を厳密に検査するテーブルを持っている限り、 何をやっても通信が通ることはない。
つまるところ、NATの実装に依存しまくり
532 :
デフォルトの名無しさん :04/05/29 06:56
マーケットスピードの株価自動更新って、どんなプログラムですか?
533 :
デフォルトの名無しさん :04/05/29 09:31
ちょっと質問です。 ソケットで、たとえばsend(割と大きいでーた);をしたときに、 フラグメンテーションがおこりますよね? (APLレベルで)recv関数を呼んでデータを受信しますが ここで受信できるデータって、受信側がACKパケットを 返したところまでと考えていいんですかね?
>>530 Synmetric系以外のNATならほぼOKだと思われ。
しかもSynmetrickなんて高セキュリティーなNATはスループット低下を招いたり高額になったりするから
普通のユーザーには受け入れられてないぞ。
企業くらいだと思われ。
535 :
デフォルトの名無しさん :04/05/29 12:51
雑談もいいけど質問に対する回答も・・・
別に解答する義務は無いと思うが? 新手の催促か?
新手の煽りではw
>>534 関連してだけど
その場合ケーブルテレビ系でもOK?
Upnpはケーブルテレビでも開ける?
もちろん LinuxもUpnpできるけど
実際のところ どうなんだろ?
Punching hole UDP なんて使わなくても Upnpで
十分なきもするが みなさんの見解おしえて
>>538 UPnPはルーターにXML形式でこのポート開けて!
と命令を送って対応ルータが開けてくれる仕組みで
対応してないのはほぼ全て無理
ISPのNATは絶対に超えられないと思われ。
それに対してPunching hole UDPはUDPの特性を生かしたもので
殆どのルーターで成功する。
あと、ISPのNATも場合によっては超えられる事が多い。
UDPはコネクション型ではないので応答の為に一時NATが経路を確保する必要があるので
その経路を利用するものだからな。
540 :
デフォルトの名無しさん :04/05/29 13:41
質問です。 60k程度の情報リストをUDP形式でサーバーから受け取る仕組みを作ってるのですが UDPはどれくらいのサイズの情報あたりから失敗する可能性が出てくるのでしょうか? 1回の転送でOKなサイズはどれくらいなのでしょうか?
1バイトでもダメ
>>533 良くない。
基本的に,そういう隠蔽された部分の動作に期待するべきじゃない。
特定の実装,特定のバージョンのみに限定するなら,別だがな。
>>544 そのサイトの通り、多くのNATで動かすには双方のNATで経路を確保する必要がある。
片方だけだとダメな事が多い。
出来る事もあるんだけど・・・
546 :
デフォルトの名無しさん :04/05/29 15:39
>> 533 違うと思うよ。 受信側(recv)のOSは、受信データを受け取ってOSの内部バッファ(setsockoptで変更可能)に 格納した時点で、ACKを返してると思います。 アプリ側にデータが渡ったがどうか(recvをコールしたかどうか)には依存していません。
質問です。 UDPで通信する時に、zlibで圧縮して通信したいのですが 具体的な説明がされてるサイトってありますか? 一応調べたんですが、どうもソケットは扱えないと書いてあったので どうすれば良いのかサッパリわからないんです。
扱えなければ、扱うようなプログラムを書けばよい。
質問です。 TCPを使えばコネクションが切れたとき確実に判りますか? コネクションが切れた時点で鯖側でクライアントの情報をデータベースから確実に削除したいのですが…
>>546 > 受信側(recv)のOSは、受信データを受け取ってOSの内部バッファ(setsockoptで変更可能)に
> 格納した時点で、ACKを返してると思います。
では、スライディングウィンドウの範囲内のデータもsetsockopt(SO_RCVBUF?)
で変更可能なOSの内部バッファに入ってるんですかね?
OSの内部バッファ(setsockopt)に入っているデータの中に、スライディング
ウィンドウの対象範囲内となっているデータが入っていると、
(トランスポートレイヤレベルで)受信途中のものも受信しそうなきがするんですが・・・。
>アプリ側にデータが渡ったがどうか(recvをコールしたかどうか)には依存していません。
おつけいです。
>>551 ちゃんと切ってくれれば判るが放置されたらわからん。
回線が勝手に切れたりとかな。
結局確実にと言うわけにはいかんな。
554 :
デフォルトの名無しさん :04/05/30 20:55
>>551 553のいうとおりで、マシンの電源引っこ抜かれたら気づかなかったりするかも。
相手側がKEEPALIVEをサポートしてれば、短めに設定しておいて早めに
切断を検知する方法しかなさそうな気がする。
訂正。 >(トランスポートレイヤレベルで)受信途中のものも受信しそうなきがするんですが・・・。 (トランスポートレイヤレベルで)受信途中のものもrecv関数で(APLレベルで)受信しそうなきがするんですが・・・。
556 :
デフォルトの名無しさん :04/05/30 22:25
>> 533 OSの内部バッファ(SO_RCVBUF)にあとどれだけデータを詰め込むことが 可能かを示すのが、ウィンドウサイズだと思うけど。 >>(トランスポートレイヤレベルで)受信途中のものもrecv関数で(APLレベルで)受信しそうなきがするんですが・・・。 意味がわからない。 受信途中ってのはどういう意味で使ってる? OSの内部バッファに受信データが入っていればそれをrecvで取り出すことは出来ると思うけど。 そもそも、selectで受信データが在れば抜けてくるっていうのはそういうことじゃないの?
>>554 そりゃまだICMPホストアンリー茶ブルがあるがね。
プログラムが暴走して音信不通ってのが一番イヤらしいのの一つ。
temporary problem accessing database. 自作ソフトでメールを受信してみるとサーバーから上記のようなエラーが 帰ってきます。原因は何なんでしょうか? それとメールは、ヤフーの無料のものです
>>556 >OSの内部バッファ(SO_RCVBUF)にあとどれだけデータを詰め込むことが
>可能かを示すのが、ウィンドウサイズだと思うけど。
セマンティックスギャップがおきているみたいです。
ウィンドウサイズ=スライディングウィンドウのサイズ=受信確認(ACK)無しに送信されるバイト数
のことを言ってます。
>受信途中ってのはどういう意味で使ってる?
>OSの内部バッファに受信データが入っていればそれをrecvで取り出すことは出来ると思うけど。
送信側
PACKET100-----------------------> 受信側
<------------------------ACK100
PACKET101-----------------------> 受信側
<------------------------ACK101
PACKET102--------------->(途中で消失)
届いてないのでACK102送らず
PACKET103----------------------->
<------------------------ACK103
データ送ってPACKET102が途中消失しちゃって PACKET100,PACKET101,PACKET103が届いている状態。 PACKET102が受信途中。
この場合、PACKET101まではrecv()関数で受信してもいいけど PACKET103をsetsockopt(SO_RCVBUF)で指定するバッファに入れちゃうと
PACKET102受信前に、PACKET103を受信して順番がくるうと思う。
だからスライディングウィンドウ用のバッファと、 recv受信待ちバッファ(OSの内部バッファ(SO_RCVBUF)のもの)
の最低2つのバッファをOSで持っていないとだめなような気がするのは 私だけでしょうか?一番いいのはソケット実装のソースみればいいのかも。。。。
あ、PACKET102受信してないからACK103は返さないな・・・。 もういっかいでなおしてくる
>>556 >>559 おいおい,お前ら,どっちもDQN。
TCPレベルでの処理なんて,ブラックボックス。
さも世の中全てそうであるかのように語るなよ(プゲラ
お前らがお話しているのはどこ製のブラックボックスでちゅか〜?
どっちも自家製妄想ボックスか〜な〜?
562 :
デフォルトの名無しさん :04/05/31 06:58
>>561 ソース公開されてるのに何でブラックボックス??おまえがDQN
厨房しつもんで すんませn UDPでconnectを使用した場合 UDPの到着順が狂うという特性は回避 されます? また、 UDPのノウハウがつまったような サイトがあったら ぜひ教えてください
565 :
デフォルトの名無しさん :04/05/31 10:54
>> 563 されません。
よくかんがえたら TCPでも 順序違いが 発生したんですね
568 :
デフォルトの名無しさん :04/05/31 20:25
質問させて下さい。 Windowsで、GetIfTable()を使い 通信情報の取得をしているのですが dwLastChangeの値がどうにもよく分かりません。。。 ネットワークの接続時間を調べたいのですが dwLastChangeの値がどういう単位なのか教えて頂けませんか?
569 :
デフォルトの名無しさん :04/05/31 23:45
>データ送ってPACKET102が途中消失しちゃって PACKET100,PACKET101,PACKET103が届いている状態。 >PACKET102が受信途中。 この状態は、TCP的には、PACKET101までが受信完了。 PACKET102の受信を待っているところ。 >この場合、PACKET101まではrecv()関数で受信してもいいけど よいですね。 >PACKET103をsetsockopt(SO_RCVBUF)で指定するバッファに入れちゃうと >PACKET102受信前に、PACKET103を受信して順番がくるうと思う。 これは、ないでしょう。 TCP的には、こんなことは出来ません。 >だからスライディングウィンドウ用のバッファと、 recv受信待ちバッファ(OSの内部バッファ(SO_RCVBUF)のもの) >の最低2つのバッファをOSで持っていないとだめなような気がするのは 私だけでしょうか? 実際の実装に関しては、それぞれだからなんともいえないけど、バッファリング機構としては、そうなりそうですね。 そっか、おいらが、OSの内部バッファに受信したパケットを格納した時点でACKを返すって言ったからか。 TCP的にACKを返すってことは、ACKで指定したシーケンス番号までのデータがきちんと順序良く受信出来てます ってことだから、 > あ、PACKET102受信してないからACK103は返さないな・・・。 ということだと思います。 結局、「受信途中のデータ」というものは存在しないってことでOK?
570 :
デフォルトの名無しさん :04/05/31 23:48
もうちょっと、補足すると、 「TCPが処理を完了する前のデータ」ならあるかもね。 だけど、それがrecvをコールするアプリに渡されることはない。
>>569 >結局、「受信途中のデータ」というものは存在しないってことでOK?
かもしれんし、
>「TCPが処理を完了する前のデータ」ならあるかもね。
かもしれん。
バッファをどうやて使ってるかわからんけど
>だけど、それがrecvをコールするアプリに渡されることはない。
これは保証されてるってことやね。
なかなか考えさせられました。
>>571 流れ着いたままの順序で渡してくれるのが UDP
送信したとおりの順序で渡してくれるのが TCP
TCPスタック内部の動作は知らなくてもいいよというのが
TCP使う基本
573 :
デフォルトの七氏さん :04/06/01 12:07
自然対数eを実数変数の精度の範囲内で数値的に求めるプログラムを作って
574 :
デフォルトの名無しさん :04/06/01 12:08
楽勝だな。誰か教えてやれ
なんという授業の宿題ですか?
ここはネット関連のスレだろ。 もしかしたら、複数のPCを使って並列計算させるプログラムを教えてくれってことじゃないのか?
577 :
デフォルトの名無しさん :04/06/01 14:27
UDみたいなものか。
578 :
デフォルトの名無しさん :04/06/01 20:51
tcpサーバでコネクションがあるごとにFORKして子プロつくってそいつ等に通信さ せようとおもうんだけど子プロで通信がうまくいってないのを検知するのってどう やってやるの?とりあえずソケットがきれたら自殺してSIGCHLDを親が検知してゾ ンビ回収する方向でやろうと思ってるんだけど、SIGCHLDを検出できなかったらア ウトっぽいし、デッドロックとかで半死半生状態の場合も考えられるし。 ちなみに子プロはソケットとFIFOで通信させようと思ってるんで、親から定期的に 子のFIFOに書き込んで一定時間内に応答がなかったら死んでるっていうふうに解釈 してもいいのかな?子プロの巧い管理方法があったら教えて下さい。
tcpサーバでコネクションがあるごとにFORKして子プロつくってそいつ等に通信さ せようとおもうんだけど子プロで通信がうまくいってないのを検知するのってどう やってやるの?とりあえずソケットがきれたら自殺してSIGCHLDを親が検知してゾ ンビ回収する方向でやろうと思ってるんだけど、SIGCHLDを検出できなかったらア ウトっぽいし、デッドロックとかで半死半生状態の場合も考えられるし。 ちなみに子プロはソケットとFIFOで通信させようと思ってるんで、親から定期的に 子のFIFOに書き込んで一定時間内に応答がなかったら死んでるっていうふうに解釈 してもいいのかな?子プロの巧い管理方法があったら教えて下さい。
580 :
デフォルトの名無しさん :04/06/02 17:54
>> 579 とりあえず、UNIX系のOSだね。 子プロセス側で通信がうまくいっていない事を子プロセス自身がきちんと 認識できる事という事と、 子プロセスで検出した事象を親プロセスに通知するという部分は、 まったく別の次元の話ですよね。 まずは、起こりえる障害に対してきちんと検出、対応が可能なロジックが 組めるかどうかを考えたほうが良いんじゃないの? 子プロセスが、デッドロック状態になった時に親プロセスで検出しようとしてる 見たいだけど、子プロセスがデッドロックにならない様に作る事って出来ないの? 通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり なんでのは、みんな検出可能だよね。 その上で、 >親から定期的に子のFIFOに書き込んで >一定時間内に応答がなかったら死んでるって >いうふうに解釈してもいいのかな? >子プロの巧い管理方法があったら教えて下さい。 って言うのであれば、それはスレ違い。
質問です。 Winsock2での質問なのですが TCPで複数のセッションを管理する場合 どのようにするのでしょうか? 配列にsockaddr_in構造体をどんどん蓄積して行って 一致するIPを検索するような形でしょうか? 接続があればデータベースへ登録して、コネクションが切れたらデータを消すようにしたいのですが・・・
582 :
デフォルトの名無しさん :04/06/03 02:53
質問させてください。winsock2の非同期型で、 FD_RECVが来るごとに1度だけrecv()を呼び出した場合、 recv()がSOCKET_ERRORを返すことって通常あり得ますか? <LEN (4byte)><BODY (LEN byte)> という構造のデータを、 // LENあらかじめ受信され、バッファbufBodyも十分に長い lenRecv := WinSock.recv(FSOCK, bufBody[Pos], LEN - pos); inc(pos, lenRecv); (Delphi) ……みたいな感じで受信していたのですが、LANではいつもうまくいくのに インターネット上で離れた場所のPCとやると、時々データが壊れます。 recvの戻り値が怪しいと思い、エラーチェックするように変更したのですが、 本当にそこが原因なのかなあ? 、、、と。 recv()がSOCKET_ERRORを返す場合としては、どんな状況が考えられますか? 心当たりのある方、教えてくださいオナガイシマス
すいませんすいませんネットワークプログラムとは全く関係のないことなんですが、
>>340-344 がおもろかったので記念カキコ
藁。 歴史に残る名レスだ。 しかし、この程度歴史に残してたら、いくら歴史があっても足りん。
>>581 データを消すタイミングを知りたいだけなら、SOCKET変数とか
コネクションごとに、一意なデータを関連付けておけばOKでしょ。
>>582 Delphiでどう呼び出すかは知らないけど、WSAGetLastError()で
詳細とってみたら?
586 :
デフォルトの名無しさん :04/06/03 14:11
587 :
デフォルトの名無しさん :04/06/03 19:02
WinPAP ライブラリを使ったプログラミングで, 取得した IP パケットのプロトコル番号や TCP のポート番号などでフィルタをかけたいんだが, どうしたらいいの?
589 :
デフォルトの名無しさん :04/06/03 21:29
>>593 ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
ネタにマジレスすんなよ、バカ
えっと、もういいのかな?
↓じゃあ、何事もなかったかのように、ネットワークの質問どぞ。
WinCHAP ライブラリを使った(ry
599 :
デフォルトの名無しさん :04/06/06 22:50
bindの使い方を教えて
600 :
デフォルトの名無しさん :04/06/06 23:15
ノーブラボイン撃ち ソケットに名前を付ける socketで作ってbindで名前付けてlistenで待つ バインバインと音がするのでbindになった
突然すみません。 出力結果をテキスト方式で保存する方法ってわかりますか? ほんとに初心者で専門用語とかわからないので、 できれば初心者にもわかるように優しく教えてください。 あと、これは友達に聞いてといわれたモノなので実際は俺自身もよくわかってません・・・ よろしくお願いします。
602 :
デフォルトの名無しさん :04/06/07 19:49
>>601 socketで作ってbindで名前付けてlistenで待つ
>>601 どこがネットワークプログラミングなんだ?
604 :
デフォルトの名無しさん :04/06/07 19:57
ネットワークを使ってプログラミングの質問をしたんだろう。
>>604 つまらん書き込みだな。ageるほどでもないぞ。
606 :
デフォルトの名無しさん :04/06/07 20:03
>>605 こんな上にあるのにage/sageにこだわるなよ・・・
608 :
デフォルトの名無しさん :04/06/07 20:06
アホかおまえら
親切な俺が教えてやろう。 ./a.out > output.txt
うざがられる初心者の条件をピンポイントで満たしている
>>601 はエライ
UNIXダサすぎ。 つかってて平気ですか?
ブサイクなやつほど見た目にこだわる。
手のかかる子はかわいいんだよ。
最近は虐待などが問題になってるわけだが
複数人が同時にログインして作業できるOSって、他にないからなあ。 UNIXがなかったらと思うとぞっとするよ。
>>617 汎用コンピュータやスパコンあるじゃん
ま、こぼらーしかつかいませんが・・・ w
>>617 そういう面だけなら VMS もそんなに悪くなかったような気がするけど・・・
>617-618 ・・・頼むからもっと勉強してくれ
OpenVMSならTeraTermでログインして使った事あるけど、あのOSは Unixの思想(特にSoftware Toolsの考え方)とは全く違うからなぁ… 部分部分では「これってなんかNTっぽいかも」と思う部分はあったが、 なんつーかCygwin載ってない素のWin2000にtelnetd経由でログオン したような感じで。 「リモートログインできてコマンド叩けるのはいいけど、標準ツールは 少ないわ、正規表現使えないわ、それどころかリダイレクトもパイプ も使えなくて一体何をどうしろってんだ」 ってのが俺の感想。(リダイレクトは一応できなくはないけど、事前に リダイレクトONのコマンド叩いとかないといけないので、かったるくて やってられない。実際GNUの〜utils系入れたけど使い物にならず) 登場当時はともかく、今となっては完全に過去の遺物としか思えん なぁ。(逆に今でも第一線でバリバリ使われてるUnixが驚異的とも 言えるが) …そういやOpenVMSのTCP/IP周りは結局触らずじまいだったな。 (仕事的にもアレだったので、そこまでやる前に逃げた)
>>622 なにも勉強せずにいきなり使いこなせるわけないだろう…。
それを棚に上げて、使い物にならずとか、完全に過去の遺物としか思えんなぁ
という発言はおかしいぞ。
624 :
デフォルトの名無しさん :04/06/10 05:45
>>622 Unix 風に使うなら shell もいれないと・・・
いまだと GNV (GNU's Not VMS) なんていうので一式入るみたいですね。
>>625 DCL以外になにがいる! 私は1994年ごろVMSに移植された
CERN httpサーバーの上でCGIスクリプトをDCLで書いていた。
(スレ違いスマンがVMSってなかなか話題にならんのでつい)
627 :
デフォルトの名無しさん :04/06/10 11:22
IPアドレスから逆引きできる名前を すべて収集する方法がわからんです
628 :
デフォルトの名無しさん :04/06/10 11:23
大変ですね
Winsock で、メッセージ機構(とウィンドウ)を全く使わずに組みたいのですが、 そういうやり方に関して載ってるお薦め書籍ってありますか?
>>631 捕捉
普通の Berkley socket なスタイルの組み方はわかるんですが、
FAQ で言うような非同期 I/O やオーバーラップ I/O など性能いいのを使いたいのですが、
ぐぐってみた限りでは、非同期 I/O だとウィンドウプロシージャ宛てに
メッセージが届く仕様のようだし、オーバーラップ I/O は
検索キーワードがよくわかってないせいかほとんど情報がありませんでした。
633 :
デフォルトの名無しさん :04/06/10 15:19
散々既出で申し訳ないのですが…selectについて教えて下さい。 WindowsXPでVC++使ってます。 サーバ側のプログラムで、データが送信されたときだけrecvをしたいのですが… 例えば要点だけ書くと NewSocket = accept(OldSocket, (struct sockaddr *) &NewAddr, &NewAddrSize); として FD_SET(NewSocket, &read_set); でFDをセットして while(1){ if(select(1, &read_set, NULL, NULL, &timeout)){ recv(NewSocket, buffer, NET_BUFFER_SIZE, 0); } else ---; } とやってみたのですが、クライアントからデータを送っても一度もrecvに入らないのです。 色々試したり調べたりしたのですが、なぜかどこもUNIX、LINUXのソースばかりで…。 変数はそれぞれ適当な値が入ってます…おそらく。 どこが悪いか分かる方、教えてもらえませんでしょうか?
訂正 if(select(1, &read_set, NULL, NULL, &timeout)) ではなく if(!(select(1, &read_set, NULL, NULL, &timeout) == -1)) でした。すみません。
635 :
デフォルトの名無しさん :04/06/10 15:32
>>633 if(select(NewSocket+1, &read_set, NULL, NULL, &timeout)){
じゃなくて if(select(NewSocket+1, &read_set, NULL, NULL, &timeout)!=-1){
>>631 漏れは、SOFTBAKがDEVELOPER PRESSというシリーズで出していた
「WinSock 2.0 プログラミング」という本で、概要を勉強したけど、
もうamazon.co.jpにも出てこないような本だからなあ。役立たずでスマン。
でも、MSDN地道に読むのも、勉強になるよ。
>>636 それでやってみたところ、一回目のselect呼び出しで一度0が返り、
データの送信なんてしていないのにservが呼び出されてしまいました。
…で、とりあえずデータ送信してやったら、2度目からのselect呼び出しでは
ずっと-1が返ってます。
データを送信してもservに入ってくれなくなりました。
GetLastErrorでみると
無効な引数が提供されました。
と言われます。
謎です。
>>632 こんな感じでやればほとんどBerkley socketの非同期とかわらんよ
ちと汚いが・・・
//ソケット作成(現時点ではブロッキングモード)
SOCKET Socket.Socket = socket(AF_INET, SOCK_STREAM, 0);
if (Socket.Socket == INVALID_SOCKET)
{
WSACleanup();
return FALSE;
}
// ソケットを非ブロッキングモードに設定
arg = 1L;
nRet = ioctlsocket(Socket.Socket, FIONBIO, &arg);
if (nRet == SOCKET_ERROR)
{
WSACleanup();
return FALSE;
}
//これ以降は完全非ブロッキング SOCKET SocketRcv; struct sockaddr_in acp; int len = sizeof( acp ); //accept処理 for (;;) { if( ( SocketRcv = accept( Socket, (struct sockaddr *)&acp, &len)) < 0 ) { closesocket( Socket ); exit(1) } if(WSAGetLastError() != WSAEWOULDBLOCK) { // 接続エラー closesocket(Socket.Socket); exit(1); } }
//recv処理 char szBuf[BUF_SIZE]; WSABUF wsaBuf; DWORD dwRetByteCount; WSAOVERLAPPED wsaOverlap; DWORD dwWsaFlg; wsaOverlap.hEvent = WSACreateEvent(); wsaBuf.buf = szBuf; wsaBuf.len = sizeof(szBuf); dwWsaFlg = 0; for(;;) { dwRetByteCount = 0; memset(szBuf,0,sizeof(szBuf)); if ( WSARecv( SocketRcv, &wsaBuf, 1, &dwRetByteCount, &dwWsaFlg, &wsaOverlap, NULL) != 0) { // とりあえず受信完了するまでまってみる?! nRet = WSAGetOverlappedResult(SocketRcv, &wsaOverlap, &dwRetByteCount, FALSE, &dwWsaFlg); switch (WSAGetLastError()) { case WAIT_TIMEOUT: break; case WSA_IO_INCOMPLETE: break; // 非ブロッキング状態なので常にここへはいってくる case WSA_IO_PENDING: break; //変なエラーなのでおとしたほうがいいかも・・ default: } continue; } //RECV完了処理 }
>>638 Winsockの場合、第一引数はBSD互換の為に
残されてるだけで、実際は使われてない。
ただ、一応残されてるので
>>636 のようにBSD互換で書いておいた方がいい。
で、read_setはselectを呼び出すたびに設定しなおさなきゃダメよ。
だから、この場合
FD_SET(NewSocket, &def_set);
while(1){
read_set=def_set;
if(!(select(NewSocket+1, &read_set, NULL, NULL, &timeout) == -1))
でいけると思う。
>>642 どうもありがとうございます。
解決しました。
read_setの書き換えと、データが送信されたときのselect()の戻り値が1であることの2点が悪かったようです。
データ送信されてないときのselectの戻り値0なんですね…。
忘れていました。
>>630 gethostbyaddr を使って h_aliases を見ればよいのですね
助かりました
>>645 あれ?WinSockで検索しても、出てこないから、取り扱いが
無いのかと思ってた。(WinSock2.0で検索したら出てきやがったorz)
>>2 は見落としてた crt
647 :
デフォルトの名無しさん :04/06/11 01:01
>とりあえず、UNIX系のOSだね。 YES. >子プロセス側で通信がうまくいっていない事を子プロセス自身がきちんと >認識できる事という事と、 >子プロセスで検出した事象を親プロセスに通知するという部分は、 >まったく別の次元の話ですよね。 ですね。 >まずは、起こりえる障害に対してきちんと検出、対応が可能なロジックが >組めるかどうかを考えたほうが良いんじゃないの? >子プロセスが、デッドロック状態になった時に親プロセスで検出しようとしてる >見たいだけど、子プロセスがデッドロックにならない様に作る事って出来ないの? >通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり >なんでのは、みんな検出可能だよね。 おっしゃるとおり。てゆか、 >通信中に回線が切れたり、相手のマシンの電源が切れたり、間のルータがとまったり >なんでのは、みんな検出可能だよね。 は、普通に親から検出可能だよね。だから↑の事象はあまり気にしてない。
648 :
デフォルトの名無しさん :04/06/11 01:01
>その上で、 >>親から定期的に子のFIFOに書き込んで >>一定時間内に応答がなかったら死んでるって >>いうふうに解釈してもいいのかな? >>子プロの巧い管理方法があったら教えて下さい。 >って言うのであれば、それはスレ違い。 まあね、普通に親から検出可能なものを監視する必要ないもんね。 それに子のFIFOに書き込んで子からFIFO経由で応答があっても ちゃんと動いているっていえないもんね。おっしゃるとおり。 じゃあ結局、ちゃんとつくっていれば、 子供の通信を100%管理できるよってことね。 特に監視する必要はないと。。。そういうこと? そもそも監視すること自体がナンセンスってことですか?
>>648 > じゃあ結局、ちゃんとつくっていれば、
> 子供の通信を100%管理できるよってことね。
まさか。100%なんて出来ませんよ。
通信しているプロセス本人でも、
100%は制御できないのがネットワークプログラミングですから。
> 特に監視する必要はないと。。。そういうこと?
> そもそも監視すること自体がナンセンスってことですか?
それはネットワークプログラミングではない。
子プロセスが何やっているかには大きく影響されない事だからね。
>647-648 さげろ、カス
非同期とノンブロックを混同するなよ
一緒じゃないの?ΣΣ(゚д゚lll)
655 :
デフォルトの名無しさん :04/06/12 14:18
WinInetのInternetReadFileってデータをダウンロードするとき 実際にはどれくらいの大きさのパケットとして受け取っているんですか? なるべくならそのサイズとバッファサイズをそろえたいんですが。
>>655 そんな事を考えるヒマがあったら他のことをしろ
657 :
デフォルトの名無しさん :04/06/13 23:36
>> 648 >じゃあ結局、ちゃんとつくっていれば、 >子供の通信を100%管理できるよってことね。 >特に監視する必要はないと。。。そういうこと? >そもそも監視すること自体がナンセンスってことですか? ちゃんと通信が行えているかどうかを一番把握できるのは、 通信を行っている子プロセス側。 よって、通信エラーに関する部分については子プロセス側ですべて 処理を行う。 そして、きちんと通信エラーを検出するプログラムが書けるのであれば、 子プロセス側がデッドロック状態になることはない。 ただし、子プロセス側が通信に関する部分以外でデッドロックとなりうる ロジックを書く必要があって、それを親プロセス側で監視したいというのであれば、 それは、通信とは関係ない話であり、スレ違いでしょ。 ってこと。 そういう部分について意見が聞きたいというのであれば、もう少し具体的にね。
658 :
デフォルトの名無しさん :04/06/15 09:27
TCPでの質問です。 readOK = mask; select(1024, &readOK, NULL,NULL,BULL); /*待ちうけソケットに反応があった場合*/ if( FD_ISSET(soc_waiting, &readOK)==1) でsoc_waitingは待ちうけソケットなのですが こんな感じで判別してacceptしようと思ってるのです。 でも、このコードでは待ちうけソケットにどれだけの数のコネクション待ちがあるかわからないのですが どうすれば判るように出来るのでしょうか?
/⌒ヽ / ´_ゝ`) /⌒ヽ ちょっと通りますね、ここ通らないと行けないので・・・ | / / ´_ゝ`) | /| | | / /⌒ヽ チャプッ // | | | /| | / ´_ゝ`) U .U // | | | / /⌒ヽ プクプクッ プクプクプク・・・・ U .U 二| /| |二-_ -_/_´_ゝ`)二- - /⌒ヽ= _ _ ッ・・・・・  ̄- ̄- ̄ ─ ─  ̄-  ̄- ̄  ̄-
>>658 たぶん、待ちがいくつあるか判別する方法はsocketライブラリでは無いと思う。
そもそも、待ち状態のがいくつあるか知ってる必要あるの?
そのまま、ループまわせば一個ずつacceptできるし。
あと、selectの第一引数は直した方がいいぞ。
>>658 とりあえずBULLとは何なのかを15文字以内で簡潔に説明せよ。
>>660 レスどうもありがとうございます。
それほど重要な情報ではないので諦めます。
あと、常時複数のコネクションを張るシステムでして・・・
その上コネクションが頻繁に繋げられたり消されたりするシステムなんです。
それで現在のfdの最大値が判れば無駄なくselect()が出来何とかなるのですが…
いちいち記録しておくしか方法は無いでしょうか?
>>661 指摘どうもです。
ミスタイプです。。。
>>662 少なくとも、max()とか使って走査範囲を順次拡大するだけでもいいと思う。
最大値のコネクションが切れてもこの場合は無視。
そう組むだけでも、最初っから最大値固定でやるより、パフォーマンス
いいと思うよ。
その上で、一定時間毎にアクティブな奴全てを走査して最大値を求めなおす。
ってのもあるが、こっちはあまり効果なさそうな気がする。
664 :
デフォルトの名無しさん :04/06/15 21:18
プログラムと直接関係なくてすまないんだが、Windows XP の hosts ファイルに
ホスト名の重複した 3 つのエントリ (上下 2 つは同一の IP アドレス) を記述
した場合、そのホスト名へのアクセスでブラウザやら ping やらが以上終了する
見たいなんだけど、もまいらのマシンもそう?
192.168.1.1 aaa
192.168.1.2 aaa
192.168.1.1 aaa
上記の順で書いた時 ping aaa や
http://aaa/ へのアクセスでプロセスが異常
終了するみたい。まぁそもそも同一ホスト名に別アドレス割り当てる事自体
イレギュラーなんだけどね。
http://support.microsoft.com/default.aspx?scid=kb;ja;177075 動作は未定義って事なんだろうけど、プロセス異常終了とは…
>664 ばか?
つまりそのファイルを書き換えればネット使うソフトは軒並みダメになるわけだな ウヒヒ
2000や2003Server相手じゃ,全く効果なし。
669 :
デフォルトの名無しさん :04/06/16 00:53
てst
>>668 あーごめん、読み直さずに書き込んでしまった。
"「hosts ファイル上で」同一ホスト名に別アドレス割り当てる事自体" って気で書いてました。
>>664 winsock が msvcrt の wcslen に NULL 渡して落ちてるね・・・
お粗末だなー
Windows Update や LiveUpdate のサイトに
>>664 やるウィルスが出たら
素人は駆除できんな。
674 :
デフォルトの名無しさん :04/06/16 17:42
ぬるぽ
cygwin(Windows2000)上でsocketいじくっています。 それで質問させて頂きたいのですが、socketを、 socket(AF_INET, SOCK_RAW, 6); の様にraw socketでプロトコルはTCPに指定して作成し、 sendtoするとinvalid argumentでエラーになってしまいます。 sendtoの引数には、 //th : TCPヘッダ自作のためのtcphdrをメンバにした構造体 //sa : sockaddr_in sendto(sid, (void *)&th.tcp, sizeof(struct tcphdr), 0, (struct sockaddr *)&sa, (int)sizeof(sa)) としているのですが、なぜエラーになるのでしょうか? ちなみにsocket関数の第3引数を0(IP)に指定すると成功します。
>>673 実際に hosts を書き換えるスパイウェアはあるね。・゚・(ノД`)・゚・。
まれにPC初心者板の「エロサイト見たら・・助けて」スレで相談受けるよ
>>676 レスありがとうございます。
TCP/IPヘッダから自前で用意してパケット送りたいなーとか思ってたんですが、
winでは低レベルなとこで処理しないと駄目なんですね。
何度も質問して申し訳ありませんが、また質問させて下さい。 winsock2で、setsockopt()のIP_HDRINCL(.NETではSocket.SetSocketOption()のHeaderIncluded) を有効にしたいんですが、 しようとすると割り込み入って失敗します。 せっかくこういう関数/メソッドがあるのに、Windows上でヘッダいじるのは無理なんでしょうか?
>>679 割り込みってなんだ??? signal か Exception か?
どっちにしてもちゃんと具体的なメッセージ書けって。このスレにはエスパーはいないぞ。
とりあえず管理者権限が要るって
>>676 の先に書いてあるが、それは大丈夫か?
>>680 レスありがとうございます!
権限は管理者です。
C#でコード書いてみて、Exceptionをcatchすると以下のようなエラーメッセージが出ます。
ちなみにエラー番号は10004です。
System.Net.Sockets.SocketException: ブロック操作は WSACancelBlockingCall の呼び出しに割り込まれました。
at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP)
at System.Net.Sockets.Socket.SendTo(Byte[] buffer, EndPoint remoteEP)
調べてみるとシステムコールの割り込みが発生しているようです。
HeaderIncludedをtrueにすることによってヘッダを自作してパケットを送ることが出来ると解釈しているんですが、
それは間違いなんですかね?
.NETはよくワカンネ
>>681 暇だったんで、昔作った自前ICMPツールを改造してテストしてみた。
言語はC++だが、特に問題なく送信できた。
ちなみにICMPとTCPで試したけど、どっちも問題なし。
IPヘッダーからTCPヘッダーまで、チェックサム含めて間違って無いよな?
>>681 俺も C#.NET で簡単なサンプル書いてみたけど、フツーに動いたよ。
(昔Cで作った Wake On LAN のパケット投げる奴を C# にしてみた)
その Exception から推測するに、SendTo() 処理中に異常処理かなんかで
プロセスorスレッドを強制的に終了させているように見える
(あくまで推測で、あまり根拠はないが)。
また関係あるかどうかはわからんが、MSDNの SendTo() のドキュメントには、
下のレイヤでバッファリングするため長さが長すぎたりすると
SocketException が飛ぶという記述もある。
>>683 が言うように、ヘッダの長さやチェックサムが全部正しいか
チェックしてみたら?
ネットワーク系の関数とかアプリって、どうやってテストするの?
686 :
デフォルトの名無しさん :04/06/19 02:53
>>685 localhostじゃね?ネトゲならβ版公開してテストしてるけど。
まあスレッド使って擬似DoSとかできんことも無いw
普通にLANでテストすりゃいい
etherealで調べる
もうぬるぽ!
selectとthreadとでは、どっちがリソースの効率がいい? dev/pollとかOS依存のものは使わない方向で教えて。
規模による
あと無印pollはポータブルかつselectより効率的。
>>692 大体同時アクセス100人前後までを想定してる。
>>693 でも無印pollはwin系では実装されてないしなぁ。(VC6.0のリファレンスで確認した分には)
殆ど共通のアルゴリズムでコンパイルしたかったので。
単純なメッセンジャー鯖を作りたいんだけどね。
online/offlineのチェック/広告は別スレッド掘った。
>>694 それくらいならselectで十分効率的。
うまく組んだらthread+selectの方がいいだろうけどいろいろ面倒でしょ。
>>696 じゃあselectで頑張ってみる。
> うまく組んだらthread+selectの方がいいだろうけどいろいろ面倒でしょ。
必要に迫られたらそうするよ。うん。面倒は嫌いw
selectの嫌がらせとしか思えないあの仕様は何だろうねw
UNIX発の言語やライブラリの仕様は変態的なのばっかだよ。
メクソハナクソ
selectって便利なんだけど仕様は糞だよね
もっと糞なのはあれだ アドレスの構造体
SSLの PEM ファイルについてですが、 これの最大ファイルサイズってどれくらいでしょうか? 規格上決まってますか?
SSL自体の仕様ではないと思うけど・・・
705 :
デフォルトの名無しさん :04/06/20 12:41
706 :
デフォルトの名無しさん :04/06/20 13:00
VCでarp -aコマンドみたいなものを作ることは可能ですか?
可能か否かという問いなら可能です だってWinにarpコマンドあるしねw
ねえ、誰かP2Pネットワークを利用して2chに匿名で書き込む(ネットワーク中の誰かに書き込ませる)ソフト作ってくれない? 画像などの簡易交換機能をつけるとそれなりに利用者は多くて、ネットワークとして機能すると思うんだけど自分の技術じゃむりぽ
>>707 つまりMS以外は事実上無理なんですね?
GetAdaptersInfoでぐぐればでてこないかな? iphelpなんたら.libってので出来たはず
iphlpapi.dllにあるね
>>708 犯罪者続出のロシアンルーレットツールなんて作ったら、開発者までしょっぴかれますがな
ipconfig /a 程度のものしか作れないみたいですが…
GetIpNetTableとかね 英語読めんから情報がすくねw
>>715 ばっちりです。
どうやったらそんなに詳しくなれるんでしょうかね
愛、かな
ws2_32.dllのラッパを作って見たんですが(出力されたのをコンパイルしただけ・・・) send関数が上手く動作してくれません。recv関数も上手く動いてないと思うけど。 戻り値とか引数とかの書き方間違ってるのでしょうか? int WSAAPI d_send(SOCKET s, const char FAR * buf, int len, int flags) { int ret = send(s, buf, len, flags); return ret }
>>718 >return ret
にはちゃんと;付けてます。
> 上手く動作してくれません ほほう。
> 上手く動作してくれません 日頃の賄賂が足りないのでは?
なんたらSTARTとかはしてる? あれをしないと使えないんじゃなかったっけ?
>>719 >>720 日本語おかしいですか?バカですみません・・・
>>722 >>723 WSAStartup関数は呼んでませんでした。
試してみます。
エラーが出る前にsend関数でプログラムが落ちるので・・・
上の関数ためしてきます。
725 :
デフォルトの名無しさん :04/06/21 00:30
DLL_PROCESS_ATTACHでWSAStartup関数を呼んでも、WSAStartup関数のラッパで
呼んでも死んで(?)しまいます。
DLL_PROCESS_ATTACHの場合は、WSAStartup関数以降が処理されない。
WSAStartup関数のラッパの場合は、「unknown software exception」のエラー。
同じ名前のdllを作成して、中でそのdllの関数を呼んでたりするからダメなのかな?
一筋縄ではいかないようで・・・もう少し頑張ってみます。
>>725 ありがとー
kageのソースを見るとDLL_PROCESS_ATTACHでの呼び出しが コメントアウトされてるから呼び出すと何か問題がありそうな予感
>>727 kageがDLL_PROCESS_ATTACHでやってるのはwsock32.dllの
LoadLibraryであって、そのタイミングでWSAStartup()はしてない。
(後でかちゅ〜しゃ本体から呼ばれてるっぽい)
ws2_32.dllのラッパとりあえず作成できました! レスしてくれた方ありがとうございます。 「ws2_32.dll」と同じ名前にしているので(?)ラッパする関数を再起していました。 それで、本物のdllの関数を呼ぶようにしたら出来ました。 当たり前と言ったら当たり前の事ですね・・・勉強が足りないようです。 あと、WSAStartup関数を呼ばなくてもsend関数、recv関数を呼べました。 参考HPを探していて見つけた事 ラッパを作成しなくても、そのexeがロードしたsend関数なりrecv関数なりの アドレスに新しく作成した関数のアドレスを上書きすれば、関数のHookが 出来そうですね。
>本物のdllの関数 LoadLibraryで呼び出したdllの関数
731 :
デフォルトの名無しさん :04/06/22 06:56
datalinkでパケット除く方法がいまいちわかりません。 言語はCでLinuxかC#でWindowsなんですけど datalinkでsocketをつくって あとはrecvfromとかで読む込むのですか?
datalinkでパケット除くという意味がいまいちわかりません。
覗くんだろ 近頃の子供は漢字に弱いな
link layer socketだろうな。
735 :
デフォルトの名無しさん :04/06/22 11:29
PunchingHoleUDPって複数同時の通信って出来るんですか? 例えば、サーバーとメッセージのやり取りをしながら、他のクライアントとボイスチャットをするとか・・・
何でこのスレではPunchingHoleUDPって言う人が多いのだろう… ところで、STUNとの違いって何なのかな? 同じもののように思えるのだけれど… UDP Hole Punchingっていうのは概念で、 STUNは具体的な実装? 的外れなこと言ってたらすみません。
737 :
デフォルトの名無しさん :04/06/22 13:28
738 :
デフォルトの名無しさん :04/06/22 14:05
WindowsでWebDAVのファイル読み書きするのってどんなAPI使えばいいの?
739 :
デフォルトの名無しさん :04/06/22 14:07
>>739 WebDAVスレなんてないし。
それにWinSock, WinInetと同種の話ではないの?
>>740 Microsoft Internet Publisher に付いてくる OLE DB Publisher は http/dav をサポートしてる
みたいだけど、この publisher だけ入手できるのかとか、通常の IE 6 あたりに含まれてるのか
とかは不明。
742 :
デフォルトの名無しさん :04/06/22 17:23
Windows でローカルホストの IPv6 アドレスを得るにはどうしたらいいでしょう?
::1
745 :
過去にSTUNの質問した一人 :04/06/22 23:03
>>737 流石にそれは無いだろ・・・w
多分Skypeに採用されたのが人気に拍子をかけたのだろう。
元々NAT超えに関しては多くの人が関心のあった分野だし。
>>736 同じ。
単にRFCに登録されたのがPunchingHoleUDPじゃなかったっけ?
746 :
過去にSTUNの質問した一人 :04/06/22 23:05
>>735 何故分ける?
UDPはコネクション型では無いという事を思い出せ(セッションに区別が無い)。
パケットを個別に分ける必要なんぞ無いだろう。
ネットワークコンピュータのホスト名を繋がってるだけ列挙する方法を教えてください。 出来ればUNIXのサーバリストも探したいです。
>ネットワークコンピュータのホスト名を繋がってるだけ 誰か,この日本語解釈できる? わしには理解できない。 2行目も意味不明。
某P2P逮捕ソフトに毒されてる希ガス
751 :
デフォルトの名無しさん :04/06/23 03:50
> 某P2P逮捕ソフト ネーミング(?)にワラタ
ワークグループ等に属しているコンピュータ名全てという意味です
753 :
デフォルトの名無しさん :04/06/23 09:16
include<stdio.h> #include<stdlib.h> void main(void) {char *str; str=malloc(sizeof(char)*20); scanf("%s",str); printf("%s",str); free(str); } voidがなんとかってエラーがでます、でもこれは本にのってた サンプルプログラムのはずなんですけど。 もしかしてこの本はだめなんでしょうか?
754 :
デフォルトの名無しさん :04/06/23 09:17
>>753 str=(char *)malloc(sizeof(char)*20);
>>753 ヘ_ヘ
ミ ・ ・ ミ 「なんとか!」
( ° )〜
一行目に#
761 :
デフォルトの名無しさん :04/06/23 14:35
wininet を使ったプログラミングについて おれに1から手とり足とりおしえてくれ! くそども
763 :
デフォルトの名無しさん :04/06/23 14:48
1から始めるnyつくり。
"こんにちは!世界" でも作ってろ
自分の学習のためにIriaのようなダウンロードソフトを 作ってみようかと思うのですが、参考になるソースとか サイトとかないですかね
>>765 WWWブラウザやftpのソースを呼んだらどうだろうか?
socketでぐぐればUNIX関係の簡単なサンプルが手に入るかと
>>765 アレの後継のソフトのソースはOpenであったんじゃなかった?
>>766 あ〜、ブラウザのソースなら必要な情報が全部
わかりそうですね
でも敷居が高いような・・・
http のダウンロードに関する簡単なサンプルがあればと
思うんですけど
>>767 まじっすか
でも何でググればよいんでしょうか
あ〜、OpenIvine というのがオープンソースですね・・・ 頑張ってみます ありがとうございました。
ところで、 Windowsには、 UNIXドメインみたいなソケットってあるんですか? cygwin + postgresqlでpsqlを連続して使うと、 前のpsqlのTIME_WAITが残ったままになって、 後のpsqlがエラーになってしまうのですが。
>>768 昔、Netscapeのソースが公開されたことあったな。
>>772 netscapeなんていわずlynxとかw3mでもいいだろ
いやGET送ってレスポンス貰うだけでいいじゃんw
ソース見るより HTTP/1.1 の仕様を調べた方がいいと思った
あの仕様書から実装を導き出すのは結構難儀するぞ ソースコードをいくつか見たほうがいいと思う
>>765 とりあえず、wget, curlから始めれば?
次はlftp。
オプソ物のソースは人力スクランブルがかかってて読めたもんじゃないな。
UNIXとWINのコードの違いってあんまり無いよ openが_openだったりする程度だったような
>>780 本気で言ってるのか
じゃあ、fork()やsigaction()、ttyの制御をやりまくりのシェルでも
移植してみ。
むろんcygwinとかハンパなことを言わずにWin32ネイティブで
httpクライアントの話だろ? 何剥きになってるの?
>>782 改行の違いだとか
WinsockのSOCKETはfile descripterじゃないからfdopen()できないとか
read(), write()はできないからrecv(), send()だとか
writev()?なにそれとか
alarm()つかえんとか
腐るほど違いはあるだろ
_read, _writeで出来るのでは?
>>785 え?今のMSVCRTだとできるの?
ReadFile(), WriteFile()が使えるようになってるのは知ってるが
少なくとも以前は、
_open_osfhandle()→fdopen()しても、
結局CRTのエミュレーション層がブロッキングなハンドルじゃないと
扱えなかったんだよね
# ブロッキングソケットではダメ
まあcygwinのソースでも眺めりゃいいんじゃなかろうか。
>ReadFile(), WriteFile()が使えるようになってる 98/Me とかはダメだったりしない?
>>778 wget が良い感じです!
まさにこういうソースを求めていました
ありがとうございました
>>788 95系とNT4はダメですね
2000以降のリダイレクタが強化されたんでしょう
その他もGetLastError()がWSAGetLastError()の代わりに使えるかどうかとか
UDPでconnect()したときの挙動とか
色々違いはありますよね同じWinsockでも
>>790 いや、95系もNT4もできた(というかやってた)けど。> ReadFile(), WriteFile()
おまけに95系はソケット相手ならoverlapped I/Oまで使えた。
が、調子に乗って同期取らずにガンガンWriteFile()したらOS巻き込んで
落ちた(w
792 :
デフォルトの名無しさん :04/06/28 11:48
793 :
デフォルトの名無しさん :04/06/29 12:27
エロイ人に教えて欲すぃんだけどさ、 Winsock2 でね、割り当てられたIPv6グローバルアドレスを取得できるAPIって何なのでせう?
普通にAF_INET6でsocket作って、getsocknameでできない?
つか、PlatformSDKのIPv6 Guideにサンプルコードあるし。
>>794 今環境無いところに居るんで試せないスマン。今度やってみる。
>>795 getaddrinfo() 使うやつ?これってDNSに登録して無いやつでもええの?
>>790 確かそのヘンの違いは(OS毎の動作の怪しさは別として) Winsock 2 と
素の winsock の違いだったと記憶しているけど。
winnt/system32/drivers/etc/hosts に自ホスト名とIPアドレスを 書いてLANケーブル抜いた状態で Winsock 2.2 の gethostbyname()に自ホスト名を渡してコールしたら、 hostent の h_addr_list に 127.0.0.1 だけが入ってて驚いたんだけど、 Winsock ってこんな不思議な動きをするものなのでしょうか? エロイ人教えてください。
799 :
デフォルトの名無しさん :04/06/29 23:09
インターネットエクスプローラーの、 HTTPリクエストヘッダのUser-Agentの文字列(製品トークン)を 誰か教えてくださいませ。
>>798 する。それに気が付かなくて、昔はまったことがある。
悲しい想い出。
要するに、IPアドレスはNICに付く物だから。ケーブル抜くと、
カードが無効になっちゃうんだろうねえ。よくわかってないけど。
>>799 Windows2000 5.00.2195 + Service Pack 4
Internet Explorer 6.0.2800.1106 + Service Pack 1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n
>>800 ありがとうございます。
自分の環境のせいではないと判明して安心しました。
そのときにどうやって回避されたかも教えていただけますか?
#欲張りですいません。
803 :
デフォルトの名無しさん :04/06/29 23:35
>>801 わざわざ、どうもありがとうございます。
>>798 DHCPの場合、動的に変わらないと腹たつでしょ。
仕方ないんじゃないの?
俺のLinuxも127.0.0.1と::1だけだべ。
805 :
デフォルトの名無しさん :04/06/30 08:58
>>800 そりゃ,hostsファイルじゃなく,NETBIOS名引いてるからじゃねーのか?
コンピュータ名とhostsファイルのホスト名が同一とみた。
両者の名前,ばらばらにしてみ?
806 :
デフォルトの名無しさん :04/06/30 11:46
if( (Socket = ::socket( AF_INET, SOCK_STREAM, 0 )) != INVALID_SOCKET ){ struct sockaddr_in sa; ::ZeroMemory( &sa, sizeof( sa ) ); sa.sin_family = AF_INET; sa.sin_addr.s_addr = ::htonl(INADDR_ANY); sa.sin_port = ::htons( (WORD)pPort ); if( ::bind( Socket, (struct sockaddr *)&sa, sizeof( sa ) ) == SOCKET_ERROR ){ } } 上記のようにするとbindでエラーになるのですが何が原因なのでしょうか? OSはXPでコンパイラはBCB5です。
807 :
デフォルトの名無しさん :04/06/30 12:03
>>794 まだ試してないが調べてみると getsockname()使ってもダメみたい。
コネクションが確立してからならそれに割り当てられたローカルIPアドレスを知ることができるらしいが
コネクション以前の段階で知りたいんです。
あとUDPだし。
>>795 どんなコードか教えてくらはいエロイ人!
getaddrinfo(NULL, 〜)だと得られるのはワイルドカードアドレス「::」で、これじゃダメなんだわし。
2001:100:ff::ac とかこんなのが欲しいのだわし。
Linuxだと /proc/net/if_inet6 を見ればいいんだが、Winsockの場合がわからんヽ(`Д´)ノ
>>800 回避不可能です。大掛かりになっても良いなら、if が down したら
loopback device を up するようなプログラムを作って動かしておくとか、
やりようもあるでしょうけど。
>>806 (WORD) pPort っていう部分が非常に怪しい。
もし外すとエラーになるからキャストしてるんなら、
もう少し C の勉強をしたほうが良いと思う。
811 :
デフォルトの名無しさん :04/06/30 13:30
812 :
デフォルトの名無しさん :04/06/30 14:47
>>810 着眼点がそもそも違いますね。
WORDはunsigned shortですよ。全然問題ないですねそこは。
TCP/IPでUDPのようにコネクトせずにrecvするとは可能でしょうか? サーバー側ね
できね
>>808 じゃあ、IPHelperのGetAdaptersAddresses()あたりは?
>>806 pPortと言う名前からして、ポインタくさいんだがそこは大丈夫か?
まぁキャストしてるから、なんかのポート番号にはなってるんだろうが…。
あと、そこが問題ないとして既に使用しているポート、または解放直後の
ポートを使おうとしてるとかはない?
とにかく、errnoなりWSAGetLastErrorなりでエラーの詳細を確認してみ
818 :
デフォルトの名無しさん :04/06/30 15:21
しんでください
820 :
デフォルトの名無しさん :04/06/30 15:37
>>802 今,hostsファイルに
10.0.0.1 hostname
と書いてあるとしたら
10.0.0.1 hostname hostname.local
という風にaliasを付け足せ。
そして, gethostname("hostname.local")で引く。
>>809 お前さんは一体何をしようとしているんだ?
>>812 pPort って書かれてるからポインタ臭いなとオモタワケです。
わざわざ (WORD) ってキャストする理由も他に無いだろうし。
あと
>>817 が言っているように SO_REUSEADDR つけ忘れてて
2度目以降が失敗、という可能性もありますね。
非ポインタを pPort という変数にしたり、あそこに (WORD) なんてキャストを
入れたりすることから、C そのものにも慣れていないのでは、と思いました。
824 :
デフォルトの名無しさん :04/06/30 17:15
>>816 GetAdaptersAddresses()でいけまつた!
ただ取得したデータのフォーマットがよくわからんでし (´・ω・`)
ググルとIPv6マガジンのサイトがひっかりまつ。
http://www.ipv6style.jp/jp/apps/20030711/20030711_p.shtml が、アドレスファミリの表示とかはあるものの肝心のIPアドレスの表示処理がないでつ。
で、テキトウにあたりをつけてやってみたところ取得できますた。以下やっつけのコードの一部分でつ。
struct sockaddr_in6 *in6;
unsigned long len;
IP_ADAPTER_ADDRESSES *adaddr;
FILE *fp = fopen("/Prog/ip.txt", "w");
GetAdaptersAddresses(AF_INET6, 0, NULL, NULL, &len); ← まずこれでサイズを取得するらすい
adaddr = (IP_ADAPTER_ADDRESSES*)calloc(1, len);
if (fp != NULL) {
char tmp[64] = "";
GetAdaptersAddresses(AF_INET6, 0, NULL, adaddr, &len); ← で、ここで情報を取得
in6 = (struct sockaddr_in6*)adaddr->FirstUnicastAddress->Address.lpSockaddr; ← おもいきしテキトウにキャストしてみた
inet_ntop(AF_INET6, &in6->sin6_addr, tmp, sizeof tmp); ← inet_ntop()無いっていわれたけど別のとっからソース持ってきた
fprintf(fp, "|%s|\n", tmp);
fclose(fp);
}
これで WindowsCE(PocketPC 2003) で IPv6アドレスが取得できますたヨ。
ありがとうエロイ人!∩(`・ω・´)∩
ファイヤーウォールがやってるような特定のポートを つぶすのってどうしたらいいんですか?
初心者的な質問で申し訳ないんですが プログラムA、Bがあるとします (A=特定のサーバーソフト、B=ファイヤーウォール) Aがアクセプトで特定ポートで接続待機してて 外部から接続要求をいつでも受け付けるような状況で Bが特殊な操作をすることでAのアクセプトからソケットを 生成することを阻止するようなことってできるんですか?
>>828 Bはルータなんだから出来ます。
IPプロトコル、ルーティングから勉強し直すといい。
Comer本でも読んで。
>>829 質問と無関係の返事してもしようがないような気が・・・
>>828 モダンなOSならカーネル側にそういった操作を支援する機能があって、
それを用いるのが一般的だと思います。
>>830 Windowsならフィルタドライバ、BSDならbpf(BerkleyPacketFilter)かな。linuxはしらね。
Linuxはiptables。 Solarisはipfilter。
>>822 既に alias を定義済みでしたので、gethostbyname()に alias を渡したところ
hosts 上の IPアドレスが返却されました。
結局
>>805 で指摘されたように
コンピュータ名と hosts ファイルのホスト名が同一だったため、
NETBIOS名に対応する IPアドレスが返却されていたようです。
ただ、コンピュータ名とホスト名に別の名前を定義するのは、
なんとなく違和感がありますので alias 使用することにしようと
思います。
質問に回答していただいた皆さんありがとうございました。
834 :
デフォルトの名無しさん :04/07/01 09:03
フラグメントを再構成するライブラリて知らない?
836 :
デフォルトの名無しさん :04/07/01 11:30
837 :
デフォルトの名無しさん :04/07/01 11:44
質問があります for(;;){ acsept(****); close(****); } と for(;;){ send(****); } だったら OS、ネットワークの面でどっちが良いですか?
838 :
デフォルトの名無しさん :04/07/01 11:45
質問があります for(;;){ acsept(****); close(****); } と for(;;){ send(****); } だったら OS、ネットワークの面でどっちが良いですか?
ミスりました。すいません。 要するにどっちが負荷が軽いですか?
841 :
デフォルトの名無しさん :04/07/01 12:26
ファイル送受信を行うコードについてちょっと質問です。 buf[1024]のようにメモリ確保をしておいて、このバッファにファイルを随時読み出して sendtoにぶちこんで送信しています。そこで少し疑問が出てきました。 光やADSL等の帯域のでかさ加減によって sendtoにぶちこむbuf[1024]の大きさは調整したほうがより早く送受信が行える なんてことはありますか? よくソフトウェアでは「回線なにつかってる?」とか聞いてきますよね。 あれってこのバッファの大きさを調整してるんですか?
( ´,_ゝ`) プッ
>>842 MTU setsockopt ioctl とかでググレ
845 :
デフォルトの名無しさん :04/07/02 04:29
ライブカメラの映像をリアルタイムで相手に送るにはどうすればいい?
>>845 H.323とかリアルプレイヤーとかWMPとか色々あるが?
847 :
デフォルトの名無しさん :04/07/02 05:05
>>846 うーんそういうのじゃなくて
自分でプログラム作ってネットワークの勉強したいんですよね。
かなり前から猫でもわかるネットワークプログラムっていう本を買って
ネットワークを勉強してるんですが
こういう本にはそういう上級なテクニックは乗ってないんですよね
なにかそういうテクニックがのってるちょっとレベルの高い本で
お勧めのやつないですか?
RTSPやUDPでググれ
通信より画像処理の勉強をしたほうがいいのでは? 通信なんてただデータを送受信するだけだし
849はTCPで画像を送るおばかさん
え?なんでそう思うの?
リアルタイム画像転送だと画像コーデックも工夫が必要になるぞ
TCPで送ってもいいんじゃないの? なんかマズイ?
>>847 DirectShowで取り込むんだから、まずはそっち方面からでそ。
ストリーミングが上級なのかは知らんけど 確かにネットワークで実際のアプリ作成時のプロトコルの設計や ノウハウをしっかり書いた本ってないよな。
3WAYハンドシェイクの実装の仕方とかわからんし
>>856 英語のならあると思うよ。売れないから翻訳されないだろうけど。
アドベンチャーゲームの作り方、なんて本ならいくらでも日本語で出てるのになあ。はあ。
>>857 3WAYハンドシェイクってコネクションを確立するときに自動的にやるものだから
Winsockの場合TCPソケットで「connect()」呼び出せば勝手にやってくれてんじゃないの?
普通プロトコルを実装するのはアプリ層のものでトランスポート層以下のプロトコルは
再実装しないんじゃない?
間違ってたらスイマセン。
JAVAのソケットから取り出した入出力ストリームを Object***Streamをかぶせれば簡単に通信できて ネットワークアプリケーションが楽に作れるような気がするんですがどうでしょうか? プロトコルの実装とかC++との互換性抜きにすれば・・・
>>860 すまんが、何を言いたいのかさっぱりわからん。
>>860 いつまでも あるとおもうな コネクション
>>846 スレチガイ
ここはプログラム板
下手糞な茶々入れるなや
>>846 とりあえずDirectPlayとかのサンプル探してみたら?
それかUDPで作るとか・・・
866 :
デフォルトの名無しさん :04/07/03 14:47
同一ポートでTPCとUDPのデータ受けたりできるの?
挙動以前に仕様が知りたいです。
>>866 >同一ポートでTPCとUDPのデータ受けたりできるの?
あえて言おう、"TPC"は無理だ。
>>866 TCPで開いたポート番号とUDPで(ry)は無関係だ
TCPやUDPのようなプロトコルは自作できないとか? 仮に出来てもルータに殺されそう
UDPつっても、recvする際はフラグメントしたパケットはきちんとひとつにしてから渡されるね。
> アドベンチャーゲーム それって要するにエロgあqwせdrftgyふじこlp;@:「」
>872 他のレイヤーには干渉しないのがプロトコルの礼儀
>>860 ふつーRMIとかCORBAとか使うんじゃなかろーか。
>>860 つかObjectを簡単にbinaryにシリアライズできることを活用するべし
通信路はHTTPでも生TCPでもかまわない
UNIXネットワークプログラミング ...入門 、という本を読みはじめた。 サンプルがたくさん載っていて、 解説を読んでる時間より、 キーボードをがちゃがちゃいわせている時間のほうが長い。 むつかしそうな構造体のメンバに なにやら値を入れて、それから一連の関数を呼んで... という手続きが、むつかしそうで... だったのだが、 それは"儀式"のような定型化した一連の手続きであって C++でいうところの コンストラクタのような感じで int を渡したら sockfd が返るような関数を書いて、 それを使いまわせば、楽ができるようだ。 通信自体もSOCK_STREAMだと、 データの送受は 単にsockfdを読み書きすればいいだけなので チャットぐらいなら、とても簡単のようだ。 難しいのは、両端で動いているプログラム相互で タイミングを合わせるとか、同期をとるとか、そのへんのようだ。 そのうち本物のUNPにも挑戦...できたらいいなと思う。
TPCにUNPですか
WindowsでプロセスごとのTCPパケットフィルタ作りたいんだけどさ、 ソケット使ってるプロセスってわかるもんなの?
881 :
デフォルトの名無しさん :04/07/04 10:48
すいません。 若干スレ違いですが、自分のUser-agentやIPアドレスなどを 表示してくれるページを教えてください。 以前、自宅サーバー関連のサイトで見つけた事があるのですが 忘れてしまいました。 お願いします。
883 :
デフォルトの名無しさん :04/07/04 12:11
以下のようなソースで、HTTP GET を10回おこなう 処理を試したのですが、WaitForMultipleObject の 処理がいつまでたっても戻ってこない・・・なぜ? スレッドの数を減らすとうまくいくときもある。 ちなみにrcvthread は connect, send, recv をして 引数で与えた番号をファイル名にして保存して終わるスレッド です int _tmain(int argc, _TCHAR* argv[]) { unsigned short ver = MAKEWORD(1,1); WSADATA wsadata; HANDLE vthread[10]; WSAStartup( ver, &wsadata ); for( int i = 0; i < sizeof(vthread)/sizeof(HANDLE); i++ ){ unsigned int lth; vthread[i] = (HANDLE)::_beginthreadex( NULL, 0, recvthread,(void*)i, 0, <h ); } WaitForMultipleObjects( sizeof(vthread)/sizeof(HANDLE), vthread, TRUE, INFINITE ); for( int j = 0; j < sizeof(vthread)/sizeof(HANDLE); j++ ){ CloseHandle( vthread[i] ); } WSACleanup(); return 0; }
>>884 recvthread()の中身は?
あと、本物のコードではちゃんと全てのAPIエラーチェックしてる?
してなければまずはそれから。
大方GET requestの送信辺りでコケてて、でもエラーチェックして
ないのでそのまま受信待ちに入ってブロックしたまんま、とかじゃ
ないかと思うが。
>>885 確かに受信待ちに入ってブロックしたまんまでした
けどsend は成功しているみたい
受信待ちループが駄目っぽいのはわかった
以下がそれです
受信待ち失敗と終了を知ることができずにずっとrcvが失敗している
っぽいですね
while(1){
rcvlen = recv( sock, recvbuffer, sizeof(recvbuffer), 0 );
if( rcvlen <= 0 ){
printf( "receive complete\n");
break;
}
prebuffer = buffer;
buffer = new char[prelen + rcvlen];
memcpy( buffer + prelen, recvbuffer, rcvlen );
if( prebuffer ){
memcpy( buffer, prebuffer, prelen );
delete [] prebuffer;
}
prelen = prelen + rcvlen;
//printf( "total %d kbytes...%x\n", prelen / 1024, GetCurrentThreadId() );
}
質問させていただきます。 ファイル送受信プログラムくらいは作ったことがありますが、何しろ独学だったもので基本は無知なので お恥ずかしい質問だと思いますが…。 こういうことはWindowsプログラムで可能でしょうか。 ある通信クライアントがあり、それがaaa.aaa.aaa.aaa:5000につなぐとします。 このコネクト先を捻じ曲げて、自作のプログラムに接続させることはできますでしょうか? そしてその自作プログラムはaaa.aaa.aaa.aaa:5000につなぐことにより 中間に入り串のような役割を果たせるので、例えばデータの中身を送信前にチェックしたり、 受け取ったデータを改ざんしてクライアントに伝えたりすることができるようになると期待しています。 ノートン先生あたりがやっている気がするなー。と思ったので妄想してみました。 知っている方いらっしゃいましたら、やり方のとっかかりなどご教授お願いいたします。
hostsとか
hostsを書き換える案も考えてみたのですが、あれって 名前解決ようのファイルですよね? それとも 127.0.0.1 aaa.aaa.aaa.aaa のように、あるIPを別のIPに摩り替えることもできるのでしょうか?
ルータ設定せれ。
ルータは最後の手段かなと思ってまして。 偽者のws2_32.dllを作って、クライアントのフォルダと同じ場所におくってのが正解ですかね?
フィルタドライバ
>>887 アプリケーションを問わない通信の横取りや加工がしたいのなら、
>>831-832 あたりにあるような、OSが持ってる支援機能を使うのが一般的。
Windowsに限定するなら、プロキシDLLの設置やAPIフック等で局地的に似たようなこともできるが、
スレ違いなので該当するスレで聞くか、自分で調べれ。
>>879 TPC は知らんが、UNPは文脈上 UNIX NETWORK PROGRAMMING (R・スティーヴン著)のことだろう。
>878が現在読んでるのは UNIXネットワークプログラミング入門 ということらしいから。
895 :
デフォルトの名無しさん :04/07/06 21:40
WSAAcceptに失敗し、WSAGetLastErrorでエラーを調べた ところ「6」と・・・ エラーコード6ってなんですか?! 普通は10023とかそういう値じゃ・・
Error Lookup使っとけ
>>895 Win32のエラーコードかな。
だとすれば、VC++6.0付属のError lookupによると
>ハンドルが無効です。
だそうだが…
>896 >897 なるほど・・勉強してみます。 解決 単に初期化していない変数を引数に使ってたマヌケでした
899 :
デフォルトの名無しさん :04/07/06 22:15
ところで WindowsでプロセスごとのTCPパケットフィルタ作りたいんだけどさ、 ソケット使ってるプロセスってわかるもんなの?
>>899 無理。
でもNEGiESやNetLimiterは実現している。
この矛盾の答えはいかに?
質問。 UDPでconnectした場合の挙動ってどうなるんですか? TCPのエラー訂正なしのバージョンとしてコネクション型が使えるの?
UDPでconnectできませn
>>901 connectで指定した相手以外のパケットが捨てられて、
recvfromで拾えなくなるんじゃなかったっかな…
904 :
デフォルトの名無しさん :04/07/07 00:46
>>901 デフォルトの送信先を設定するだけでは。
905 :
デフォルトの名無しさん :04/07/07 02:24
プログラミングじゃないのですがn個の数字を基本選択法(選択ソート)で昇順に並び替えるアルゴリズムをフロチャートで示せ。 ってわかりますか?
907 :
デフォルトの名無しさん :04/07/07 04:22
FORMをつかってファイルをアップロードできるホームページを 作ったんだけど、ここにVC++からアップロードしたい なんかサンプルになりそうなサイトある?
909 :
デフォルトの名無しさん :04/07/07 11:47
JavaってJ2EEでサーバサイドな技術が盛り上がってますけど サーバアプリケーションを自前で作るほうが楽じゃんって思うのは 激しく私だけでしょうか?
お馬鹿な事書いてごめんなさぁ〜い♪
>>907 \ そんなエサにクマー
(・(ェ)・) 三=ズザー
>>909 運用とかスケーラビリチーとか考えるとそうでもない
>>909 どうせ Java なら
>>912 の理由もあるし、JSP+J2EE でも別にイイや、ということでは。
フレームワークのオーバーヘッドも大したことないし。
検索エンジンのように本格的なチューニングが必要でかつ処理自体も重いものだと、
そもそも Java は使われないことが多いし・・・
>>913 > 検索エンジンのように本格的なチューニングが必要でかつ処理自体も重いものだと、
> そもそも Java は使われないことが多いし・・・
そりゃ、RDBだってJavaで書いてないって(w
え?OracleってJavaで作ってるんじゃないの?
あれからいろいろやってるけどギブアップ気味 どうにも難しいな
917 :
tester :04/07/09 23:16
IPv6 スレから飛んできたモノです。 winsock2 で IPv6 な UDP クライアントを作っているのだが、 connect() すると select() で read_fds に UDP ソケット入れると、 読み込み可能の有無にかかわらず、必ずタイムアウトしてしまう。 IPv4 だと動作する。 getaddrinfo() に AF_INET6 指定させるとだめのご様子。 select() はそういう挙動をするもの?教えてえらい人! 環境: Visual C++
918 :
デフォルトの名無しさん :04/07/10 00:41
919 :
デフォルトの名無しさん :04/07/10 15:19
WinInet ← ってなんて読むんですかね? 適当な読み方でOKなのっすか?
うぃんあいねっと
ポートスキャナー作ったんですけど1秒につき1ポートしか調べてくれません どうにか早くする方法はないでしょうか?
ポートスキャンって全ポートにconnectする奴? 256個くらいのスレッドでまわしたら?
実際にマルチスレッドで256個のスレッド作って ルーターをスキャンしてみたんですけどちゃんとした結果が出ませんでした。 ほかのスキャナーでやったりスレッド数を64に落とすと80番ポートが開いてるのがわかるんですが、 256個のスレッドでやると80番ポートに反応しません これってプログラムかなんかの上限が関係してるんでしょうか、それともハード的な問題でしょうか?
256は普通に作りすぎ。ただそれによって不具合が発生するかどうかは知らないけど。
927 :
デフォルトの名無しさん :04/07/11 22:14
通報しておきました。
> どうにか早くする方法はないでしょうか? nmap を使う。開発期間も短縮できてオススメ。
929 :
デフォルトの名無しさん :04/07/12 16:59
お前の好みなど誰も聞いてない
角煮の住人でショタスレがうぜーと思ってる奴だろう
933 :
デフォルトの名無しさん :04/07/15 12:40
send関数は、呼び出された瞬間にデータを送信してくれるのでしょうか?
いいえ。
それどころか、send から戻ってきても まだ送信してないかも知れないかも知れない。
質問です。 クラサバでクラの方がいきなり強制で回線を切断したりすると sendするとSIGPIPEが発生するんですが、そのシグナルをキャッチ して、エラーのコネクションを通常処理で切りたいのですが signal(SIGPIPE,hoge) としてもどのコネクションかわからず 回線切断できないのですが、どのようにしたら強制切断された ソケットを特定&切断できますか? ちなみにタイムアウト処理をいれているのでSIGPIPEを無視すれば いいのですが・・・
sendする前に、どのソケットで作業しているか記憶させれば?
>>937 あ、なるほど。
無理に引数で渡さなくともグローバル使えばできますね?!
グローバル・・・
助言どうもです。
939 :
デフォルトの名無しさん :04/07/15 16:13
SIGPIPEは無視して別の方法にしたほうが簡単確実。
どうせsendでエラーぶっこくしね
まあsend/recvの返り値、errnoで調べるのがいいと思うけども、 sigaction使うとSIGPIPEが起きた時にsiginfo_tのsi_fdに保存してくれる実装はないのかね。
942 :
デフォルトの名無しさん :04/07/15 16:48
特定のOSでだけそんな素晴らしい実装をされても困る。
いろいろと参考になりました。 結局この形が一番無難なのかな? 実装したのは (void) signal(SIGPIPE, SIG_IGN); と、いう感じで無視しといて int nRet = send(......) if(nRet==-1) { //エラー処理 } と、いう形ですね。
ていうか、無意味に上げちゃった・・・。
946 :
デフォルトの名無しさん :04/07/15 20:45
947 :
デフォルトの名無しさん :04/07/15 21:19
マゾです
950 :
デフォルトの名無しさん :04/07/18 04:53
>>949 おい、おいそんなところのリンク貼るなよ、ぼけ
あんなのくずだぞ
951 :
デフォルトの名無しさん :04/07/18 08:05
次スレは990を越えてからで十分
>>950 何の粘着だよ
リンク先覗いたがサンプルが多くて結構使えるじゃん
953 :
デフォルトの名無しさん :04/07/18 11:31
力作ではあるんだが、 返り値見てないなど基本的なところがなってなかったり、 ちょっちピントハズレな記述もあるし。 あまり勧められないな、と俺も思う。
>>954 とりあえず動けサンプル
なんだからいいんじゃないか
まあそろそろ
きちんと全部見守る優秀なサンプル
ってのもほしいけど
ネット関係ない場合多いし
W.リチャード.スティーブンスさんの本が高いけど勉強になった。
950さんがテンプレ&サンプルHPを作ってくれるみたいです。
958 :
デフォルトの名無しさん :04/07/18 17:41
>>957 いいよ、作るから待ってなよ
あんな、ネットワークのネの字も知らないような奴が適当に書いたページ
じゃなくてしっかりしたものを書きます。
echo ftp http をお願いします。 select、thread、複合型まで作って頂けると大変ありがたい。
質問です。 1ヶ月単位一人1票で投票するシステムの作成を請け負ったんですが IP・cookie以外で複数投稿を無効にできそうな仕組みは無いでしょうか? 上記2つの方法だと、どう考えても不完全そうなので。 いい案がありましたらご教授お願いいたします。
ごめんなさい 板違いですね・・・逝って来ます。
>>960 別に板違い気はしないけど。
XPのアクティベーションみたいなことをやってみるとかかなぁ。
>>954 > ちょっちピントハズレな記述もあるし。
たとえばどの辺? 初心者な俺が見ても、へぇとしか思わないけど、
知ってる人から見るとどこが変なのかなぁと思って。
できるなら同期、非同期両方ともつくってほしいですー
OpenSSL を使わない TLS クライアントもキボンヌ。
966 :
デフォルトの名無しさん :04/07/18 21:06
まあ本人も了承したことだし、スレの発展にはよかんべことさ
971 :
デフォルトの名無しさん :04/07/19 18:30
なんですか、あのソースは・・・ 久しぶりにみたぞ、あんなのw
972 :
デフォルトの名無しさん :04/07/20 22:21
ソケットのブロッキングモードと非ブロッキングモードは、どう使い分けるんですか?
ブロックして構わないときはブロック。
基本はブロックで、データが来ない時にも別なことをしたいときは非ブロックって感じですか?
975 :
デフォルトの名無しさん :04/07/20 22:55
僕はブロックの方がエレガントだと思うからブロック。 だけど、現実問題としては・・・・ データが来ない時は一生待ってください。
select使えばいじゃん
どれでもそうだけど、selectですぐ同時処理上限が見える
selectって30ユーザくらいしか受付できへんの?
selectはunlimit次第でいくつでもいけるが一定数超えると無駄が多すぎて非効率的になる。 空振りが多すぎるんだな。だから非同期APIとかに切り替えるべし。
dev/poll、epoll、kqueueはいつ一本化されるの?
kqueue以外は実質死滅してるので無問題
非同期処理と非ブロッキングモードってどう使い分ければ良いの?
使い分けるも何もそもそも目的が違う ところで次スレってもう立ってたっけ?
>>983 真剣に聞いてるなら、過去スレ読んでみない?
HTML化待ちで読めないかな?
その話題、なんだか知らないけど荒れるんだよ…
GUIアプリでブロック型を採用するのはちょっとなぁ・・・。
スレッド分けてブロックさせとくのが1番簡単なんじゃない?
数百個のスレッド作るのはちょっと・・・
ほとんどの場合は数百もコネクションを維持しとく必要ないでしょ?
991 :
デフォルトの名無しさん :04/07/21 13:49
990を越えたし、次スレ立ててくる。
992 :
デフォルトの名無しさん :04/07/21 14:00
993 :
デフォルトの名無しさん :04/07/21 14:24
>>985 空振りが多いからスレッドに分けざるを得ないというのは
selectの明らかな欠点だし。
それにオーバーヘッドを比較するならselect v.s. pollでないの。
ところでselectとepoll/kqueueって計算量って前者はO(n), 後者はO(1)であってる?
epoll は知らないけど、kqueue は O(1) ってどっかに書いてあったな。 select/poll は見た感じが O(n) ぽいよね。 以上、僕の感想ですた。
カーネルからのシステムコールならそうなるんじゃないのかな
あ〜今日も残業か...
997 :
デフォルトの名無しさん :04/07/21 17:35
記念カキコ v(^o^*)
998
999
終わり
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。