ネットワークプログラミング相談室 Port20at TECH
ネットワークプログラミング相談室 Port20 - 暇つぶし2ch262:デフォルトの名無しさん
07/10/20 05:32:52
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます

言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。

263:デフォルトの名無しさん
07/10/20 08:34:53
>>261
同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。

264:デフォルトの名無しさん
07/10/20 08:47:52
>>263
てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか?

// 送信可能フラグをたてる
case FD_WRITE:
  send_flag = TRUE;
  return 0;

// ファイル送信スレッド
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send_flag = FALSE;
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      while( send_flag == FALSE ) Sleep(100);
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

こんな感じでいいのかな・・・?

265:デフォルトの名無しさん
07/10/20 08:59:55
>>264
何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。

WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
URLリンク(www.amazon.co.jp)

猫でもわかるネットワークプログラミング 第2版
URLリンク(www.amazon.co.jp)

266:デフォルトの名無しさん
07/10/20 09:03:16
>>264
それじゃ、下のwhileループ群が同期になってしまうよー

慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。

>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。

267:デフォルトの名無しさん
07/10/20 09:47:26
e1000の改造について詳しいドキュメントちょうだい

268:デフォルトの名無しさん
07/10/20 09:56:35
>>265
ん~書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。

>>266
色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。
FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
キューを実装するということは、こういう感じで実装するということですかね・・・

while( fread(buf) ){
  push(buf);
}
PostMessage(,,FD_WRITE,);

FD_WRITE:
  if( キューにメッセージがあれば ){
    sendbuf = pup();
    send(sock, sendbuf, sizeof(sendbuf), 0);
  }
  return 0;

269:デフォルトの名無しさん
07/10/20 09:57:20
pushとかpopとかこれじゃスタックっぽいですね。
脳内でキューに変換してくださいm(_ _)m

270:デフォルトの名無しさん
07/10/20 10:04:25
>>268
FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。

サンプルもネットに転がってるはずだから調べよう。

271:260
07/10/20 10:15:22
>>262
情報ありがとうございました。探してみます

272:デフォルトの名無しさん
07/10/20 13:36:48
>>262
横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。

273:デフォルトの名無しさん
07/10/20 13:57:44
>>268
>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。

「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。

ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。

あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。

274:デフォルトの名無しさん
07/10/20 14:52:02
なぜそんなに面倒なんですか
バカみたいですね

275:デフォルトの名無しさん
07/10/20 15:04:36
なぜって、非同期だからさ
バカみたいだろ?
おとなしく同期ソケット使っとけ

276:デフォルトの名無しさん
07/10/20 15:29:06
>>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。

277:デフォルトの名無しさん
07/10/20 17:12:58
サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?

278:デフォルトの名無しさん
07/10/20 18:08:48
すいません。
初心者のくだらない質問を受けてください。

javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?

つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?

それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?

またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?

何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。




279:デフォルトの名無しさん
07/10/20 18:13:07
>>278
WebProg板へいってこい

280:デフォルトの名無しさん
07/10/20 18:30:30
>>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい

281:デフォルトの名無しさん
07/10/20 18:50:18
>>280
ありがとうございました。
そういうことでしたか。



282:デフォルトの名無しさん
07/10/21 22:56:16
サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。

この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?

283:デフォルトの名無しさん
07/10/22 01:01:25
信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな

データが改ざんされてないか調べるならハッシュ関数つかうけどな

284:デフォルトの名無しさん
07/10/23 10:49:11
winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど
int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど
複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの?

例えば10レコードのデータを送信する時など
ループで10回実行するか、1回だけ実行するかで効率が変わるのかな?

OSが勝手に送信バッファをいい具合に設定してくれる?

言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く

285:デフォルトの名無しさん
07/10/23 11:34:53
>>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。

そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。

286:デフォルトの名無しさん
07/10/23 20:54:22
0バイトのデータをsendする方法はありますか?

287:デフォルトの名無しさん
07/10/23 22:32:07
0バイトのデータをsendすることに何の意味が?

288:デフォルトの名無しさん
07/10/23 22:32:57
ping代わり?

289:デフォルトの名無しさん
07/10/23 23:16:08
connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認
したいの・・・

290:デフォルトの名無しさん
07/10/24 02:31:33
0byte送って確認するのか。
斬新なアイディアだ。

291:デフォルトの名無しさん
07/10/24 03:19:40
いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。


292:デフォルトの名無しさん
07/10/24 03:51:28
>>289
connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?

>>290
tcp keepalive


293:デフォルトの名無しさん
07/10/24 05:02:20
>>292
write可能であっても成功したとは限らないの・・・

294:デフォルトの名無しさん
07/10/24 08:58:35
>>293
connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?

295:デフォルトの名無しさん
07/10/24 09:48:51
そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?

296:デフォルトの名無しさん
07/10/24 09:52:08
そんなことは聞く前にソケットFAQ読め。

297:292
07/10/24 10:14:48
>>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。


298:デフォルトの名無しさん
07/10/24 10:59:21
FAQくらい理解してから、人にアドバイスしよう。
URLリンク(www.kt.rim.or.jp)
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?

299:デフォルトの名無しさん
07/10/24 11:05:01
>>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。


300:デフォルトの名無しさん
07/10/25 00:56:29
サーバー用のソケットは
socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません

listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます

listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?

301:デフォルトの名無しさん
07/10/25 06:54:40
ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。

302:デフォルトの名無しさん
07/10/25 10:23:58
データを送信した時に全データが送られないってことがあるじゃないですか。

これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか?
どんな設定をしたらいいですかね?

setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・

全データ遅れなかった時の動作が確認できないんです・・・

303:デフォルトの名無しさん
07/10/25 11:47:12
>>300
listen で実際にサーバのポートを開く。
socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。

304:デフォルトの名無しさん
07/10/25 11:50:48
>>302
受信側の受信バッファも小さくしてみたら?
あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。
1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。

305:デフォルトの名無しさん
07/10/25 11:52:46
>>304
回答ありがとうございます

ちょうど今自己解決しました

送信データを1バイトずつSendしたらなりました

306:デフォルトの名無しさん
07/10/25 15:37:11
nagleを切ればいいだろ

307:デフォルトの名無しさん
07/10/25 21:17:23
>>306
やっぱり、全然無理でした。
どうやったらできるんだろ?
カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ?

送信バッファ 30バイト、送信データ100バイトとした時
send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?

308:デフォルトの名無しさん
07/10/25 21:19:18
ちなみに
サーバをIOCPで実装しています。WSASend, WSARecvを実行しています

309:デフォルトの名無しさん
07/10/25 21:19:54
だから正確にはsend関数は使ってません

310:デフォルトの名無しさん
07/10/25 23:37:18
TCPのチェックサムって計算

仮想ヘッダ+TCPヘッダ+ペイロードだよね?

仮想ヘッダとTCPヘッダはいいけど
ペイロードってどこまでなの?

HTTPとかTCPの下になんかプロトコル付く場合
だけ計算みする



311:デフォルトの名無しさん
07/10/25 23:45:01
>>310
> ペイロードってどこまでなの?

全部(もしデータが奇数だったら1バイトの0x00を付加)


312:デフォルトの名無しさん
07/10/26 03:14:59
>>307
TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を
また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは
あんまりあてにならない。

313:デフォルトの名無しさん
07/11/02 15:00:24
winsockでTCPでプログラミングをしているのですが、
たまに接続が上手くいかない時があります。
connect()を実行しても、タイムアウトになってしまいます。
一度プログラムを終了して、再度connect()したら普通に接続できます。
上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?

314:デフォルトの名無しさん
07/11/02 15:07:17
たまたまサーバや回線が混雑してて繋がらなかったとかじゃないか
WSAGetLastErrorでエラーの詳細を確認しる

315:デフォルトの名無しさん
07/11/02 15:16:06
>>314
connect()のエラーは10060でした。
多分タイムアウトだと思うのですが・・・。

while(SOKET_ERROR){
  connect();
}

のような感じにしていて、常に10060が返って来ます。
ネットは色んなHPを見て回れるので混雑してるとかではないと思います。
↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、
普通に接続が出来たので、サーバが原因ではない事は分かってます。

316:デフォルトの名無しさん
07/11/02 15:31:53
connectに失敗した場合、closesocketをして、再度ソケットを作成、サーバのアドレスの設定等を行い、
その後またconnect()を実行する事で、サーバに接続する事は出来ました。
しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。
connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・

一体何が原因なのでしょうか・・・。

317:デフォルトの名無しさん
07/11/02 15:43:53
URLリンク(videointroplayer.web.fc2.com)

318:デフォルトの名無しさん
07/11/03 14:28:53
サーバは何?誰がどうやって作ったもの?

319:デフォルトの名無しさん
07/11/03 18:07:41
サーバは自分で作りました。これもC、Winsockで作ってます。

320:デフォルトの名無しさん
07/11/03 19:35:35
>>316
connectのエラーコードは何だよ。それくらい書けばいいのに。

321:デフォルトの名無しさん
07/11/03 19:50:06
>>320
>>315

322:デフォルトの名無しさん
07/11/03 19:59:43
>> 316
九割九分九厘名無氏作蟲

323:デフォルトの名無しさん
07/11/03 20:09:08
>>316
タイムアウトだから、>>314が言っているような感じなんじゃね?
起きている事象として把握できているのが、10060だけだと考えるのはキツイかも。

回線の種別(loopback、外部への接続)とか、connectの頻度とか、
connectがエラーになる接続先は常に同一なのかとか、その辺はどうなのだろう?
あと、クライアントとサーバと両方を自分で作っているのなら、connectと
acceptの数や時刻をログ出力して比較してみるとか。
いくつか考えうる要因をピックアップして調べてみては?

324:デフォルトの名無しさん
07/11/03 20:25:01
>>323
しかし、connect()に失敗したら再度connect()を実行するような設計にしています。
回線の混雑が理由だったら、いつかは接続できそうな気が・・・。実際はこの状態になるといつまでも10060を返し続けます。
また、10060を返してる間に、他のクライアントプログラムを実行しサーバの同じポートにconnect()を実行したら普通に接続できました。
もちろん同じPCからです。また、10060を返した後にソケット破棄⇒再生成してconnect()を実行すると接続できるので、
どうもネットワークの混雑という理由は考えにくいような気がします。とはいえ、ネットワークの問題は原因が特定しにくいので、
完全にそうではないとは言い切れないです。

connectの頻度はそう多くないのですが、まずサーバに接続し、その直後にもう一つ接続を作ります。
この2つ目の接続でconnect()エラーが発生します。2つ目の接続はファイルの送受信用のソケットで、スレッドを立ててそちらで処理しています。
なのでacceptとconnectの数は2回ですね。

325:デフォルトの名無しさん
07/11/03 20:40:58
もしかして、connect()を短い間隔で2回やってるのが原因なのかなと思って、
2回目のconnect()をする前にSleep(200)を挟んで何度か実行したところ、
connect()でのエラーはなくなったように思えます。(まだ試行回数が多くないので分からないですが)

短い時間で連続してconnect()を実行した場合、何が起こるんですかね・・・?

326:デフォルトの名無しさん
07/11/03 21:14:09
2MSL だろ

327:デフォルトの名無しさん
07/11/03 21:19:35
サーバのOSはWinXP ProとかHomeだったりするのかい

328:デフォルトの名無しさん
07/11/03 21:24:36
>>325
ファイアウォールのログは確認しておいてね。

329:デフォルトの名無しさん
07/11/03 22:26:00
>>326
winsockの仕様というよりも、TCPの仕様ですか・・・。
でも通信をクローズしてないのに関係あるんですかね?
全然詳しくないので何ともいえないですが・・・

>>327
OSはWinXP HomeEdition ver.2002 SP2です。

>>328
火壁のログの確認・・・ググってきます

330:デフォルトの名無しさん
07/11/03 22:37:40
>>324
まずは、ネットワークトレースを見てからだ。
10060なら、syn、syn-ackがどうなっているか確かめようぜ。

331:デフォルトの名無しさん
07/11/03 22:45:35
Linux使いなのでコード等よくわからんが、
ネットワークプログラミングのデバッグならパケットキャプチャだ。
WindowsならWiresharkがあるはず

332:デフォルトの名無しさん
07/11/03 22:54:04
Wiresharkだったらこの間入れたはず。
でも、英語だらけで使い方がよく分からずに放置した記憶が・・・!

syn、ackってTCPの3wayHandshakeとかの話ですよね?
そんなところまで見れるとはなんと便利なソフトなのだろうか。
とりあえず使い方から調べなおしてちゃんと根本から問題解決するか・・・

333:デフォルトの名無しさん
07/11/03 23:15:51
333ゲット

334:デフォルトの名無しさん
07/11/03 23:22:26
ところでみなさんGUIのネットワークプログラムを作るときは
非同期ソケットでスレッド1本派
同期ソケットでマルチスレッド派
のどっちですか?

335:デフォルトの名無しさん
07/11/03 23:34:09
なんとかパケットキャプチャは出来たけど、実際見てもよく分からないという現実!
URLリンク(kjm.kir.jp)
No.10-12が多分最初の接続ですね。その後のポート5000がファイル送受信用の接続です。
ポート番号については突っ込まないで下さい><

最後の方で色々とsynとackを送りまくってますが、ここら辺がソケット破棄して再設定してconnect()してるあたりですかね・・・。
俺の知識じゃ、これ見て でっていう レベルなんですが・・・

336:デフォルトの名無しさん
07/11/03 23:41:58
よくわからんがNo.30とNo.50の 192.168.0.185:3739 -> 192.168.0.186:5000
に185が応答していないように見えるが。

ファイル送受信用、と言われても・・・そんなの話に出てきてないから・・・

337:デフォルトの名無しさん
07/11/04 00:01:32
XP Homeはサーバ用途が制限されていたような

338:デフォルトの名無しさん
07/11/04 00:01:49
>>336
>>324で一応書いたつもりでしたが、ちょっとゴチャゴチャして見にくかったですねm(_ _)m

多分34、50、63のSYNを送ってサーバからの応答がないままタイムアウトになって、
ソケット破棄、ソケットの再生成と再設定⇒connect()が67で、その後の応答とかが68、69で
接続が確立してるっぽいですね。それ以降のものはファイル送受信のパケットだと思います。

見る限り、サーバからのACKが返ってこないようですが、クライアントからのSYNは送られてるんですよね。。。
サーバにそれが届いてないか、サーバに届いてるけど、サーバが送り返してくるSYN,ACKが途中でパケットロスしてるのか・・・。

339:デフォルトの名無しさん
07/11/04 00:11:49
>>338
ポート5000からの応答が無いな。そっちを調べるしかないだろ。

340:デフォルトの名無しさん
07/11/04 00:13:42
>>335
ポート5000ってのはナンダヨ。サーバー側のプログラムが悪いんじゃないのか。

341:デフォルトの名無しさん
07/11/04 00:29:10
>>340
ん、どういう事ですか?あまり49151以下の予約済みポートは使わない方がいいって事ですか?
とりあえずサーバ側のプログラムを再度見直してみます。

342:デフォルトの名無しさん
07/11/04 00:34:25
>>334
ケースバイケースだろ。

343:デフォルトの名無しさん
07/11/04 01:49:58
netlinkの使い方を日本語で詳しく説明してるサイトないかな?
Manpage of NETLINK以外で

344:デフォルトの名無しさん
07/11/04 06:18:34
サーバ側が、50000番の接続要求に反応しない理由を調べたほうがいい。

1.サーバ上で、50000番への接続受付が満杯
2.サーバ上で、50000番がまだ再利用可能ではない(サーバ上で、netstatして50000番の状態を調べれ)
4.サーバが再起動した
3.パケットロスが発生してる(ローカルネットワークじゃ考えにくいと思う)

1,2,3,4の順で可能性は高いと思う

345:323&328
07/11/04 07:14:35
>>341
ファイアウォールのログは見てみた?
SYN floodか何かに判定されてコネクション要求がファイアウォールで破棄されていないかな、
と思ったんだが。

…もしかして、俺、考えている方向ずれてる? そうだとしたら、すまん。

クライアントとサーバのプログラムにログ出力を付け加えて、コネクションの確立の
様子を見るのもあり。connectやacceptの前後といった場所に、printf()で良いから
付け加えて、クライアントとサーバの両方の処理がどのように、どこまで出来ているのか
確認するってことで。

346:デフォルトの名無しさん
07/11/04 07:56:09
URLリンク(youtubetv.atspace.com)

347:デフォルトの名無しさん
07/11/04 09:14:42
FreeBSD上でプログラムを組んでいて不思議な事に出くわしたので相談します。
IPアドレスを入力し、そのアドレスのネットマスクを取得するプログラムを組んでいますが、
ICMP_MASKREQを使って取得しています。しかし、AlliedTelesisのL3スイッチではきちんとICMP_MASKREPLY
が返ってくるのに、CISCOのルータやPCだと応答がまったく返ってきません。
これはプログラムミスか、単にCISCOのルータがRFCに準拠していないのか・・・
どうでしょうか?意見をお願いします。

348:デフォルトの名無しさん
07/11/04 10:52:27
>>347
> CISCOのルータ
Firewallで捨てられてるとか? ルーターのicmpカウンタをチェック。 

> PCだと
ホストは必ずしも答える義務無し。

349:デフォルトの名無しさん
07/11/04 11:22:08
>>348
ヒントありがとうございます、CISCOルータにて、ip mask-reply コマンドでMASKREPLY
を有効にしたところ期待通りにプログラムが動きました、デフォルトでno ip mask-reply
になっているようです。

PCでは答える義務無しですか、残念。
SNMP以外でネットマスクを取得する手段を考えていたのですが・・・
考え直してきます。

350:デフォルトの名無しさん
07/11/04 11:48:20
>>349
> SNMP以外でネットマスクを取得する手段

MASKREQUESTって聞いているホストが使うべきマスクを問い合わせるのに
使うのでしょう? 問い合わされたホストのマスクを返すのではなくて。
昨今はDHCPで取得される情報なのでほとんど使われない機能。

351:デフォルトの名無しさん
07/11/04 11:52:28
RFC1812はデフォルトで答える事をMUSTにしてるので、お前が設定したのだろう。

352:デフォルトの名無しさん
07/11/04 12:23:40
すれ違いで申し訳ないんですが、
googleでXXXを検索。

のように、webページに引数を渡す?みたいな事ってどうやればうまく
できますか?

353:デフォルトの名無しさん
07/11/04 12:34:23
>>350
勘違いしていました、指摘ありがとうございます。
たしかにそうですね・・・、実験で確認がとれました。
MASKREQUESTで問い合わせたアドレスのネットマスクを取得する考えは根本から間違ってました。

>>351
ルータ初期化して試してみましたが、デフォルトでno ip masu-replyになってました。

354:デフォルトの名無しさん
07/11/04 12:37:34
ヒント:URI、クエリ、GET要求

355:デフォルトの名無しさん
07/11/04 13:53:11
>>354
ヒントありがとうございます!
大変助かりました!


356:デフォルトの名無しさん
07/11/04 14:15:27
>>353
iosのバージョンとかにもよるんじゃないの。
デフォルトのイメージが書き換えられてる場合もあるし。

357:デフォルトの名無しさん
07/11/04 14:16:09
おまいら、IOSとかCiscoの製品使える?
やっぱネットワーク系のプログラム組んでる人間としてCCNAぐらい取っておくべきかな?

358:デフォルトの名無しさん
07/11/04 14:19:54
そんな暇あったら、カマー本やスティーブンス本読破すれば?
基本的な知識あれば、ルータ設定くらい簡単だよ。

359:デフォルトの名無しさん
07/11/04 14:46:40
自分の力に自信が無くて
資格を求めてるんだろ。
取るのを勧めてやるのが優しさだよ。

もっとも俺ならプログラムなんてもう辞めろと言うけどね。


360:デフォルトの名無しさん
07/11/04 20:27:40
>>351
RFC1812が書かれた当時とは実情が変わるなんて良くあること。

ciscoのマニュアルによると。

ip mask-reply

 To have the Cisco IOS software respond to Internet Control Message  
 Protocol (ICMP) mask requests by sending ICMP mask reply messages, use
  the ip mask-reply command in interface configuration mode. To disable
  this function, use the no form of this command.

Defaults

 Disabled <<<<<<

コマンドが導入されたのはIOS 10.0。

361:デフォルトの名無しさん
07/11/05 22:27:16
プログラマからみたIOSっていうとXMLみたいなもんだからなぁ


362:デフォルトの名無しさん
07/11/06 18:17:05
全然違うぞw

363:デフォルトの名無しさん
07/11/10 13:29:28
IPv4かIPv6かわからないときgetaddrinfoを利用し調べる方法が
URLリンク(ja.wikipedia.org)の下のほうに書いてありました

Windowsではws2tcpip.hに宣言がありました
getaddrinfoへ渡したaddrinfoのai_addrを利用し、IPv4かIPv6のアドレスを取得すると思われるのですが
ai_addrの型はsockaddrでその定義はwinsock2.hにしかなくそれは以下のようになっていました
struct sockaddr {
 u_short sa_family;              /* address family */
 char sa_data[14];            /* up to 14 bytes of direct address */
};

これだと8*14==112で、IPv6アドレスを表すための128bitに足りないような気がするのですが思い違いでしょうか?

364:デフォルトの名無しさん
07/11/10 13:37:49
sockaddr_in6にキャストしてつかうんじゃね?

365:デフォルトの名無しさん
07/11/10 13:41:07
sockaddr sockaddr_in sockaddr_in6
でググれ

366:デフォルトの名無しさん
07/11/10 13:44:34
FTPの同時接続数とレスポンスをまとめたサイト知ってる方います?
並列は3回線くらいがいいのかな・・・

367:デフォルトの名無しさん
07/11/10 15:40:26
環境によって違う。

>>363
もっとCの勉強した方がいい。

368:デフォルトの名無しさん
07/11/10 18:09:19
計算もできない馬鹿がいるって
聞いて飛んできました

どこどこ?

u_shortが8bitってどんな頭してるんだよw
染んでこいよw

369:デフォルトの名無しさん
07/11/10 18:12:03
>>368
顔から火を噴きながらとんでけ

370:デフォルトの名無しさん
07/11/10 18:30:01
氏ねとは言い過ぎだが
レベルの低いやつは質問しない
されても無視するようにしないか?

371:デフォルトの名無しさん
07/11/10 19:57:12
さすがに今ではshortが8bitってことはほとんど無いが・・・
逆に16bitであり続ける理由も無いな

372:デフォルトの名無しさん
07/11/10 20:00:28
そう考えると結構恐ろしいんだよな
プロトコルにつかう構造体はバイト単位じゃなくて
オクテット単位か出来ればビット単位で定義すべきなんだよな

373:デフォルトの名無しさん
07/11/10 20:09:49
Cには2進表記すらない。
0b1_01110_00


374:デフォルトの名無しさん
07/11/10 20:10:40
>>371
殆どない、じゃなくて、規格上ありえませんが。
16bitより大きい可能性はあるけど。

375:デフォルトの名無しさん
07/11/10 20:14:32
現実を知らず
教科書しか読まない奴は
レスしない方がいいよ。


376:デフォルトの名無しさん
07/11/10 20:16:45
>>375
アホ表明ですか。毎度ご苦労様です。

377:375
07/11/10 20:18:34
>>376
俺はあほじゃねーよ
落ちこぼれなだけだ糞が

378:デフォルトの名無しさん
07/11/10 20:31:08
せめてageたら?(藁

379:デフォルトの名無しさん
07/11/10 21:10:59
>>374
いやいや、あるよ。規格上でも char≦short≦long なだけだし。
intに至ってはもっとひどい

380:デフォルトの名無しさん
07/11/10 21:14:39
規格ではshortは-32767~+32767を保証してなかったっけ?

381:デフォルトの名無しさん
07/11/10 21:20:41
>>380
ISO/IEC 9899によるとちゃんとその規定があるな

つか規格読んでもshort intとshortの区別がつかねぇ・・・
longとlong intの違いって何?
long long ago; ってそういうギャグを実現したかっただけ?

382:デフォルトの名無しさん
07/11/10 21:30:51
>>379
バカまるだし
shortは16bit以上、longは32bit以上が必須

383:デフォルトの名無しさん
07/11/10 21:37:59 BE:1262592386-2BP(250)
どの規格のC?
てかCじゃなくてC++?

384:デフォルトの名無しさん
07/11/10 21:40:46
5.2.4.2.1 Sizes of integer types <limits.h>
も読んだことない奴は黙ってろよ、ボケが。

URLリンク(www.jisc.go.jp) で X3010 な。

385:デフォルトの名無しさん
07/11/10 21:40:44
>>382
>longは32bit以上が必須
さすがにこの嘘はオレでも見抜く

386:デフォルトの名無しさん
07/11/10 21:43:06
ずっと384のターン

387:デフォルトの名無しさん
07/11/10 21:54:57
知らないことは恥ではないし、バカにされる理由もない。
誰もが最初は知らないんだし、少なくとも俺は知らないという理由ではバカにしない。

恥なのは、知らないくせに知ったかぶって間違いをさらすこと。
嘘を言いふらして、周りにも迷惑をかけるし。

388:デフォルトの名無しさん
07/11/10 21:56:24
C89より昔のCプログラムはネットにつなぐな氏ねってことですかそうですか

389:デフォルトの名無しさん
07/11/10 21:57:45
もし>>379>>385(と>>371)が別人だったら笑える。
こんなにも恥さらしが何人も居るとは。

390:デフォルトの名無しさん
07/11/10 21:58:21
>>387
あんまり384をいじめるなよ

391:デフォルトの名無しさん
07/11/10 22:01:41
もしかして、>>387>>384が同一人物だと思っているのですか?

392:デフォルトの名無しさん
07/11/10 22:03:37
>>388
発端となった>>371は、「今では」と言っているので、昔の話は関係ありませんね。
「今のCの規格」で、shortのサイズが決まっているかどうかですよ。

393:デフォルトの名無しさん
07/11/10 22:08:30
 

394:デフォルトの名無しさん
07/11/10 22:09:21
>>392
昔の規格が使用禁止になったわけじゃないしなぁ。
ていうか、使用禁止にしてほしい。マジで。頼むよ。

395:デフォルトの名無しさん
07/11/10 22:14:06
新規格を出せば後は野となれ山となれ

396:デフォルトの名無しさん
07/11/10 22:16:54
ふと思ったんだけど、C99ってみんなもう適用してる?

397:デフォルトの名無しさん
07/11/10 22:19:03
もう適用してる?
(゚Д゚)ハァ?

398:デフォルトの名無しさん
07/11/10 22:26:57
>>397
冷静に考えたら適用って変な言い方かも。
つーか -std=c99つけるとコンパイル通らないコードとか
けっこう多くてさー

399:デフォルトの名無しさん
07/11/10 22:33:08 BE:946944094-2BP(250)
K&R2版のANSI Cに従って書いてる。

つもり

400:デフォルトの名無しさん
07/11/10 22:36:04
結局、 shortが16bitとは言い切れない時代の規格 が
まだまだゾンビのように蔓延ってるってことか・・・やりきれんな

401:デフォルトの名無しさん
07/11/10 22:40:10
そんなの<limits.h>やsizeof使えば簡単に弾けるじゃん。

402:デフォルトの名無しさん
07/11/10 22:43:14
>>401
で?

403:デフォルトの名無しさん
07/11/10 22:43:29
>>401
弾いてどうすんだよwww コンパイル通らないだろwww
そんなリファクタする暇と金は貰ってねーよwww サーセンwww

という人が多いというかほとんどだと思う。

404:デフォルトの名無しさん
07/11/10 22:46:13
弾いたら動かないだろw

405:デフォルトの名無しさん
07/11/10 22:49:50
>>400のケースは新しく書いたコードをコンパイルするんでしょ?
希少な環境向けのコードは、必要に迫られてから実装すればいいのでは?
コンパイルの失敗を安全弁にしといて。

406:デフォルトの名無しさん
07/11/10 22:53:12
>>405
いや、無理だな
コンパイルが通ってしまって挙動が変わる のが怖すぎる
古ければ古いほどなおさら・・・ イァ イァ

407:デフォルトの名無しさん
07/11/10 23:14:48
#ifndef __STDC__
#error ばーか
#endif

つーか、まず「C89以前のコンパイラしかない環境」は無いし(GCC等のクロスも含めて)
例え「C89以前」だとしても、「それに加えてshortが16bit未満」なんてこと、ありえないよ。
世界中捜せば、pccを自分でコンパイルして常用している人くらいは居るかもしれないけどさ。

408:デフォルトの名無しさん
07/11/10 23:18:00
そもそも、C89、いわゆるANSI-Cだって
プロトタイプやconst,voidなんかを導入したとはいえ、
「出来るだけそれ以前の処理系が規格違反にならないような規格」として作られたんだから。
intのサイズとか。

409:デフォルトの名無しさん
07/11/10 23:19:48
>>407
「C89以前のコンパイラしか使わせてもらえない職場環境」
は実在します

410:デフォルトの名無しさん
07/11/10 23:23:13
12bitのDSPが御座いまして

411:デフォルトの名無しさん
07/11/10 23:25:15
H8Sとか普通に使うんすけど

412:デフォルトの名無しさん
07/11/10 23:42:45
へー、みんな、そんなにshortが16bitに満たない環境を使ってるんだー
すごいねー

413:デフォルトの名無しさん
07/11/10 23:47:12
ここはネットワークプログラミング相談室
いつからC言語信者が語り合うスレに・・・

414:デフォルトの名無しさん
07/11/11 02:30:05
407は自宅警備員?

415:デフォルトの名無しさん
07/11/11 02:33:28
うん

416:デフォルトの名無しさん
07/11/11 04:06:51
>>407
>「それに加えてshortが16bit未満」なんてこと、ありえないよ。
そういう世界に生まれたかった

417:デフォルトの名無しさん
07/11/11 04:17:13
今からでも遅くはないZE

っ脳内世界


418:デフォルトの名無しさん
07/11/11 12:05:04
とりあえずシロートは↓嫁
URLリンク(www9.plala.or.jp)

419:デフォルトの名無しさん
07/11/11 12:19:25
已 学 了的「long」修 尺寸。
其 「long」用 略了「long int」的 述,
那个意 成「与int型同 比那个大」。
在同 里(上)表示「与int型同 比那个
小的」「short」(short int 的省略)也存在。
ANSI C short 和 long 的字 幅度被
理器托付,象只以下一 地 定着。

420:デフォルトの名無しさん
07/11/11 13:57:54
>>418
そのページの作者↓のページで扱える数値の範囲に嘘を書いているから信憑性ゼロ
URLリンク(www9.plala.or.jp)
× -32768~32767
○ -32767~32767

421:デフォルトの名無しさん
07/11/11 14:03:33
つーか>>384を読んでくれよ。
ここの部分は馬鹿でも理解できる記述になってるから。

422:デフォルトの名無しさん
07/11/11 14:07:49
>>420
お前それは本気で言ってるのか…(゚д゚)

423:デフォルトの名無しさん
07/11/11 14:13:04
>>384でFA!
あとはC言語スレで!

424:デフォルトの名無しさん
07/11/11 14:26:26
ほんとこういうくだらない話題のときだけは伸びるな

425:デフォルトの名無しさん
07/11/11 17:52:14
>>421
X3010ってC99のことじゃないの?

426:デフォルトの名無しさん
07/11/11 17:57:47
いやX3010のうちX3010:2003がC99相当

427:デフォルトの名無しさん
07/11/11 18:18:53
>>426
なるほど

428:デフォルトの名無しさん
07/11/11 18:20:21
intのサイズはどうでもいいというか決まってないよね?

429:デフォルトの名無しさん
07/11/12 10:02:48
AcceptExの完了をGetQueuedCompletionStatusで捕捉できない・・・
その次のクライアントからの送信はGetQueuedCompletionStatusで捕捉できるのですが
第4引数のLPOVERLAPPEDはAcceptExに渡したのがきます。 ><

期待したのは
メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる ->
   ワーカースレッドで呼ばれてたGetQueuedCompletionStatusが処理を返す -> クライアントが"Hello"と送る -> ワーカースレッドで呼ばれてた(ry
という感じなのですが

実際は
メインスレッドでAcceptExを呼ぶ -> クライアントがconnectしてくる ->
   まだGetQueuedCompletionStatusから返らず@ワーカースレッド -> クライアントが"Hello"と送る -> ここで初めてGetQueuedCompletionStatusが処理を返す
となってしまします。
初めてGetQueuedCompletionStatusが返ったときのOVERLAPPED::InternalHighは5となっておりクライアントからの送信に反応したものと思われます。

AcceptExの完了を捕捉しないのが仕様かと思ったのですが
URLリンク(www.codeproject.com)のコードを見てみるとワーカースレッド内にswitch文内をみるとsend、recvのみならずacceptも捕捉できることを
前提として書かれてるように見えます。 しかし実際コンパイルして実行してみるとやはり上記とおなじことになってしまいました。

430:デフォルトの名無しさん
07/11/12 13:13:54
いや仕様だし。

431:デフォルトの名無しさん
07/11/12 13:52:02
>>429
MSDN読んだら。
データを受け取るまで待ちたくないのなら、
dwReceiveDataLengthに0を渡すと良さげ。

432:429
07/11/12 16:22:13
>>431
おおおおおお ありがとうございます
dwReceiveDataLengthに0を指定し期待していた動作を得られました
MSDNのdwReceiveDataLengthの説明のところにもろに書いてありました 不覚orz


433:デフォルトの名無しさん
07/11/12 22:14:33
VB.netのUDPの使用について質問があります。
2台のコンピュータ間で互いに自身の画面をキャプチャして相手に送るソフトを作っています。
それを送信して、受け取り、見ることはできるようになったのですが、外部ネットワークとの通信ではうまくいきません。

恐らく、データの重さから途中でパケットが消えているのだと思うのですが…。
流石に現段階よりもさらにデータを少なくすると、とても見れたモノではないので、
パケット分割をして送信しようと思うのですが分割方法がわかりません。
※ローカルネットワークではできています。

送信はキャプチャ画像を一旦メモリーに保存し、それをbyte配列に直して送信しています。

TCPは通信する相手との問題で採用する気はありません。
もし、出来ている時点までのソフトウェアのソースコードが必要なら自サイトにアップロードしダウンロードできる状態にします。

開発環境はVB2005、通信相手とはUDPを使用した単純な文字列のみのチャットなら出来ています。
よろしくお願いします。

434:デフォルトの名無しさん
07/11/12 23:02:36
>>433
うるせえボケTCPでやれ

435:デフォルトの名無しさん
07/11/12 23:10:59
UDPでやっていちいち検証するくらいならTCPの方がいい

436:デフォルトの名無しさん
07/11/13 00:59:48
それかRTPを使え。


437:デフォルトの名無しさん
07/11/13 09:17:27
>433
ホールパンチングが必要ならTCPで外にサーバを立てろ。
遅延の問題ならTCPで多重化しろ。
単にFAQ読んでないだけだろ?

438:デフォルトの名無しさん
07/11/13 11:17:41
>>363
WindowsでのIPv6プログラミング講座 第1回
URLリンク(www.ipv6style.jp)
URLリンク(www.ipv6style.jp)

439:デフォルトの名無しさん
07/11/13 16:12:57
>>434-437
返信ありがとうございます。

パケットの分割でなんとかなるかと思いましたが、思いのほか他の方法でする回答が多かったので、一から仕様を変更しようと思います。
ありがとうございました。

440:デフォルトの名無しさん
07/11/13 17:20:23
FTPでQUIT発行してbyeした時に、通常なら受信したバイト数とかの情報を返してくるんだけど、
返って来ない場合があります。どう直せばよいのでしょうか?

221-You have transferred 0 bytes in 0 files
221-Total traffic for this session was 834 bytes in 0 transfers.
221-Thank you for using the FTP service on ftp4.geo.bbt.yahoo.co.jp.
221 Goodbye.

441:デフォルトの名無しさん
07/11/13 17:25:40
なぜここに?

442:デフォルトの名無しさん
07/11/13 21:15:47
URLリンク(tool-6.net)
Apache2で実行すると
400 Bad Rqest Errorが出るんですが、原因がわかりません。
なぜなんですかね?

443:デフォルトの名無しさん
07/11/13 22:40:45
HTTP1.0にしたらうまく動作したんですが、1.1ではなぜ出来ないんですかね?

444:デフォルトの名無しさん
07/11/13 22:46:49
Host情報送って無いんじゃね?

445:デフォルトの名無しさん
07/11/13 23:24:51
Host情報を送る際のコードが載っているサイトとかないですかね?

446:デフォルトの名無しさん
07/11/13 23:30:39
新宿2丁目と

447:デフォルトの名無しさん
07/11/13 23:39:12
歌舞伎町

448:デフォルトの名無しさん
07/11/13 23:41:03
郵便局

449:デフォルトの名無しさん
07/11/14 00:18:05
自力で調べろや坊主
って事ですか?

450:デフォルトの名無しさん
07/11/14 00:35:54
windumpでパケット調べろ。

451:デフォルトの名無しさん
07/11/15 19:10:35
GetTCPTableとかで取得したTCPコネクションを切断するにはどうすればいいんですかね?


452:デフォルトの名無しさん
07/11/15 21:09:01
HTTP1.1での通信方法がのっているサイトありましたら教えて頂けませんか?

453:デフォルトの名無しさん
07/11/15 21:42:30
Host情報を送ってHTTP1.1で通信するのは何も難しいことじゃないが今は1.0でええじゃないか
きっとおまえさんにゃまだ早いんだよ

454:デフォルトの名無しさん
07/11/16 03:06:54
RFCも読まずにHTTPをしゃべろうという人を困らせるために、
サーバはPOSTに対してできるだけ 100 Continue を返すべき。
何かと思ってちゃんと調べるだろうから。

455:デフォルトの名無しさん
07/11/16 03:20:59
>>452
URLリンク(ftp.rfc-editor.org)















分かりやすい日本語サイトなら
URLリンク(www.studyinghttp.net)
とか・・・

456:デフォルトの名無しさん
07/11/16 03:25:26
>>454
いや、いっそのことRFCそのものを返したらどうだろう?


457:デフォルトの名無しさん
07/11/16 03:52:54
でもHTTPとかContent Length義務にしてくれたほうがいいよなー

もし最初の200バイトだけ送信して何もレスポンスがないまま5分たってから
残りを送信する仕様の(糞)サーバがあったとして、
Content Lengthが義務だったら待ちつづけるし。。。

あといきなりデータ送信終了してもcloseかけてくれない(糞)サーバがあったとしたら、
データがいつ終わったのか分からないし。。。


458:デフォルトの名無しさん
07/11/16 04:34:14
>>457
それどちらも Content length の有無と関係ないですよ。

459:デフォルトの名無しさん
07/11/16 04:47:06
いや例えば後者の場合、サーバがデータ送信終了してもクライアントでrecvの戻り値が0になるなり
なんなりしなきゃ終わったかどうか分からなくないですか?
Content-lengthあればrecvの戻り値が0であろうがなかろうがそこで自信を持って切れますし。。


460:デフォルトの名無しさん
07/11/16 04:59:36
>>459
えーとつまり「RFC違反だけど content length だけは正常に返す」という
サーバを救済できるから、content length を RFC で義務化すべき、
ということですか?

レスポンス開始時にはサイズが分からないので Connection: Close で返す、
というまともなサーバを実装不可能にしてまでやる意味があることとは、
あんまり思えないです。

461:デフォルトの名無しさん
07/11/16 05:06:06
そうだなレスポンス開始時にサイズが分からないこともあるか。
スマンカッタ
でもRTSPとかはContent Length義務だよね。
そうしないとデータ境界わけわかんなくなるし。
こっちのほうがクライアント側がやりやすかったんで
言ってみただけだわ。

462:デフォルトの名無しさん
07/11/16 05:14:00
なんのためのチャンクだ

463:デフォルトの名無しさん
07/11/16 06:09:06
>>461
アホですね。

464:デフォルトの名無しさん
07/11/16 12:02:36
>>462
チャンクってRTSPにもHTTPにもないだろ?

465:デフォルトの名無しさん
07/11/16 12:20:06
TCP/IPソケット通信で質問します。
一度connectしたら常時接続のままという使い方をしてるんですが、
通常サーバ - クライアントどちらかでソケットcloseすると切断を検出出来ると思うんですが、
相手がcloseしないでリブートなどを行うと切断検出できません(無効となったソケットを維持)

プログラムから一定間隔でping通信する
1通信毎にセッションを閉じる(頻繁に通信が発生するのであまりやりたくない)
空の電文を常時やり取りして生存を確認する

もっとほかに断検出する良い方法があったら教えて下さい

466:デフォルトの名無しさん
07/11/16 12:41:39
>>465
TCPはそういうもの。
途中のルータが落っこちても一緒。
TCPとしては検出する仕組みをもっていない。
アプリで検出したくなければ、KeepAliveするぐらいかな。


467:デフォルトの名無しさん
07/11/16 12:59:25
>>464
>チャンクってRTSPにもHTTPにもないだろ?

はぁ?

468:デフォルトの名無しさん
07/11/16 13:03:34
>>465
> 空の電文を常時やり取りして生存を確認する

TCPはデータストリームなので、空のパケットは送れません。

1. データストリームの中のデータを型付けして、
通常データ以外に、alive check用パケットも送れるようにする。
2. keepalive socket optionを使う。(詳しくはFAQを>>1)

1.はICMP pingと違って、hostの死活でなく、
peerの死活を調べられるという利点があります。

>>466
「TCPが」というか分散環境ってそういうものだしね。
単純に落ちるfailure以外に、Content-Length: が違うなど、
mal-functional failureだって起りうる。




469:デフォルトの名無しさん
07/11/16 13:05:11
>>464
ハイパーテキスト転送プロトコル -- HTTP/1.1
3.6.1 チャンク形式転送コーディング
URLリンク(www.studyinghttp.net)

470:467
07/11/16 13:08:15
まあchunkedなんてあんま使われてないけどな

自分で使うことはほぼ皆無だし

471:デフォルトの名無しさん
07/11/16 13:38:03
はぁ?

472:デフォルトの名無しさん
07/11/16 14:03:31
ム板で騙りとかどんだけ暇なんだよ

473:デフォルトの名無しさん
07/11/16 15:26:33
>>466
>>468
ありがとうございます。
2.のkeepalive socket optionを試してみます

474:デフォルトの名無しさん
07/11/16 15:31:29
keepaliveって検出までに2時間ぐらいかかるんじゃなかったっけ

475:デフォルトの名無しさん
07/11/16 16:17:42
設定できる。
Windowsはタスクごとに設定できる。

476:デフォルトの名無しさん
07/11/16 19:07:36
ほんとだチャンクあったんだ。
でもほとんど使われてないよねこれ。

477:デフォルトの名無しさん
07/11/16 19:20:15
え?apacheなCGIに1.1で喋りかけてみたら、Chunkedな応答を
戻されて焦ってRFC2616読んだ、みたいな経験はないの?
delegateに1.1で中継してもらったら、ChunkedとContent-Lengthが同時に
戻ってきて、MLとかみるとどうみても意図的なRFC違反ですありがとうございました、
みたいな経験はないの?

478:デフォルトの名無しさん
07/11/16 19:22:04
>>476
脳内乙
君はプログラマに向いてません。

479:デフォルトの名無しさん
07/11/16 19:34:56
>>478
あっそwwww
じゃあ実際にコアな部分で使われてるオープンソースのプロジェクトを10個くらい挙げてみてよ。
RFCに準拠させるために実装が必須なサーバは除くよ。

480:デフォルトの名無しさん
07/11/16 20:05:31
Google code searchも知らないし、
Google APIも使ったことないし、
本当にプログラマじゃないんだろ。
荒れるから放置しる


481:デフォルトの名無しさん
07/11/16 20:05:33
例えば2chの.datを全取得する時、大きなものは当然のようにchunkedで返ってくるんだけど

482:デフォルトの名無しさん
07/11/16 20:10:19
もう一つ
HTTP/1.1またはKeep-Aliveで、複数の、
CGIやSSI等のContent-Length不明な物を連続してGETすると
mod_deflateによる圧縮が無ければ、当然chunkedで返ってくるね。
>481のは逆に、圧縮時に圧縮後のサイズが64Kを超えた場合のみだけど。

483:デフォルトの名無しさん
07/11/16 20:17:29
ごめん嘘だ。
HTTP/1.0だったら、Keep-Aliveでも
chunked使われるわけ無いな。強制切断だね。

484:デフォルトの名無しさん
07/11/16 20:18:10
最近のHTTPライブラリでchunkedサポートしてないのは皆無といっていいし、
HTTP系のRPCは全部chunkedサポート前提だろ。>>480にあるGoogle APIとか。


485:デフォルトの名無しさん
07/11/16 21:02:26
chunkedって実装がめんどうなんだよなあ。。。

俺はCGIは全出力結果を取得してからcontent-length付きで投げる派

486:デフォルトの名無しさん
07/11/17 00:19:16
余程レスポンスがでかくなければそれでもいいんじゃね

487:デフォルトの名無しさん
07/11/17 00:48:53
>>485
CGIの場合は特に何も考えずにただ出力すれば
HTTPサーバが勝手にchunkedにしてくれるぞ

488:デフォルトの名無しさん
07/11/17 01:19:32
>>487
受け取る側の実装が、さ>めんどくさい

ところで一般的なデータの送受信を行う際に、
効率の良いやり方はどんな感じなんだろう?

TAP <--> NIC <------------> NIC <--> TAP
のようなtap間のやりとりをするプログラムを作っているんだが、
max = MAX(NIC,TAP);
while(1){
 FD_ZERO(&read);
 FD_ZERO(&write);
 if ( 出力バッファ > 0 ) FD_SET(NIC, &write);
 if ( 入力バッファ > 0 ) FD_SET(TAP, &write);
 FD_SET(NIC, &read);
 FD_SET(TAP, &read);
 select(max+1, &read, &write);
 if ( FD_ISSET(NIC,&read) ) NICから入力バッファへ
 if ( FD_ISSET(TAP,&read) ) TAPから出力バッファへ
 if ( FD_ISSET(NIC,&write) ) 出力バッファをNICへ
 if ( FD_ISSET(TAP,&write) ) 入力バッファをTAPへ
}
単純に考えたらこれなんだけど、他に何か工夫あるかな?

489:デフォルトの名無しさん
07/11/17 01:35:27
>>受け取る側の実装が、さ>めんどくさい

そのレベルならWinInetでも使ってろ
Winならだが

490:デフォルトの名無しさん
07/11/17 09:13:18
>>488
釣りですかね…

491:デフォルトの名無しさん
07/11/17 09:47:19
無知なだけだろ。放置しる

492:デフォルトの名無しさん
07/11/17 11:27:48
俺には>>488のどこが釣りなのかわからん・・・
誰か解説plz

493:デフォルトの名無しさん
07/11/17 14:28:52
>>492
釣りではないよ


494:デフォルトの名無しさん
07/11/17 14:51:36
selectの引数の数は合ってないし、返値もみてないのに、
律儀にmax取っていたり、釣りか間抜けとしか思えん。
効率とか言っちゃってんのワロス

495:デフォルトの名無しさん
07/11/17 15:40:06
>>494
省略しただけだろ
エッセンスの方を見ろよ

496:デフォルトの名無しさん
07/11/17 16:10:53
おいしい成分は何ひとつありませんでした

ちゃんちゃんw

497:デフォルトの名無しさん
07/11/18 17:55:11
epollを使ってて、切断を検出したいんだけど、
EPOLLOUTが帰ってきたあと、recv(...) == 0だったらclose。
という流れを使ってるんだけど、
EPOLLHUPを使って切断って検出できない?

498:デフォルトの名無しさん
07/11/19 10:16:40
Linuxでプログラム書いてますが、
ソケットの状態を取得する関数はありますか?

getsockoptは状態ではなく設定を取得する関数なので要領を得ません
とりあえず、接続中か接続済みか未接続かを
ソケットディスクリプタから得るだけでもいいです

499:デフォルトの名無しさん
07/11/19 10:44:23
>>498
getpeernameあたり。

500:デフォルトの名無しさん
07/11/19 11:09:21
>>499
なるほどその手があるのか
ありがとう

501:デフォルトの名無しさん
07/11/19 15:44:17
>>497
やりたいのはずばりEPOLLRDHUPでのedge triggerちゃいますの?

502:デフォルトの名無しさん
07/11/19 18:03:29
>>501
エッジトリガっていうのかどうかわ解らないけど、
向こう側でソケットをcloseしても、こっちにHUPが飛んでこないんです
向こう側がcloseしてソケットを閉じたら、HUPが飛んできてほしい。
飛ばない仕様になってるならrecv==0を使うけど。
誰か詳しいひとおせーてください

503:デフォルトの名無しさん
07/11/19 18:13:15
>>502
提供された情報に反応してください。

504:デフォルトの名無しさん
07/11/20 08:52:58
>>503
HUPが来ないんじゃ仕方ない

505:デフォルトの名無しさん
07/11/21 10:20:39
solarisで開発してるんだけど、
ノンブロッキングモード(?)でrecv()の戻り値が
-1なんだけどerrnoが0になるんだが・・・
これってどういう状態なんでしょう?
期待値としてはEAGAIN(?)だと思ってるんですが。

ソケットプログラミング素人にどなたか救いの手をorz。
ちょっと困ってるんでageで。


506:デフォルトの名無しさん
07/11/21 10:32:31
errnoよりperror()が使いやすいよテスト

507:デフォルトの名無しさん
07/11/21 10:35:17
>>506
EAGAINの度にエラー吐かれたらたまらんぞ。

508:デフォルトの名無しさん
07/11/21 10:38:56
そもそもエラってるのにerrnoが0?

差し支えなければ前後のソースを少し晒してくれると

509:506
07/11/21 11:12:59
>>508
ありがとうございます。えっとソースは抜粋&中略ですが、
大まかな動きはこんな感じです。
現象としては2kbyte程度のデータを流すと一度に取りきれないので、
selectで再ループして残りを取得する動作を期待しているのですが、
2回目以降のrecv()が-1となるのですが、errnoがEAGAINにならないので
エラーになって回線を切ってしまいます。
試しにEAGAINと0を対象として(コメント部)selectするようにしたら、
ちゃんと残りのデータを取る事が出来ました。

while( iLeftOver > 0 )
{
/* 指定バイト数を受信、または通信の遮断まで受信データを取得 */
errno = 0;
if( ( iRcvRet = recv( stSocket, pcBuff, iLeftOver, iFlag ) ) == DCC_SOCKET_ERROR )
{
printf("iRcvRet[%d]/recv()直後errno[%d]\n", iRcvRet, errno);
iErrCode = dwp_getErrNo();

if( EAGAIN == iErrCode )
//if (( EAGAIN == iErrCode ) || ( 0 == iErrCode ))
{
/* 受信準備ができていない場合、selectで受信するまで待つ */
FD_ZERO( &stFdSet );
FD_SET( stSocket, &stFdSet );

dcc_setTimeval( 1000, &stTmVal ); /* 待ち時間は1秒 */



510:506
07/11/21 11:14:48
(一回で送れませんでした。続きです・・・)
iSelectRet = select( FD_SETSIZE, &stFdSet, NULL, NULL, &stTmVal );
if( iSelectRet == DCC_SOCKET_ERROR )
{
/* selectのエラー */
(中略)
return DCC_SOCKET_ERROR;
}
if( iSelectRet == 0 )
{
/* タイムアウト */
          (中略)
return DCC_SOCKET_ERROR;
}
/* 受信を検知 */
continue;
}
/* 受信エラー */
      (中略)
return DCC_SOCKET_ERROR;
}
else if( iRcvRet == 0 )
{
/* 通信の終了 */
      (中略)
return 0; /* 通信の切断 */
}
/* 一度のrecvで受信し切れなかった場合、受信サイズ、バッファの位置を書き換えて
再度recvを行う*/
iLeftOver = iLeftOver - iRcvRet;
pcBuff += iRcvRet;
}

511:506
07/11/21 11:17:40
あまり意味ないけどコンソール上には

>iRcvRet[-1]/recv()直後errno[0]

表示されてしまいまふ。

512:デフォルトの名無しさん
07/11/21 13:52:59
#include <errno.h>はインクルードしてますか?
(必要なOSの場合に; 今時pthread絡みで必ず必要だけど)
自分でextern int errnoしてたら殺しますよ。

513:デフォルトの名無しさん
07/11/21 14:36:48
errno=0をerrno=100にしたら100のままだったりしてねw

514:デフォルトの名無しさん
07/11/21 14:38:18
Linux&(C or C++)でhttps通信を利用したプログラムを作りたいのですが、
httpsを利用できるライブラリは無いでしょうか。

ghttpがあったのですが、httpsには対応していないようで困っています。

515:506
07/11/21 15:25:02
>>512
errno.hはインクルードはしてあります。
その直後にextern int errnoもしてました。
これは不味いんですか?
恥ずかしながらUNIXはホントわからないんです・・・。

>>513
まさにその通りです。
recv()の前後でerrnoの値が全く更新されません。

と、言うことで「extern int errno」の行を削除して
みたのですが現象は変わりません。
その書き込みから見ると非常に基本的な部分で間違いが
あると思いますがなんとも分かりません。
他に考えられる原因はありますでしょうか?
その他のソース部分には、errno.hのインクルード等は
されていません。

ちなみに動作環境はsolaris8、開発環境はeclipse+CDTで、
コンパイラはgccのVer2.8.1を使ってます。
厨な質問で申し訳ないです。m(__)m

516:デフォルトの名無しさん
07/11/21 15:42:46
>>515
errnoが通常の変数の場合、マルチスレッド環境だと、errnoを取得する前に別スレッドが書き換えてしまう
ケースがあり、正常に動作しないので、
最近のOS/ライブラリでは、#defineで「errno」をスレッドごとに確保された記憶領域へアクセスする関数に
置き換えてる。


517:506
07/11/21 15:58:11
>>515
お付き合いありがとうございます。
要は「#include <errno.h>」のみやれば良いとの認識で
良いでしょうか?

manpageによると
------------------------------------------------------------
errno は、ISO C standard で int 型の変更可能な左辺値として
定義されており、明示的に宣言を行ってはならない;
errno はマクロの場合もありえる。 errno はスレッド毎に値を持つ。
つまりあるスレッドで errno が設定されても、他のスレッドの errno には
影響しない。
------------------------------------------------------------
とありました。

しかし、#include <errno.h>をしているのは、
私がUPしたソースのあるファイルのみでしか宣言してなく、
マルチスレッド環境ではありますがこのソースは、
単一のスレッド上でのみ動きます。
(上の説明からだと複数で動いててもそれぞれ独立してerrnoを
持っていると言う事になると思いますが。)
にも関わらず>>513のような挙動になるのは何故なんでしょうか?
どこか別のヘッダ等でexternとかしてるんでしょうか・・・


だから俺には短期間じゃ無理な作業だと言ったのに(T。T)>>会社
と、愚痴をこぼしてみる。スイマセン。

518:デフォルトの名無しさん
07/11/21 16:23:23
とりあえずな、>>506の言う通り、
perror()をprintf("iRcvRet~の前に付け加えてみな。
後ろじゃダメだぞ。

519:506
07/11/21 16:48:59
>>518
ありがとうございます。perror()を使用したところ

>>recv(): 資源が一時的に使用できません。

と返ってきて、EAGAINである事が確認出来ました。
と、なると後はなんでerrnoが変更されないのかですね。
一歩前進(?)しましたありがとうございます。
絞る知恵もなくなったので、ネットで検索しまくってます。


520:デフォルトの名無しさん
07/11/21 17:11:11
環境のせいかもね
1. errno.h にバグがある
2. インクルードしている errno.h のパスがおかしい
3. ライブラリとコンパイラが不整合


521:デフォルトの名無しさん
07/11/21 17:25:47
ネットワーク関係なくなってきてるが、

#include <errno.h>
int geterrno(void) { return errno; }

これだけのファイルをgcc -Eしてみな。

int geterrno(void) { return (*__アドレス返す関数名()); }

にならないとまずい。
なってるならソースコードのerronoをgeterrno()に変えて終了。
左辺値参照はどうせまともな意味のあるコードないだろうし。


522:デフォルトの名無しさん
07/11/21 18:20:38
gcc 2.8.1ってなんだよ…
2.95.4とかなら分かるけど。
窓から捨てろ

523:506
07/11/21 22:35:07
>>520-522
お返事遅くなってしまいました。
すみません&ありがとうございます。

>>521
明日試してみます。

>>522
用意されたサーバのを使ってるだけなので
私はどうにも出来ませんorz。
察するに「古くて使い物にならねー。」って事で
良いでしょうか?このあたりも原因あるのでしょうか・・・
ソケットなんて昔からあるので大丈夫な気もしますけど。

スレ違いにもなりかけてるので、以上を踏まえて精進します。
皆さん長々とお付き合い下さってありがとうございました。
感謝します(-人-)

524:デフォルトの名無しさん
07/11/23 07:17:32
サーバ上のCGIに文字列を渡して、その文字列を保存しようとしてるのですが
日本語等の2バイト文字を渡すと正常に受け取ってくれません。

char *mozi = "test.cgi?,testあ"
hRequest = HttpOpenRequest(
hHttpSession,
"GET",
mozi,//■CGIへ渡す文字列です
NULL,NULL,NULL,0,0);

上記では「testあ」という文字列をCGIに送信していますが、CGI側では
「test0x000000000008p-10224」
という風に2バイト文字のみエラー認識されてしまいます。
どうすればCGIに2バイト文字を送信できるのでしょうか?

525:デフォルトの名無しさん
07/11/23 07:44:54
%82%A0%82%D9

526:デフォルトの名無しさん
07/11/23 07:49:32
char *mozi = "test.cgi?,test%94%C2%88%E1%82%A2"
hRequest = HttpOpenRequest(
hHttpSession,
"GET",
mozi,//■CGIへ渡す文字列です
NULL,NULL,NULL,0,0);


527:デフォルトの名無しさん
07/11/23 08:32:44
>>524
CGI エンコード

528:デフォルトの名無しさん
07/11/23 08:38:54
>>525
>>526
>>527
検索してみた所、それらしい参考文献が見つかりました。
早速実装して試してみたいと思います。ありがとうございました。

529:デフォルトの名無しさん
07/11/23 08:52:58
%82%A8%82%DC%82%A6%82%E7%90e%90%D8%82%BE%82%C8%82%97

530:デフォルトの名無しさん
07/11/23 09:25:37
%8E%C0%91%95%8A%AE%97%B9%81%41%8A%B4%8E%D3

531:デフォルトの名無しさん
07/11/23 09:45:50
エンコード状態で会話すんなwwwwwwwwwwww

532:デフォルトの名無しさん
07/11/23 10:14:24
socket通信しているときに、相手方が shutdown(s, SHUT_WR) した時、
こちら側ではselect()から抜けて、read() で検知することができますが、
その後、相手が close() または shutdown(s, SHUT_RD) したことを
検知することはできないでしょうか?

533:デフォルトの名無しさん
07/11/23 11:16:35
CGI円コード程度ならgoogleに食わせれば翻訳してくれる

URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)


534:デフォルトの名無しさん
07/11/23 14:43:38
URLリンク(%90%C0%82%C1%82%C4%82%E6%82%B5)

535:デフォルトの名無しさん
07/11/24 19:35:15
>532
writeが-1を返すとか。
selectのexceptfdsが反応するとか。

536:532
07/11/29 02:22:04
>>535

exceptfds は、相手方がMSG_OOBでデータを送ってくれないと
反応しないですね。

write は確かに-1 (EPIPE) を返してくれるのですが、こちらから
送信するときに分かるけれども、相手がcloseしたタイミングで
検知できるわけではないので、

難しそうですね。ありがとうございます。



537:デフォルトの名無しさん
07/11/29 22:36:41
というか、先に向こうがSHUT_WRしているんだから、
こっちはwriteしかできないわけだし。気にくわなければ
すきなだけwriteして、むこうがSHUT_RD(残りclose)を発行する
前に、こっちからcloseしてやれば?

538:デフォルトの名無しさん
07/11/29 22:58:19
なんか失恋とか離婚とかそんな勢いだなw

539:デフォルトの名無しさん
07/12/01 19:43:02
Linuxでサーバプログラム書いてるんだけど
acceptする前に相手のIPとポートを知る方法ってある?

540:デフォルトの名無しさん
07/12/01 19:49:23
特定のアドレスからの接続は拒否りたいとか?
acceptを呼ぶ前に接続は完了してるらしいから、無意味じゃない?
URLリンク(www.kt.rim.or.jp)

541:539
07/12/01 19:52:23
>>540
アリガトウ
そういえばそうだったね 忘れてた

542:デフォルトの名無しさん
07/12/01 20:46:07
送られてきたパケットのIPヘッダー部分を生ソケットでパースすればいけそうだけどね
俺はヘッダー処理を書いたことはあるが、パース処理までやる気はまだない

543:デフォルトの名無しさん
07/12/01 21:00:40
ヘッダー処理って何んだろう
パース処理ってのがIPヘッダの解析なら
別に何にも難しいことないだろ

544:デフォルトの名無しさん
07/12/01 21:10:03
バカには難しいんだよw

545:デフォルトの名無しさん
07/12/01 21:43:26
どこにも難しいとは書いてない件について

546:デフォルトの名無しさん
07/12/02 00:11:13
>>539
何のために?

547:デフォルトの名無しさん
07/12/02 11:08:10
エラーがでるのですが、なぜでるのか私にはわかりません。
一体なぜエラーが出るのかを教えていただけませんか?
URLリンク(tool-6.net)

548:デフォルトの名無しさん
07/12/02 11:15:55
ちょtぅwwwwwwwww
何そのやる気0の他力本願寺は

549:デフォルトの名無しさん
07/12/02 11:20:17
バグを発見したときは、
・発生時刻
・バグの詳細
・(できるなら)一次解析結果
を調べるのは常識だぞな

550:デフォルトの名無しさん
07/12/02 12:02:14
Debug Assertion Failed!
File:c:\program files\microsoft visualstudio 8\vc\atlmfc\include\atlcomcli.h
Line 154
と出ます。

551:デフォルトの名無しさん
07/12/02 12:04:08
>>550
おk 原因はわかった

552:デフォルトの名無しさん
07/12/02 12:40:58
マジレスして良いのか分からないが

取っ掛かりぐらい自分でつかんでから人に聞かないと頭には入らない

553:デフォルトの名無しさん
07/12/02 13:20:04
質問があります。
accept で得たソケットをOVERLAPPED 対応にさせるにはどうしてます??


554:デフォルトの名無しさん
07/12/02 15:27:36
acceptで得るのはlistenに渡す奴のコピー(同じ性質)みたいなもんじゃなかったか

555:デフォルトの名無しさん
07/12/02 17:18:14
pMyBr->GoHome();を消したら、ウィンドウだけは表示出来ました。
…原因が、わかりません。

556:デフォルトの名無しさん
07/12/02 19:17:38
>>554
返信ありがとうございます。
listen ソケットに WSA_FLAG_OVERLAPPED が設定されていれば、accept で得られるソケットにも同フラグが設定された状態になるんですね。
助かりました。ありがとうございます。



557:デフォルトの名無しさん
07/12/02 19:18:16
解決方法はありますか?

558:デフォルトの名無しさん
07/12/02 19:41:02
atlcomcli.h中の154行目
ATLASSERT(p!=NULL);
に何かしらの原因があるんですかね?

559:デフォルトの名無しさん
07/12/02 20:35:19
age

560:デフォルトの名無しさん
07/12/02 21:24:22
man 2 send を読むと、MSG_DONTWAIT について、

「fcntlのF_SETFLでO_NONBLOCKを指定することによっても有効にできる」

と書いてあって、これって、O_NONBLOCK にしてなくても、sendするときの
オプションで MSG_DONTWAIT を使えば非ブロックモードにできる、という意味だと
思うけど、

逆にO_NONBLOCKになってるソケットでブロックモードでsendしたいときに
send時のオプションで何とかならない?

fcntlでO_NONBLOCKをクリアしないとダメ?


561:デフォルトの名無しさん
07/12/02 21:34:42
全然関係なくてあれなのですがboost::asioがIOCP使ってるぅー

562:デフォルトの名無しさん
07/12/02 21:36:00
本当にどうでもいいwww

563:デフォルトの名無しさん
07/12/02 21:44:25
私は>>547ですが、
ヒントだけでもいただけないでしょうか?

564:デフォルトの名無しさん
07/12/02 21:52:15
少なくともエラーメッセージから何でエラーが出るのかくらい考察しろ


565:デフォルトの名無しさん
07/12/03 02:59:11
>>558
翻訳:
pがヌルポでどうしろっていうんだよ、バーカ。



566:デフォルトの名無しさん
07/12/03 07:54:14
俺バカなんで教えていただけませんか?

567:デフォルトの名無しさん
07/12/03 08:40:22
>>555
ヌルポなんて渡すんじゃねえ、"Go home!"ってことなんじゃないか?

いったん家に帰って、必要な初期化を見直せ。

568:デフォルトの名無しさん
07/12/03 09:13:03
というか技量にあってないんだと思うが
スレ違いかどうかすら判断できてないだろ

569:デフォルトの名無しさん
07/12/04 11:29:40
訳若芽

570:デフォルトの名無しさん
07/12/04 15:46:48
通信対戦ゲームのマッチングプログラムをperl/cgiで作っています。
cgiの中身は、掲示板のサンプルリストに毛の生えたような単純なもので、
何も無い部屋に登録すると、登録した人のIP、開放しているport番号を記録し、
そのクライアントはサーバー状態で接続を待ちます。
次に、他の人が登録してある部屋に入ると、登録してあったIPとport番号を
受け取り、サーバー状態で接続を待っている相手に、接続を試みるというものです。

実際作って、ちゃんと動いているのですが、そこでどうしても気になるのは、
登録しているIPとport番号を相手に受け渡す時で、やっぱり、
IPとport番号は暗号化して渡したほうがいいのでしょうか?
初心者向けのperlのCGIの本を読んでても、掲示板の作り方ぐらいで、
マッチングサーバの作り方については書かれていませんし、
同人ゲームのひぐらしデイブレイクの通信対戦では、堂々と掲示板に
自分のIPとport番号をさらしているので、それに比べれば、
目に見えない形でやり取りしているから、気にする必要は無いでしょうか?

ものすごい初歩的な質問かもしれませんが、よろしくお願いします。

571:デフォルトの名無しさん
07/12/04 16:15:24
>>570
途中の盗聴を気にしているのならsslとかを使った方が良いかも。
サーバやクライアント自身に相手のIPやPort番号を知られたくないわけじゃないよね。

572:デフォルトの名無しさん
07/12/04 16:28:02
鯖--倉A
 |
倉B
接続状態が鯖経由なら、暗号化うんぬんの前に、
相手のIP,Portを教える必要はない。

鯖  倉A
 /
倉B
接続状態が直結なら、
何をしようと相手のIP,Portが分かる。


573:デフォルトの名無しさん
07/12/04 17:25:15
>>570
Radiusで払い出せバーカw

574:デフォルトの名無しさん
07/12/04 18:27:48
マジ訳若布
ググりまくったけど訳若芽

初期化方法わかんね

575:デフォルトの名無しさん
07/12/04 23:01:27
>>570
変なポートでなければたいした問題ではないだろ

openSSlとか使い切れなかったら
IEコンポ経由でアクセスすると楽だよ

576:デフォルトの名無しさん
07/12/04 23:07:44
ごめん,質問
PROXYの情報取りたいんだけど最適な方法は?
レジストリに書かれている方でなく
PACファイル等のスクリプトの方
IEコンポかMFC?(.NET)
できたら WIN APIが助かる

577:デフォルトの名無しさん
07/12/05 09:06:14
IEだったら↓に自動構成スクリプトのアドレスが入ってる
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL

後は普通に読めばいいんでないの

578:デフォルトの名無しさん
07/12/05 16:42:41
ProxyServerは?

579:570
07/12/05 21:43:43
返答遅くなってすみません。
また、いろいろアドバイスしていただきありがとうございます。

SSlですが、自分のCGI参考書ではグラフィックカウンターを作る説明しかなく、
これでどう暗号化するか分かりません。
RadiusもWikipediaで調べましたが、自分の頭ではチンプンカンプンでした。

ゲーム自体は、クライアント同士をP2P通信でつなげて遊ぶもので、
ipとport番号のやり取りのマッチング部分だけ、webサーバ上の
cgiで、C/Sで行います。
p2p通信で、しかも、マッチングにCGIを使うので、クライアントにも、
webサーバにもIPやport番号は知られるのは当然なんですが、
よく「iPとport番号は知られるとまずい」とか、
「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、
webサーバから相手のIPとport番号の受け渡しのさい、暗号化する必要が
あるんじゃないかと思ったのです。

開放するport番号はプライベートport番号の間でなら各クライアントが
好きな番号を開放するようになっているので、49151番以前のportは
開くことはありません。>>575さんがいうように、
IPとport番号をそのまま受け渡しても、心配する必要は無いんでしょうか?

なんか文章が変ですみません。

580:デフォルトの名無しさん
07/12/05 22:21:21
なんでNULLが返されるんだぁああぁぁ!!!!
ひぇぇぇぇうぇぇええ!!!!
すみませんでした。
もういくら考えてもわかりません。
お願いします。この通りです!!!

581:デフォルトの名無しさん
07/12/05 22:38:20
SSI と SSL は違うよっ

582:デフォルトの名無しさん
07/12/05 23:18:57
暗号化する価値はほとんど無いな。

その手の奴がパケットの中身を見るまでもなく、
セキュリティソフト(ファイアウォール)が警告を出したりするから
一般人にだってIPとPortが分かるぞ。


583:デフォルトの名無しさん
07/12/06 00:06:44
というか、誰でもそのCGIを叩いたらIP:PORTがわかるわけで、
通信路を暗号化する価値がないような。

584:デフォルトの名無しさん
07/12/06 09:21:22
プロクシーサーバを作るとしたら、RFCの何番読めばいいんだっけ?

585:デフォルトの名無しさん
07/12/06 09:40:04
つ HTTP 1.1

586:デフォルトの名無しさん
07/12/06 14:27:33
>>584
rfc2616

587:デフォルトの名無しさん
07/12/07 05:05:39
Cで分割ダウンロードってどう実装すればおk?

わざわざパケット操作まで階層下らなきゃいけないのだろうか…。

588:デフォルトの名無しさん
07/12/07 05:45:37
WinならwinmmのHttpQueryReauestでも使ってろタコ
それ以外の環境ならsocket一手

589:デフォルトの名無しさん
07/12/07 05:45:59
wininetだたorz

590:デフォルトの名無しさん
07/12/07 07:49:23
>>588
> それ以外の環境ならsocket一手

libhttp, libcurl, libneon, libsoup 好きなのをどうぞ

591:デフォルトの名無しさん
07/12/07 11:31:31
>>590
UNIXだぜ。
socketをどうすればいいのか知りたいのだ><
ん?ひょっとしてlseekが効くのか…?試してないが…。

>588
libhttpにはそんな便利なAPIがあるのか…ぐぐってみるわ。
でもどうやって実装してるんだ?かなり低階層まで降りてそうだ。

592:デフォルトの名無しさん
07/12/07 13:00:47
httpの分割ダウンロードってrange指定したrequest並列に投げるだけだろ…

593:デフォルトの名無しさん
07/12/07 22:19:25
TCPのcwndとssthreshの値をみる方法ってない?
環境はfreebsdです

594:デフォルトの名無しさん
07/12/09 22:49:17
>>577
あんがと。だけどスクリプトの場合 Javascriptで
条件式とか入ってる場合があるから困る。
今はsocketでデーター出してるけど
素直に、NETかIEコンポのライブラリ経由でデーター
出した方がいいんだろうか・・・


595:デフォルトの名無しさん
07/12/09 22:55:02
>>579
>よく「iPとport番号は知られるとまずい」とか、
>「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、

うちは、こんな事言ってる奴が多いので実害がなくても
簡単なスクランブルかけてる。少なくともテキストが読めない程度の。


596:デフォルトの名無しさん
07/12/09 23:17:21
できあいの物を利用したお手軽マッチングサーバー~~
用意する物
■ WEBサーバー そこらのHP公開できるレンタルでOK
■ FTPクライアントライブラリ、MFC.デルファイでもOKです

1)ログイン時
自分のIDをファイル名にしたテキストファイルをFTPでアップします
テキストの内容は自分のIPとポート番号です
自分のグローバルは確認君系のCGIで調べます
好みにより書き込むテキストは適当にスクランブルしましょう

2)接続時
接続したいIDの名前のテキストファイルをダウンロードします。
NotFoundの場合は「該当するIDは・・・」とか適当に出します

追記
余裕があれば UPnPで使用ポートをオープンしましょう
UPnPはXML+Socketで行えばSP2のチェックマークを無視します

上級偏としてStunもありますが昨今使えませんので
ゲーム程度ですとSkypeを使うのも吉です

結論 SkypeP2P使え!!

597:デフォルトの名無しさん
07/12/12 23:29:14
va_argsってスレッドセーフ?

598:デフォルトの名無しさん
07/12/12 23:41:40
実質自動変数(引数)へのポインタという意味合いの代物だから、
スレッドセーフ。もちろん、そのまま他のスレッドに持って行ってはいけない。

で、どこがネットワークプログラミングなんだろ。

599:デフォルトの名無しさん
07/12/13 00:05:27
ポートを解放しないとできないことっていったい何なんですか?

600:599
07/12/13 00:28:07
なんか曖昧ですね。すいません。

例えば、htmlサーバーではポート80番は常に両方向解放されていて、
(他の問題がなければ)クライアントからのコネクションに成功しますよね。
クライアントのWAN→クライアント自身方向へのアクセスは許されていませんが、
サーバーにリクエストを送ることもその結果を処理しブラウザで表示することもできるわけです。
そこで質問なのですが、クライアントのWAN→クライアント自身方向への
アクセス解放(ポート解放)をしないとできないことというはいったい何なのでしょうか?

601:デフォルトの名無しさん
07/12/13 01:29:06
>ポートを解放しないとできないこと

LAN内のPCのポートとルータのWAN側ポートが関連付けられてないから

WAN側からの接続を受け付けられない

602:デフォルトの名無しさん
07/12/13 05:39:29
>>600
FTPのPORTモードとか

603:デフォルトの名無しさん
07/12/13 09:35:00
ってか自分で言ってるじゃねえか

ポートが開いてないとApatch起動しても外からアクセスできない

604:デフォルトの名無しさん
07/12/13 09:57:50
Apacheはサーバーなので質問の主旨とは外れます

605:デフォルトの名無しさん
07/12/13 10:39:33
>>600
クライアントのWAN→クライアント自身方向への接続ができない

606:デフォルトの名無しさん
07/12/13 16:14:08
>>601-605
TCPならクライアントへのconnectに失敗、
UDPだとsendに失敗(?)ということですか。
サンクスです。

607:デフォルトの名無しさん
07/12/13 18:25:34
ちげえええええええええええええええええええ

connectすんのはクライアント側だ
サーバはacceptだ
UDPならrecvfromだ

根本的にソケット関係のマニュアル読み直した方がいい

608:デフォルトの名無しさん
07/12/13 18:49:39
たぶんクライアントの定義が違うんだよ

609:デフォルトの名無しさん
07/12/13 18:50:56
>>607
「クライアントがWAN側からの接続を受け付けられない」ということは、
サーバーがクライアントに対してconnectするときに失敗するという意味ではないのですか?

610:デフォルトの名無しさん
07/12/13 18:53:38
OK。落ち着け
ネットワークプログラミングにおいて

「クライアント」は「接続しに行く側」
「サーバ」は「接続を受け付ける側」

だから

611:デフォルトの名無しさん
07/12/13 21:02:51
>>609
あなたのサーバとクライアントの定義をききたいよ

612:デフォルトの名無しさん
07/12/14 02:26:33
UDP は受け取る側がクライアント、というプロトコルも多いな・・
RTP とか

613:デフォルトの名無しさん
07/12/14 08:29:38
>>611
俺は>>609ではないが、
・LAN内のPC → クライアント
・WAN側のPC → サーバー
だったりしてな。

614:デフォルトの名無しさん
07/12/14 16:44:41
>>610,611,613
自分の解釈では
 ・サーバーはサービスを提供する側
 ・クライアントはサービスを享受する側
ですね。
ただ元の質問は、
「サーバーのポートが解放されていてクライアントがポート0の場合、何かできないことがあるのか?」
というものなので、ここではこの文脈にそって言葉を使っています。

615:デフォルトの名無しさん
07/12/15 00:42:20
元の質問ってそんなのだっけか?
というかクライアントなのに自分でポートを開けておく必要なんて無いよな
サービスを提供するためにポートを開けておくわけだし

616:デフォルトの名無しさん
07/12/15 23:39:10
クライアントからport80で接続されているときに
そのconnectionを使って逆にサーバー側から
クライアントに突撃する方法を聞いてるんじゃない?


617:デフォルトの名無しさん
07/12/16 22:15:21
たんにP2Pの存在をしらないんじゃ?

618:デフォルトの名無しさん
07/12/17 04:14:29
sshでトンネル作ってport forwardingしたらなんでもやり放題だお

619:デフォルトの名無しさん
07/12/19 10:14:58
netstatなんかで見れるような ソケットの
現在のステータス(ESTABLISHEDとかTIME_WAITとか)
って、getsockoptでどうやって取得するの?

620:デフォルトの名無しさん
07/12/19 14:58:25
>>619
connectしてるかどうかくらいはわかるけど、普通見れない。
netstatは(setuidされていて)kmem見てたり、/proc/net/ 見てたりしてるだけ。

621:デフォルトの名無しさん
07/12/19 22:00:37
epollやkqueueはなぜ高速なのか、レガシなAPIとの比較で3行で教えてください。
特にepollに興味があります。

622:デフォルトの名無しさん
07/12/19 22:58:25
/dev/poll を忘れんなよ

623:デフォルトの名無しさん
07/12/19 23:21:11
要するに状態を監視したいソケット連中ってのは、selectの呼び出し毎に
大きくかわったりはしない。なら、引数でソケット全部を毎回渡すよりも、
ハンドル経由で差分更新したほうが、処理は高速になるって話。

624:デフォルトの名無しさん
07/12/19 23:23:20
計算量で語ってほしい

625:デフォルトの名無しさん
07/12/20 00:15:53
selectなら o(n)
epolなら o(1)
ってことだろおうぉあ

626:デフォルトの名無しさん
07/12/20 00:22:49
実際は、イベント発生頻度Mにも比例するから、
selectはO(N*M)になる、のかなー?
epoll系はO(M)で。

627:デフォルトの名無しさん
07/12/20 00:23:27
>>623
621とは別人です。
10行になっても良いので馬鹿にもわかるようにお願いしますm(_ _)m
「大きくかわる(大きい?小さい?)」「ハンドル経由(ハンドル?)」がわかりません

628:デフォルトの名無しさん
07/12/20 00:27:48
klabという会社の勉強会資料が読みやすかったような記憶。

/dev/pollってなんだ?

629:デフォルトの名無しさん
07/12/20 00:29:30
そらりすのやつじゃねーの。/dev/poll。

だいたいこのペーパー読めばいいんでね。まあ、英語読めないオチだろうけど。
URLリンク(people.freebsd.org)

630:デフォルトの名無しさん
07/12/20 01:27:08
>>626
それMは定数扱いでいいですやん

631:デフォルトの名無しさん
07/12/22 02:23:52
京急の特急に乗ればいいことが解った

632:デフォルトの名無しさん
07/12/22 23:54:42
URLリンク(winsock2.org)

ローカルホスト上のデータを最大で16000byteずつしか読み取れないんですが、これはなぜですかね?

633:デフォルトの名無しさん
07/12/23 00:07:42
>>632
たぶんTransfer-Encoding: chunked

634:デフォルトの名無しさん
07/12/23 00:23:33
HTTPじゃないから、chunkedは関係ない。
どっちかってーと、MTUの話。
というか、ローカルだろうと、TCP経由で
一度に全部読めると思うのが間違い。

635:デフォルトの名無しさん
07/12/23 00:26:04
なんだそうか

636:デフォルトの名無しさん
07/12/23 04:16:30
頭痛いわ


637:デフォルトの名無しさん
07/12/23 04:25:19
つ バファリン

638:デフォルトの名無しさん
07/12/23 11:33:52
股間が疼くわ


639:デフォルトの名無しさん
07/12/23 11:40:07
つ クラビット

640:デフォルトの名無しさん
07/12/23 20:44:13
Winsockを使い
URLリンク(localhost)
URLリンク(localhost)
一つのアプリケーションが
この二つのURLのダウンロードを並列に処理する事は可能ですか?

641:デフォルトの名無しさん
07/12/23 21:03:34
可能です
マルチスレッドとかノンブロッキングとかIOCPとか調べるよろし

642:デフォルトの名無しさん
07/12/23 21:46:05
ありがとうございます。

643:デフォルトの名無しさん
07/12/24 00:35:48
非同期モードと非ブロッキングモードはどう違うのですか?

644:デフォルトの名無しさん
07/12/24 00:51:00
まずお前がその二つをどう理解しているかを述べよ

645:デフォルトの名無しさん
07/12/24 01:17:50
たとえば読み込み指令を出して、そのときには読むべきデータが無かったとしたら、
ノンブロッキングはすぐに諦めて帰ってくる。
非同期は何かが読めるまでバックグランドでがんばってくれる
みたいな違い。

646:デフォルトの名無しさん
07/12/24 01:37:02
その理解でいいんじゃない? 順序としては
 ブロッキング → ノンブロッキング → 非同期I/O
と進んできたんだけど
これ以上詳しく知りたければ実装を調べるしかないのではないかと

647:デフォルトの名無しさん
07/12/24 07:03:17
リクエストとリプライが同時でない=同期的でないのが非同期。
リクエストを出した後、リプライは後から別の手段で得る。
一対一に対応してないこともある。リプライが続々とやってくるなど。

ノンブロッキングは同期的だけど、データ取得を諦めることがある。
その時でも「データねーよ」とのリプライが同期的に得られる。
非同期はそうではない。


648:デフォルトの名無しさん
07/12/24 11:57:28
使い分けで
同期-ブロッキング
多重化-ノンブロッキング(select or poll)
非同期-シグナル駆動I/O or 非同期I/O
とあったのですが、
これで合っていますでしょうか?

649:デフォルトの名無しさん
07/12/24 12:05:17
>>648
> 非同期-シグナル駆動I/O or 非同期I/O

も多重化出来るだろ。

650:デフォルトの名無しさん
07/12/24 15:49:15
たじゅーか!
と書くとほほえましいな

651:デフォルトの名無しさん
07/12/24 20:32:06
Linuxでクライアント書いてるんだけど
closeが完全に終わるまで待つにはどうしたらいいかわかんないので
誰か教えれ

652:デフォルトの名無しさん
07/12/24 20:45:11
shutdownで半クローズ → 相手にEOFが届く → 相手がソケットを閉じる → EOFが来る → こっちも閉じる
とかじゃだめなん?

653:デフォルトの名無しさん
07/12/24 21:30:05
>>652
だめじゃない!だめじゃないぞ!いける!

654:デフォルトの名無しさん
07/12/24 22:43:09
それはさ、こっちの最後の送信結果が、closeしちゃうと判らなくなるからで、
別にこっちが送信してないなら勝手にcloseして終わりにしたらいいじゃん。

655:デフォルトの名無しさん
07/12/25 14:18:46
非同期モード、非同期イベントを利用して
localhost上のバイナリファイルをダウンロードしようとしているのですが、
ブロッキングを起こしてしまいます。

非同期モードを解説したサイト等ありましたら、
教えてほしいです。

656:デフォルトの名無しさん
07/12/25 14:54:45
DNA.TV⇒デジネイション.テレビジョン⇒ステージ.オン.エアー <IE7テストバージョン>
URLリンク(dnatv.atspace.com)

657:デフォルトの名無しさん
07/12/25 18:23:18
WSAAsyncSelectでググったらいくらでも出てくるじゃねぇか

658:デフォルトの名無しさん
07/12/25 18:24:13 BE:295671825-2BP(312)
ここは書き込めるようだな

659:デフォルトの名無しさん
07/12/25 18:26:49
というか、その「ブロックを起こす」コードを晒してみたら?

660:デフォルトの名無しさん
07/12/25 19:31:54
自己解決しました。
ありがとうございます!!

661:デフォルトの名無しさん
07/12/25 19:45:33
どういたしまして

662:デフォルトの名無しさん
07/12/25 23:27:54
ARCNETは、スレ違いですか?


663:デフォルトの名無しさん
07/12/26 00:02:00
いいや、違わない
なんなら422でもCANでも構わない

664:デフォルトの名無しさん
07/12/26 16:02:49
URLリンク(winsock2.org)
このような非同期通知を利用して、アプリケーションを作成しているのですが、
こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
どのようにしたらできますでしょうか?

665:デフォルトの名無しさん
07/12/26 16:47:16
>>664
>こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、
できません。それが非同期処理。
キューなりリストにPOSTするデータを入れておいて、
FD_WRITEが取れたら書き込む。エラー処理も忘れずに。

どうしてもforでまわしたいなら、
スレッド分けて、WSAGETSELECTEVENTするスレッドで、FD_WRITEがきたら、
イベントをセットし、POSTするスレッドのfor内でそのイベントをWaitForSingleObjectするとか。
でも、それなら最初から同期処理で良い。

666:デフォルトの名無しさん
07/12/26 21:10:08
とりあえず、-1がもどってくるまでは無条件に書き込めばいいんでないの。

667:デフォルトの名無しさん
07/12/31 15:59:49
教えてください。

サーバソケットでTCPの10~100バイトの可変長データを受信する際、
そのデータのレングスが先頭2バイトにある識別子で判断できる場合って

・まず先頭2バイトをrecvする。
・識別子を判断して残りのバイト数をrecvする

というのが一般的なのでしょうか?

recvの第3引数に1500バイトくらいの十分余裕な値を指定すると
勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか?

要は連続してデータが飛んでくる場合に
1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが
知りたいです。

Linux環境です。

668:デフォルトの名無しさん
07/12/31 16:42:47
読みたいなら読めばいい。場合によっては、区切りを検出してくれることもある。
ただ、「1500バイトrecvをかけて、1400バイト読んだ。ヘッダのレングスは500バイトだったよ~」
ってときもあるから、500処理したあとに次のヘッダ処置にいかないとダメだし、
その逆の、「ヘッダは500バイトあるっていったけど、recvで戻ってきたのは200バイトだった」
って言う場合の処置もいる。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch