ネットワークプログラミング相談室 Port27at TECH
ネットワークプログラミング相談室 Port27 - 暇つぶし2ch22:デフォルトの名無しさん
10/12/31 13:06:10
winsockの非同期通信で1台のパソコンで通信のプログラムを作っています
送信側と受信側では同じサイズと間隔で送受信しています

送受信するサイズは4MBで、送信側は4MB送信できてますが
受信側は4MB受信しないで最後のrecvが0を返して終了します。

受信側でデータが無くなることは実際ありえるのでしょうか?
ちなみに毎回決まったサイズ受信して終了します。

23:デフォルトの名無しさん
10/12/31 13:30:44
>>22
>送信側は4MB送信できてますが
ちゃんと戻り値を確認してのこと?

24:22
10/12/31 13:39:22
>>23
sendの戻り値は確認しています。

25:デフォルトの名無しさん
10/12/31 13:43:39
ちょっと連絡が来ないからといって破局と決定するのはどうかと

26:デフォルトの名無しさん
10/12/31 13:53:32
>>25
普通どれくらい待つのでしょうか?
recvが最後に0を返しても送信サイズと受信サイズが一致しないとループし続けるように
コーディングしましたが、1分ぐらい延々とrecvが0を返し続けました。

27:22
10/12/31 15:05:44
受信データを少し調べてみたら
途中のデータが欠損しているようです。
最後に特定の文字列を送信してそれは受信できていました。

28:22
10/12/31 15:38:36
結局原因は分からなかったのですが、最初のデータが欠損していましたので
最初のデータを送信する前に1秒Sleepすると問題なく送受信できました。

29:デフォルトの名無しさん
10/12/31 15:53:04
>>22,28
なんか根本的に間違っていると思う。
やっているのは「非同期通信」なんだろ?
その場合、情報が常に必ず届くという保証がwinsock自体にない。
だから、届かなくてもいいような仕組みを持った通信経路を設計する。
これには色々ある。今の考え方では、すぐに行き詰まると思われ。

30:22
10/12/31 16:06:38
>>29
申し訳ない
同期通信の間違いでした。
TCP/IP自体データが保障されていると思ってたんだけど
違うのでしょうか?

31:デフォルトの名無しさん
10/12/31 16:15:04
>>30
同期通信なら、保証されるが、それはバグがない場合だ。
何かがバグってるな。

32:デフォルトの名無しさん
10/12/31 16:15:06
あなたはここで質問するレベルですらないので
>>1のリンクのサイトや本を見てからにしてください

33:デフォルトの名無しさん
10/12/31 20:02:48
??到達性に同期も非同期も関係ないだろ?

34:デフォルトの名無しさん
10/12/31 20:32:45
>>22
TCPなのかUDPなのか書け。
#UDPな悪寒。

35:デフォルトの名無しさん
11/01/01 09:45:33
逆。
メッセージ境界が保証されていないTCPで、メッセージ境界が保存されて
いると仮定してプログラミングしてるんだろ。

36:デフォルトの名無しさん
11/01/01 13:50:32
>>24で戻り値は確認していると言っているからおれはないと思うが。
ただSOCKET_ERRORかどうかしか見てなくて、実際に受信バイト数までは確認していないってことか?

37:デフォルトの名無しさん
11/01/01 14:31:53
>>36 Unixでも初心者に良くいるよ、こうかくやつは…

if (recv(sock, buff, BUFF_SIZE, 0) == -1) {
/* エラー処理 */
}
/* BUFF_SIZE 受信したつもりになりきって buff の処理 */


38:22
11/01/01 17:02:14
>>34
TCPです
UDPは信頼性がなさそうなので

39:デフォルトの名無しさん
11/01/01 17:26:17
>>36
sendの戻り値でどうやって受信バイト数を取得すんだよ。

40:デフォルトの名無しさん
11/01/01 17:27:39
>>38
で、
n=send(sock,buff, BUFF_SIZE, 0);
n=recv(sock, buff, BUFF_SIZE, 0);

いずれもBUFF_SIZEまで送信受信できているとは限らない。
n がSOCKET_ERRORではない場合、n は実際に送信受信したバイト数になっているが、
その n の値もしっかり反映しているの?

それと、SOCKET_ERROR の場合は終了しているようなので関係ないが
送信受信において SOCKET_ERRORが戻ってきた場合のWSAGetLastError() の戻り値も確認する。
WSAEWOULDBLOCK が戻ってきてれば終了するのではなく、またループに戻るようにする。

41:デフォルトの名無しさん
11/01/01 18:25:38
>>40
sendとrecvの戻り値は確認しています。
戻り値が0より大きい場合にその戻り値をlenとしてmemcpyするように
しています。

WSAEWOULDBLOCKについては知りませんでした。
ご指摘ありがとうございます。

42:デフォルトの名無しさん
11/01/03 08:57:41
TCP/IP通信でWSAAsyncSelectを使って非同期通信をしています。
データを適当なバイト数送るとします。
受信側がそのうち200バイトしか受信できなかったとします。
受信できるまでrecvループしようとしましたが、その間はそこで処理が
止まってしまうので、ウィンドウが固まってしまいます。
なので、一度だけ受信した後、一旦受信処理ルーチンを抜け、
また再度FD_READメッセージを待ちます。
そこで受信できなかった分を受信し、先ほど受信したデータの後ろにMEMCPYでデータを
くっつけようとします
そのためには先ほど受信したデータのバイト数を記録しておく必要があると思います。
さらに、相手は何バイトデータを送ってくるかわかりません。
この場合、まずデータが何バイト送ってきたのかを記録しとくところまではできますが、
何バイトまで受信すればよいのかわかりません。
単純にrecvがsocket_errorを返し、WSAEWOULDBLOCKを返したときが受信データは全て
受信し終わったと判断してよいでしょうか。

43:デフォルトの名無しさん
11/01/03 09:08:10
普通は送られてくるデータの先頭あたりにデータ長の情報が含まれる
それをヘッダと言うことが多い
どういう形の書式にするかとかを決めるのがぷろところろろr

44:デフォルトの名無しさん
11/01/03 09:13:49
ヘッダを作って、最初にその数バイトだけ読んでデータの大きさを調べて、
その分だけ受信するってことですか。
いろんなプロトコルがありますが、データサイズだけわかればなんとかなりそうなので、
自分独自のヘッダでも構わないんですよね?

45:デフォルトの名無しさん
11/01/03 09:32:44
馬鹿の考え休むに似たり

46:デフォルトの名無しさん
11/01/03 09:41:10
どうにかするわ

47:デフォルトの名無しさん
11/01/03 10:19:17
一度、標準入出力で書いてみりゃ良いのに…
ストリーム故、同じ思考にいきつくと思うが (fgets はそうでもないか)

48:デフォルトの名無しさん
11/01/03 12:02:21
>>44
データ長があらかじめ判らないときには
データ末尾に終了符号をつけることもある


49:デフォルトの名無しさん
11/01/03 12:03:40
その場合データ中に終了符号と同じデータを含めることは出来ない

50:デフォルトの名無しさん
11/01/03 12:05:41
こういうのデザパタで何て言うんだっけ?

51:デフォルトの名無しさん
11/01/03 12:26:40
改行区切りパターン(いま考えた)

52:デフォルトの名無しさん
11/01/03 17:33:34
皆さんありがとうございます。とにかくやってみます!

53:デフォルトの名無しさん
11/01/03 22:22:32
まとめてやるんじゃなくて、1バイト毎にやったほうがいい時もある。

54:デフォルトの名無しさん
11/01/03 23:24:57
なにいってんだおまえ

55:デフォルトの名無しさん
11/01/04 06:45:51
>>48
ダサい設計だけど、HTTP1.0のようにデータの最後まで送ったら
ソケットを閉じるという方法もある。

56:デフォルトの名無しさん
11/01/04 07:41:37
別にださくないんじゃね、 ftp もそうだけど…


57:デフォルトの名無しさん
11/01/04 18:57:17
>>33
亀レスだが、非同期通信に到達性を保証する事は出来ないと思うのだが。
その点について俺が間違っているの教えてくれ。
まず第一に、非同期通信経路上位でのプロトコルによる同期は除いてくれ。
単純に非同期通信経路で、受信側がいつまでたってもデーターはこなかったとしよう。
その場合いつかはタイムアイトになり情報が所か無かったとしよう。
送信側は送信しているので、それが届いたかどうかは感知できない。
この場合どう考えても、情報の到達性を保証する事は出来ない。
ではないのか?

58:デフォルトの名無しさん
11/01/04 20:24:46
>>57
何を勘違いしてるのか分からないけど、あの文脈では同期/非同期
はAPIのモードの話で
 同期:ブロッキング
 非同期:ノン・ブロッキング
でしょ?
それともブロッキングのsend成功=到達とでも思ってるとか?

59:デフォルトの名無しさん
11/01/04 20:39:24
なんだ、ノン・ブロッキングの事を言っているのか、がっかりだな。
それを非同期の代名詞にして話す事自体がっかりだよ。あきれた

60:デフォルトの名無しさん
11/01/04 20:48:37
じゃあどういう意味の”非同期通信”ならTCPで到達性が保証できなく
なるのかな?
昔の非同期モデム使ったPPP回線でも(TCPの意味での)到達性は保証
されているのだが。

61:デフォルトの名無しさん
11/01/04 20:52:45
それにブロッキング /ノン・ブロッキング を同期/非同期って
表現するのはごく普通に行われているよ。
なにせWinSockのAPI名がWSAAsyncSelectとかだし。

62:デフォルトの名無しさん
11/01/04 20:56:59
>>61
それMSの表現が馬鹿なだけw
だけど、 TCP 使って非同期な通信系ってのはどうゆう意味か説明してほしいな >59


63:デフォルトの名無しさん
11/01/04 23:11:56
非同期通信
非同期型API
がごっちゃになってる?

64:デフォルトの名無しさん
11/01/05 00:25:14
言葉の定義の問題だから、おまえの中では非同期でいいんじゃない。
まあ、あまり大声で言わない方がいいと思うがwww。
それに、がっかりしたのも事実だし。言葉の定義はそれでもいいんじゃい。

65:デフォルトの名無しさん
11/01/05 00:32:52
参考までに、IT辞書のノンブロッキングの説明部分を張っとく。

通信相手との同期を取らない点では一種の非同期通信といえるが、いわゆる非同期通信が
単に通信相手からの返事を待たない(同期を取らない)というニュアンスであるのに対し、
ノンブロッキング通信では主に、通信処理の完了を待つことによって他の処理の進行を妨げな
いことを表わしている。



66:62
11/01/05 00:54:39
>>63 おれ?
TCP ってのは、 end-end 閉じてないとだめなプロトコルなのね

で、少なくとも、
syn -> syn/ack -> ack
で、コネクションつくって、 こんなやりとりするでしょ?
[data]/ack <-> [data]/ack
この状態が、成立してる限りにおいては同期処理系なのよ

つか、state-fullなプロトコルってのは、どこかで同期する必要があるのは当たり前

もっと上のところでやるのはあんたらの勝手だけど、どの部分指して言ってるの?
ってのが 62 の主旨


67:デフォルトの名無しさん
11/01/05 01:37:50
上位のAPIの動きで話が進むんだよね。
TCPの実際の動作がわかってない感じだから、どう言っていいのやら...

68:デフォルトの名無しさん
11/01/05 09:43:14
>>66
たとえば、HTTP/1.1は非同期。
レスポンスが返ってくる前に、リクエストを投げることができる。非同期だろ。

発端の>>22の「非同期」はWinsockの非同期系APIを指しているのだろうけど。

69:デフォルトの名無しさん
11/01/05 14:02:26
>>65
その説明書いた人良く分かってない感じ。
socket APIのブロッキングモードのsendは送信バッファに空きが
出来れば復帰するのであって、通信処理が完了するかどうかとは
関係ない。


70:デフォルトの名無しさん
11/01/05 14:06:08
チャット作ってます。
非同期通信をして、文字だけのやりとりはできるようになりました。
ですが、ユーザごとに名前をつけれてません。
名前付けたいんですが、名前のデータは文字のバッファに含めて送信すべきでしょうか?
それとも名前は名前だけで送ったあとに、後から文字のバッファを送るほうが都合がいいでしょうか?

今はクライアント→サーバにメッセージを送ったら、
サーバから、サーバに接続しているクライアント全てにそのメッセージを送信し、
リアルタイムチャットを作ろうとしているところです。

71:デフォルトの名無しさん
11/01/05 14:42:28
この流れで「非同期通信」の質問は釣りにしか見えない。

72:デフォルトの名無しさん
11/01/05 14:54:11
>>69
じゃ、そこまできちっとしたら、ブロッキングモードの通信も非同期だなwwwww
腹抱えて笑うぜwwwwwwwwwwwwwwwww

73:デフォルトの名無しさん
11/01/05 15:43:18
>>72
非同期で笑え

74:デフォルトの名無しさん
11/01/06 14:04:05
Winsock2 : UDP : 鯖側
addr は INET_ANY で create & bind -- (*)
WSAAsyncSelect FD_READ でパケ待ち
パケ到着なFD_READをきっかけに recv & 内部処理開始
内部処理後の応答を パケ送信したピアへ戻したい...

(*)のソケットに write ではうまくいかず

75:デフォルトの名無しさん
11/01/06 15:08:25
なぜwrite?
recvfromとsendtoを使え

76:デフォルトの名無しさん
11/01/06 15:16:45
あ。 単純ミスorz
recvfrom の末尾で ピアのアドレス受けとれるし…

77:デフォルトの名無しさん
11/01/09 06:03:35
新スレに今気づいた俺が横からレス
>>58 >>62 どっちとも俺の解釈と違う(と思う)。

まだデータが到着してないときにrecvした場合、
データが来るまで関数が返ってこないのがブロッキング。(1)
関数が返ってきて「まだない」と言われるのがノンブロッキング。(2)

データが到着したことがわかった後で、カーネルに「俺のバッファにコピーしる」
と要求したら、コピー完了後に返ってくるのが同期。(3)
コピー完了前に帰ってきて、コピー完了が別に通知されるのが非同期。(4)

と思ってる。
unixしか知らないひとがよく非同期と誤解してるのが(2)
MSが言ってる非同期は(4)

でないかな?

78:デフォルトの名無しさん
11/01/09 06:09:27
すまん誤解は言いすぎだ

用語の使い方がずれてんだよ、WindowsとUnixは。

79:デフォルトの名無しさん
11/01/09 06:11:24 BE:1862599474-2BP(0)
適したスレがぱっと見当たらなかったのでここで質問させてください

今迄画像処理関連のプログラムばかりやってきて
4月からネットワークプログラムの仕事になりそうなんで
異動前に勉強したいんだが
ネットワークプログラムする以前にネットワークに関する知識(スイッチングハブの知識、ネットワークの構成・設計、セキュリティetc)が無い
何かオススメの本あったら教えて

80:デフォルトの名無しさん
11/01/09 06:16:21
もう一個補足。Unix(Posix.1)で
recv, send は「非同期I/O」とは呼ばない。

「非同期I/O」は
aio_read, aio_write のこと。

aio_readなんて誰も使ってないだろうけど、
Windowsで言ってる非同期はまさにaio_xxxなんだぜ

81:デフォルトの名無しさん
11/01/09 08:27:05
>>80
わかた
ごちそうさま

82:デフォルトの名無しさん
11/01/09 09:44:33
>>77,80
良レスだが、自分の解釈とも異なっている。(もちろん>>58,62とも違う)
>>77の例であれば、どちらも同期(という総称的な概念を指す用語)の一種であり、
それらの違いは「データ到着」と「コピー完了」というイベント種別の違いでしかない、いうのが自分の解釈。
ブロッキングは同期(という目的)を実現する手段であり、両者を同列に比較/分類する事は無意味であると思う。
まとめると、>>77の(1)と(2)は同じだが、(3)はブロッキングモードのrecvであり、(4)はノンブロッキングモードの
非同期recvであり、さらに(3')としてノンブロッキングモードの同期recvが加わる。

Unixであれば、read/write/recv/sendは、どれもブロッキングモード/ノンブロッキングモードのどちらでも
操作を実行できる。ただしノンブロッキングモードの場合、データ未着/コピー未完であればアプリ側で定期的に
リトライしなければならないという(性能上の)問題があるため、必然的にブロッキングモードを使わざるをえなかった。
この課題を解決する為に考案(追加)されたのが、aio_read/aio_writeと呼ばれる、いわゆるAIO(非同期I/O)という仕掛け。
ちなみにLinuxのAIO実装の場合、ソケットに対するAIOはサポートされていないから、aio_recv/aio_sendという
システムコールは(まだ)存在していない(はず....)。

83:デフォルトの名無しさん
11/01/09 11:11:55
>>82
お前が正しい
正義はお前にある

84:デフォルトの名無しさん
11/01/09 13:05:50
>79
URLリンク(www.amazon.co.jp)

85:デフォルトの名無しさん
11/01/09 13:49:29
URLリンク(www.amazon.co.jp)

86:デフォルトの名無しさん
11/01/09 18:03:43
>さらに(3')としてノンブロッキングモードの同期recvが加わる。

だな。
そのノンブロッキングの同期が一番おいしいのに
そこを飛び越えてしまったのがWinsock2

87:デフォルトの名無しさん
11/01/09 23:02:25
ふつーIO完了ポート

88:デフォルトの名無しさん
11/01/11 00:22:22
何で非同期IOの方が効率がいいっていわれてんの?

89:デフォルトの名無しさん
11/01/11 06:59:47
待たなくていいから待ってる間に他のことが出来る

90:デフォルトの名無しさん
11/01/11 16:53:41
インタラクティブなアプレットをなにか作らないといけないのですが、誰か助けてください


91:デフォルトの名無しさん
11/01/11 17:13:52
おせちアプレットでも作ってください。

92:デフォルトの名無しさん
11/01/11 17:35:06
重箱におせちを詰めるゲームか

93:デフォルトの名無しさん
11/01/11 17:51:00
ボリュームが足りないくらいがちょうどいい

94:デフォルトの名無しさん
11/01/12 08:46:27 BE:1197386429-2BP(0)
>>84,>>85
レスありがとうございます。
スレ違いにも関わらず…助かります。

95:デフォルトの名無しさん
11/01/15 01:41:47
IPv6 そろそろ端末側も本格対応が必要なのかな
なんかITProの記事では、v4アドレスが2011年2月に
枯れるとか言ってるんだがホント?

96:デフォルトの名無しさん
11/01/15 04:46:13
去年10月の時点で残り7ブロックとかそういう話でしょ。
それまでのペースを維持すれば、当然3月くらいまでに無くなるよ。

97:デフォルトの名無しさん
11/01/15 04:57:00
とりあえず拾ってみた。
URLリンク(www.geekpage.jp)
URLリンク(journal.mycom.co.jp)

アジア地域だと、本当に再来年あたりから
新規v4は無くなる可能性があるみたいね。
v6Readyはもう必須かもしれない。

98:デフォルトの名無しさん
11/01/18 14:47:48
HTTPプロトコルで
Accept-Encoding: gzip
Range: bytes=41318-
として、順次差分をダウンロードしたいのですが
gzip圧縮された差分がgzipのヘッダー情報を含んでいるらしく
レスポンスのContent-Lengthと食い違いが生じてしまいます

この場合の定番の書き方はどうなっているのでしょうか?
それとも差分ダウンロードと圧縮は同時に使用しないものなのでしょうか?

99:デフォルトの名無しさん
11/01/18 14:53:31
> gzip圧縮された差分がgzipのヘッダー情報を含んでいるらしく
> レスポンスのContent-Lengthと食い違いが生じてしまいます
ダウンロードした圧縮差分を順次つなげていっても
元のgzipファイルにならないという意味です。念のため

100:デフォルトの名無しさん
11/01/18 15:05:42
HyperText Transfer Protocolプロトコルですか。
馬から落馬しそうですね。

101:デフォルトの名無しさん
11/01/18 15:12:41
何を転送しようとして何を期待して実際どうなったのかさっぱりわからん・・・

102:デフォルトの名無しさん
11/01/18 15:14:44
単に複数レスポンスをそのままファイルマージしちゃっただけのような
1レスポンス→unzip→マージ じゃないのかなぁ…

103:デフォルトの名無しさん
11/01/18 15:45:14
リソース本体 - CTE: gzip 処理 - 部分抜き出し(こいつの大きさが CL) - ヘッダ追加 の順を期待してた
流れてきてるのは
リソース本体 - 部分抜き出し - CTE: gzip 処理(こいつの大きさが CL) - ヘッダ追加 の順だった

プロトコルとして正しいのはどっちかは知らない

104:デフォルトの名無しさん
11/01/18 16:59:52
すいません、説明が悪かったです
やりたいことは2chのスレッドのダウンロードです
最初はAccept-Encoding: gzip、Rangeでダウンロードして展開したファイルのサイズを渡していたのですが、
416 Requested Range Not Satisfiableが着てしまってダメでした。

gzipの位置ではないかと推測して、
今度はダウンロードしたgzipのサイズを渡して、差分のダウンロード自体は成功したのですが、
展開すると、一番最初にダウンロードしたブロックしか展開されません。
ファイルの残りの部分は無視されてしまいます。

ここまでやって混乱してきたのでご相談に上がった次第です
よろしくお願いいたします

105:デフォルトの名無しさん
11/01/18 18:39:01
差分DLに成功して最初にDLしたブロックしか展開できないの意味が分からないけど、

rangeの書き方あってる?
結合してないよね?

106:デフォルトの名無しさん
11/01/18 19:15:36
>>105
Rangeはこんな感じです
Range: bytes=104672-

gzipファイルが15kで展開したファイルが10kになっていたり、
差分を元ファイルに結合していっても最初の10k分しか展開されません
Rangeには保存したgzipファイルのファイルサイズを渡しているのですが・・・

107:デフォルトの名無しさん
11/01/18 20:13:03
gzipを直接結合する事はできませんよ
一度展開したもの同士を結合して再圧縮する事はできます

1、まずgzip ,no-rangeでリクエスト
gzipのサイズをメモ
gzipを展開して処理

2、gzip ,range:gzipのサイズ-でリクエスト(304以外なら)
gzipのサイズをメモ、1のgzipサイズを足す
gzipを展開して処理

3、gzip range: gzipのサイズ(1+2)でリクエスト(304以外なら)
以下略

108:デフォルトの名無しさん
11/01/19 04:53:42
>>107

451. デフォルトの名無しさん [sage] 2006/05/26(金) 19:44:35
Content-RangeとAccept-Encoding:gzipを同時に指定すると、
httpの意味上からは、「gzip済みのdatファイル」の途中から
しか送ってくれないので役に立たない。

109:デフォルトの名無しさん
11/01/19 10:01:58
Transfer-Encoding使えばいいんじゃね

110:デフォルトの名無しさん
11/01/19 21:21:20
ごめん、確かによく考えたら共存できないな
物理的に圧縮アルゴリズムから全体圧縮済みサイズと一部圧縮が、非圧縮時の比例と一致するとは限らないな

111:デフォルトの名無しさん
11/01/20 18:04:09
>>106です。レスありがとうございました

>>107,108
いろいろやってみましたが、
Content-RangeとAccept-Encoding:gzipは共存できないみたいです
初回だけgipにすることにしました

>>109
ちょっと見てみましたが難しくてよくわかりませんでした
余裕ができたら調べてみようと思います

112:デフォルトの名無しさん
11/02/02 02:25:46
>>95-97
URLリンク(headlines.yahoo.co.jp)
IANAが最後の割り当て終了。
あとは5ブロックを配布するのみ。

各地域の再分配が終わったら
IPv4の割り当ては事実上終了。
あとは再利用のみ。

113:デフォルトの名無しさん
11/02/02 07:25:45
>>112
補足。
本日、IANAから共同発表の記者会見予定。
URLリンク(itpro.nikkeibp.co.jp)

114:デフォルトの名無しさん
11/02/03 01:02:29
禿から取り上げるべき。

115:デフォルトの名無しさん
11/02/03 21:33:02
親機ルーターだけだったのを、PCを1台追加して、無線で子機ルーターを接続しました。
すると、今まで出来ていた、WinSockの関数では、接続できなくなりました。
どのように回避すればいいのでしょうか?
お知恵を貸してください。

116:デフォルトの名無しさん
11/02/03 21:39:53
俺のエスパーによれば、子ルータをアクセスポイントモードに設定するといいらしいよ

117:デフォルトの名無しさん
11/02/04 19:32:34
>>116
回答ありがとうございます。
アクセスポイントモードってプログラミングで出来ます?
ググってみると、何か・・・違うことのような気がして・・・

118:デフォルトの名無しさん
11/02/04 23:06:24
まぁエスパー回答だから外れることもある、仕方ない
ちゃんと判断するには情報が足りない
ネットワークの構成図を書いて、どこからどこへ接続したいのかとかを説明するべき

119:デフォルトの名無しさん
11/02/05 23:05:07
>>118
ネットワーク構造図といわれましても・・・

親機1台があり、それをハブ・・・でいいのかな?を使って、接続できる部分を増やして、
有線で片方のパソコンを繋ぎ、さらに無線ルーターを繋いで、もう一台の方に繋いでいます。

作りたいのは、簡単なチャットプログラムで、
他のPC(ネットワーク上)と、テキストのやり取りをしたいと思っています。

独学ではじめ、ネットワークを使ったプログラムの練習をしています。


120:デフォルトの名無しさん
11/02/06 00:34:03
>>119
何処に無線ルーターをつないで、もう一台に繋いだんだ?
もう一台ってPCか?
有線で繋いだのか無線で繋いだのか?
無線に決まってるとか言うなよ。どう繋いだかはお前にしか判らないんだよ。
親機っていうのも無線ルーターだよな?それに無線で繋いだのかもしれないしな。

文章でも良いから曖昧さのない様に説明しろ。

121:デフォルトの名無しさん
11/02/06 01:03:45
これがネタニマジレスか

122:デフォルトの名無しさん
11/02/06 13:20:34
>>119
文章より図の方が状況がわかりやすいかなと思ったから
俺は115を読んでこんな感じだろうかと勝手に想像したので
URLリンク(www.dotup.org)
子ルータをAPモードにして全員一律に親ルータからアドレスもらってひとつのサブネットにまとめれば解決するんじゃないかなと考えた
まぁつまりプログラミングの問題じゃなくてネットワーク環境設定の問題だろうと思ってるわけだけど
pingは通る?

123:デフォルトの名無しさん
11/02/06 21:05:03
>>120
親機は有線、子機は無線です。
繋ぐのはPCです。

>>122
正確な図、ありがとうございます。
そのとおりです。

>子ルータをAPモード
この時点で詰みそうですが、ググリながらやってみようかと思います。
まず、APモードとは何かから探さなければ・・・

>pingは通る?
192.168~~のデフォルトゲートウェイに、pingを試したところ、
ちゃんと通ってるようです。
それと、ipconfig /allで確認したところ、
192.~.1と192.~.2しかありませんでした。

124:デフォルトの名無しさん
11/02/06 21:28:07
>>123
1. 親機ルーターは192.168.2.xへの宛先を持つパケットが来たら
192.168.1.3に投げなければいけないことを知っている?
2. 子機ルータのデフォルトルートは192.168.1.1になってる?
3. PC1のデフォルトルートは192.168.1.1になってる?
4. PC2のデフォルトルートは192.168.2.1になってる?


125:デフォルトの名無しさん
11/02/07 00:12:55
ルータの説明書を読むべき

126:デフォルトの名無しさん
11/02/07 20:14:03
>>124
1:知りませんでした。
2:なっています。
3:なっています。
4:なっています。

>>125
それもそうですね・・・
読み直してみます。

127:デフォルトの名無しさん
11/02/08 21:44:01
ipv6のパーサ書いてて構文上はOKみたいなんだけど
2文字のコロン「::」もIPV6のアドレスとして有効な表現なの?

128:デフォルトの名無しさん
11/02/08 21:48:35
>>127
それは 0 を省略した形

~:0000:~ なら ~::~ にできる

129:デフォルトの名無しさん
11/02/08 21:51:17
>>127
あっ失礼。2回以上の連続した0ね。

130:127
11/02/08 22:24:03
えっと、一応その形式は知ってるんだが
疑問なのは数字なんか付かない、まさにコロン2つ「だけ」の場合

ABNF抜粋すると問題の箇所は
ipv6address =
| //色々なケース
| //色々なケース
| [*6(h16":")h16]"::"
となってて、[]は省略可能なんで
他に全く数字の付かない「::」のみのケースがあるのよ

131:127
11/02/08 22:25:40
あ、失礼、それも含めて「::」=0ということか

132:127
11/02/08 22:27:55
>>128 言い忘れてた、サンキュ

133:デフォルトの名無しさん
11/02/08 23:16:56
うぜえ

134:デフォルトの名無しさん
11/02/09 01:46:28
URLリンク(dl8.getuploader.com)
こうやってるのに
URLリンク(dl8.getuploader.com)
こう返ってくるんですが

何で差分だけの取得が出来ず、かつレス番1が壊れてしまうのでしょうか

135:デフォルトの名無しさん
11/02/09 01:51:18
書き忘れましたが最初の取得だけはうまく出来ます
差分の取得のはずがうまく出来ず、こうなります

返ってきたdatを"\n"で区切ってString[]に入れたものです
デバッガで見る限りではレンジやモディファイは正しいと思われる値にはなっています・・・

136:デフォルトの名無しさん
11/02/09 02:36:55
ログをまったく読んでない上にテキストでなく画像とか喧嘩売ってるんだよな?

137:デフォルトの名無しさん
11/02/18 00:05:51
マルチキャストの受信をしているのですが、ブロードキャストで送信されると受信してしまいます。
何故なのでしょうか?

138:デフォルトの名無しさん
11/02/20 10:21:33.25
同じ部屋に居る椰子が大声で騒いだら聞こえるのと同じ。
黙って無視すればいい。

139:137
11/02/20 22:59:15.93
>>138
どういうことなのでしょうか?

140:デフォルトの名無しさん
11/03/05 06:38:28.58
ネットワークプログラミング初心者なのですが、何から始めればよいでしょうか。
よくソケットからと言われますが、具体的にどういう処理から始めるのでしょう。


141:デフォルトの名無しさん
11/03/05 06:41:15.99
適切な言語とフレームワーク使えばソケット気にせず書けるようになる

142:デフォルトの名無しさん
11/03/05 12:11:24.46
>>140
> ネットワークプログラミング初心者なのですが、何から始めればよいでしょうか。

お約束だが、「やりたいことを見つける」ことからかな。

143:デフォルトの名無しさん
11/03/05 12:36:41.44
>>137
バグだろ。

144:デフォルトの名無しさん
11/03/06 07:52:23.37
winsockで通信ソフトを作っているのですが、ある利用者の環境では
socket関数でINVALID_SOCKETエラーが発生したそうです。
XP SP3では一度も発生したことがないのですが、原因が分かる方が
いましたら、ご教授下さい。

145:デフォルトの名無しさん
11/03/06 09:48:50.39
>>144
バグだろ。

146:デフォルトの名無しさん
11/03/06 09:57:00.20
・WSAStartupの戻り値は確認しているのか?
・ある利用者の環境ってのがどういう環境かわからない

147:デフォルトの名無しさん
11/03/06 10:14:44.28
> ご教授下さい。
どこの馬の骨かわからん奴を弟子に取る気はないが、俺だったら、
WSAGetLastErrorを仕込んで置く事を忘れなかったな。

148:デフォルトの名無しさん
11/03/06 12:27:16.71
IPv6インストールしてないのにPF_INET6使おうとしたとか?

149:デフォルトの名無しさん
11/03/06 13:12:00.11
>>144
原因はそんな情報で分かる人間が居ると思うような奴が
作ったプログラムだから

150:デフォルトの名無しさん
11/03/07 09:51:41.74
>>145
ハゲだろ

151:デフォルトの名無しさん
11/03/09 23:43:18.69
おまえらって、TCP、UDP、IPライブラリの組み込みへの移植とかやったことある

152:デフォルトの名無しさん
11/03/10 00:24:52.12
>>151 あるけど、なに?


153:デフォルトの名無しさん
11/03/10 00:34:23.56
ソースくれ

154:デフォルトの名無しさん
11/03/10 05:42:54.02
>>153
必要なら買うなり、OSS使うなりしなよ。
ゼロから作ってデバッグするのは大変だよ。

155:デフォルトの名無しさん
11/03/10 09:21:40.36
そうだね
どっかのPICのソース流用しようと思ったけど
プロトコル完全実装じゃなくて
かなり適当に必要最小限しか作ってなくて
結局参考にならなかったな

156:デフォルトの名無しさん
11/03/10 22:42:00.33
>>154
なんか良いOSSのライブラリ教えて

157:デフォルトの名無しさん
11/03/11 00:12:21.92
154じゃないがuIPあたりは?

158:デフォルトの名無しさん
11/03/12 20:28:08.90
質問させてください。
XP環境では問題ないのですが、Windows Vistaで
s=socket(AF_INET, SOCK_RAW, IPPROTO_IP);
とするとエラーになります(INVALID_SOCKETを返す)。

目的はWindows7からチカチカ点滅しなくなった
タスクトレイのネットワークアイコン(通信の有無を示す)の自作です。
(有無だけに注目して内容を見ないパケットモニタのようなものです。)

ネット上で調べた結果、Vistaからは上のことは無理で
それをやりたければWFP(Windows Filtering Platform)とやらを
使うしかない、という答えに現時点では行き着いています。
実際、1.うん、WFPを使うしかないね。なのでしょうか。
それとも2.いや、他にやりようがあるよ。なのでしょうか。

さらに質問すると、Windows7をご利用されている方は
タスクトレイのネットワークアイコンを見ても通信の有無が
わからないことについて、どのように解決(もしくは許容)されていますか?


159:デフォルトの名無しさん
11/03/17 14:18:43.99
setsockoptでTCPの再送間隔と再送回数を制御したいんだけど
なにをいじるんだっけか

160:デフォルトの名無しさん
11/03/17 14:18:52.60
おっぱい!

161:デフォルトの名無しさん
11/03/17 17:32:18.42
>>159 OSは?
*BSD なら sysctl で設定
Linux なら /proc で設定
Windows はしらん
その他の Unix なら man よめ


162:デフォルトの名無しさん
11/03/18 14:08:08.96
>>161
setsockoptで制御したいんです。

163:デフォルトの名無しさん
11/03/18 17:12:57.19
>>161
ワロタ、setsockoptで言っているのに
いつもトンチンカンなことをして周りに迷惑かけてるんじゃないか

164:デフォルトの名無しさん
11/03/19 14:50:47.28
>>163
sockopt インターフェースは, カーネルのソース読むとないな, *BSDとLinux


165:デフォルトの名無しさん
11/03/19 15:02:58.74
Windowsだってソケットごとには設定できないよ

166:デフォルトの名無しさん
11/03/19 15:22:20.24
>>163 ここはボケないと


167:デフォルトの名無しさん
11/03/22 11:19:33.73
>>161
Linuxだけどさ、どこで設定するのよ
そんな設定箇所無いよ
憶測でモノを言っているの?

168:デフォルトの名無しさん
11/03/22 17:14:46.99
教えてください。
もしスレチでしたら誘導をお願いします。

以下のようなことをしたいとお勉強中です。
・snmp を使用してネットワーク上の機器の状態を管理する
・状態の取得には snmp の trap を使用する
・ネットワーク上には snmp のバージョン v1 と v2c の機器が存在していて両方に対応したい
・当人はソケットを使用したプログラムは経験があるものの、ネットワークそのものは初心者

で、質問です。
・v1 trap の PDU には Enterprise などがありますが、v2c には存在しません。
 これは v2c では取得できないということでしょうか。データ部に存在するのでしょうか。
 ※できれば v1 と v2c の実処理を行なう箇所を同じ処理で統一したいため同じデータを取得できたら便利だな、と
・v2c trap の PDU は v2 のものと構成が同じであり、
 Comunity の部分だけが v1 と同等であるとの認識は正しいでしょうか

よろしくお願いします。

169:デフォルトの名無しさん
11/03/22 23:24:39.15
誰かツイッターapiについて詳しい人いませんか?

api制限で150回までに制限されてしまうのは仕方ないのでしょうか?

でもtweenとかは常に最新の状態に更新出来ている気がするのですが。。
あれはどうやっているのでしょうか?

170:デフォルトの名無しさん
11/03/23 10:49:22.40
>>169
APIを使わなくても見れる情報なら、APIを使わなければよい

171:デフォルトの名無しさん
11/03/24 00:32:35.57
>>169
>api制限で150回までに制限されてしまうのは仕方ないのでしょうか?

いいえ。
個別に交渉すれば、割と簡単に制限を緩めてもらえるみたいです。


172:デフォルトの名無しさん
11/03/24 12:15:07.27
>>170-171
API使わなくても見れる情報というのは例えばどんなものでしょう?

個別に交渉するということはどういうことですか?

173:デフォルトの名無しさん
11/03/24 13:41:55.22
>>172
ブラウザ使ってツイッタ見た事ないのか?

html 取得すればよい。鯖負荷は・・・・。


174:デフォルトの名無しさん
11/03/24 19:32:59.58
やはりその方法でしたか。
鯖負荷ってどれぐらいのアクセス数なら大丈夫でしょうか?
一秒1アクセスはやっぱきついですかね?

175:デフォルトの名無しさん
11/03/24 20:34:01.37
>>174
WEBアクセスでも認証なしで同一IPから何度もアクセスしてるとAPIと同じようにブロックされるよ

176:デフォルトの名無しさん
11/03/24 22:29:35.14
1アクセス/1秒は、偽計業務妨害の疑いで逮捕、20日間勾留されるくらい、悪質な行為。

177:デフォルトの名無しさん
11/03/25 11:38:58.02
逮捕されるところでした・・
ありがとうございました・・

178:デフォルトの名無しさん
11/03/25 17:59:51.89
ブチこまれた前例つくっちゃってるからな
前例がある事は容赦なく捕まえるぞ警察は

179:デフォルトの名無しさん
11/03/25 20:48:52.41
>>176
無罪になったんだから別によくね?
拘留期間中の分お金もらえるし

180:デフォルトの名無しさん
11/03/25 21:19:42.91
不起訴処分と無罪はまったく別物だぞ

181:デフォルトの名無しさん
11/03/25 21:45:30.86
有罪だが罰はほぼ勘弁してやった、という結果だったよな

182:デフォルトの名無しさん
11/03/26 23:32:01.24
懲りずにやる奴が出て売ると、有罪+実刑になるパターン

183:デフォルトの名無しさん
11/03/26 23:32:10.35
毎秒ごとに株価とか為替採りたいと思ってた所だったw
前例有るのかw

184:デフォルトの名無しさん
11/03/26 23:36:53.11
岡崎図書館  岡崎市立図書館 で検索してみ

185:デフォルトの名無しさん
11/03/26 23:41:36.56
ネットワークプログラミングをやってる人間であれば、知っておかなければ恥だ

186:デフォルトの名無しさん
11/03/26 23:43:10.39
恥で済めばいいが、人生終了しかねないからな

187:デフォルトの名無しさん
11/03/26 23:48:55.16
ネットワークプログラミングの勉強中で、以下のようなプログラムを作成しています。

1.ソケットを3つ開き、selectで待ちます。
(a_fd、b_fd、c_fdとする。)
2.受信したデータはソケットごとに保持。
(a_fdで"HELLO"、b_fdで"SeeYou"、c_fdで"Hi"というデータを受信したら a_fd:HELLO b_fd:SeeYou c_fd:Hiという風に )
3.新しいデータを受信したら上書きする
(a_fdで"Bye"を受信したらHELLOを上書き)
4.各fdから1分間何も受信しなければそのfdのデータを削除する。
(a_fdから1分間受信しなければa_fd: b_fd: SeeYou c_fd:Hiとなる)

1~3までは作成できますが、4のアルゴリズムが分かりません。
selectのタイムアウトを1分にするのかと思いましたが、それだと各fdではなく全てのfdから1分間受信しなかった場合しか
判断できないですよね?
どのようにすれば各fdの時間を判断できますか?

よろしくお願いします。

188:デフォルトの名無しさん
11/03/27 01:04:06.59
各fd毎に最終受信時刻を記録しておき、selectに入る前にチェックする。

189:デフォルトの名無しさん
11/03/27 02:00:52.73
>>188
なるほど~
ありがとうございます。

190:デフォルトの名無しさん
11/03/27 13:56:27.64
今、Winsockの勉強でパケットキャプチャを作成しているのですが
パケットがどのアプリケーション宛に送られて来たものなのかを
特定する方法はあるのでしょうか?
よろしくお願いします。

191:デフォルトの名無しさん
11/03/27 14:33:41.81
>>190
「netstat -b」で「リッスン ポートの作成に使われた実行ファイルを表示」できる。
(手元のWindows 7で確認した)
これをパケットと付き合わせればよいかと。

192:デフォルトの名無しさん
11/03/27 14:56:25.99
>>191
こちらはXPですがその方法でやれそうです。
ありがとうございます。

193:デフォルトの名無しさん
11/03/27 15:35:19.92
おおっすげーと思ったが、
これ/etc/services参照してるだけだろw

194:デフォルトの名無しさん
11/03/27 16:22:43.45
ほほう、linuxだと netstat -p でできるようだ。
いいこと聞いたありがとう

195:デフォルトの名無しさん
11/03/27 16:48:45.76
>>168
そもそも
「v1 と v2c の実処理を行なう箇所を同じ処理で統一したい」を
「同じデータを取得」で実現するなら最小公倍数の項目で
やるしかないからこの場合は無理。だいいち
Enterprise=ベンダが勝手に定義して勝手に使うところだろ。
SNMPバージョンどころかベンダとか、最悪機器ごとに
処理変わるじゃん。アホか。

SNMPには落とし穴がいっぱいあるから
(例えば32ビット数は5バイトで表現されるから気をつけろ)
目的や対象機器を具体的にせまく絞って始めないと苦労するぞ。
大した目的がないならトライ&エラーで勝手にガンガレ

196:デフォルトの名無しさん
11/03/27 20:32:46.13
こんばんは。

ソケット、プロセス間通信でポインタを含む構造体を送受信したいのですが、どうやればいいですか?
ポインタをそのまま送るのはNGだと聞きましたが。。。


197:デフォルトの名無しさん
11/03/27 20:57:24.98
送り側がデータをftpサーバにアップして
受け取り側はftpサーバからダウンロードしたほうが簡単だと思う

198:デフォルトの名無しさん
11/03/27 21:01:46.73
>>196
> ポインタをそのまま送るのはNGだと聞きましたが。。。
同じアドレス空間で動いていないから、ポインターのさす先を別途送りつけるしかない
その先にポインターがあったらさらにもう一回… … …


199:196
11/03/27 21:06:19.64
>>197
ソケットを使うことが条件なので。。。

>>198
構造体をポインタがない構造体にしてから送るしかないですよね。。。
ありがとうございました。

200:196
11/03/27 21:25:36.74
>>198
何度もすいません。
構造体が線形リストの場合(データが何件あるかわからない場合)、
どのように展開すればいいですか?


201:デフォルトの名無しさん
11/03/27 21:29:01.45
最初にデータの件数を数えてその個数を送るか
1件送るたびに次がまだあるか無いかを示すフラグを送るか

202:196
11/03/27 21:30:50.90
>>201
なるほど。。。すごいなぁ。
ありがとうございました。助かります

203:デフォルトの名無しさん
11/03/27 21:31:14.54
やっぱりftpで送ったほうがいいと思う
(まだわかんねえかな~)

204:デフォルトの名無しさん
11/03/27 21:33:28.76
ポインタ受け取ったら実体を要求すればいい。

205:196
11/03/27 21:39:35.27
>>203
すいません。
ftpで送るってどういうことですか?
ソケットとは違いますよね?

206:デフォルトの名無しさん
11/03/28 06:35:07.15
ソケットは手段
ftpは通信規約

207:デフォルトの名無しさん
11/03/28 14:06:31.93
>>195
レス、hx

言われることはもっともなんだけれど、そういう風に要求されてしまったので可能なのだろうかと調べていたところで。
数値の扱いなども言われるとおりでちょっと苦戦していました。
※その後、もともとのプログラムが v2c に対応していないことが判明しました。w

もうちょっとがんばってみるです。
ありがとうございました。

208:デフォルトの名無しさん
11/03/28 17:37:16.69
SNMP廻り全部自前で書くの?
結構難しいよ。ただただ面倒だし。
出回っているライブラリーのソース読めば
その辺のことは大体分かると思う。

209:デフォルトの名無しさん
11/03/29 22:10:44.64
ポインタを含むデータ構造通信の件、おいら大好物。
ゆっくりでよければ教えるよ

問題なのは、最近のOSではメモリが確保される具体アドレスは
マシンごとに違うから、単にメモリアドレス値を渡しても
普通うまくいかんっつーことだな。

レアなやりかたで、メモリが確保されるアドレスをそろえてしまう
ってのもある。

オイラが好きなのは、データパケットの先頭をゼロとして
ポインタ値をオフセット値に変換して通信、
受信側はオフセットをポインタ値に戻す、ってやつ。

"シリアライズ"で検索するといろいろでるよ。
あと、.Net等で同一マシン内の違う言語で構造体データ渡すのにも
似たテクを使うんだが、それは検索キーワード"マーシャリング"だ

210:デフォルトの名無しさん
11/03/29 22:37:03.78
> レアなやりかたで、メモリが確保されるアドレスをそろえてしまう
どうやって?
相手のマシンが同じアーキテクチャである保証はない
ましてや同じOSである保証はさらにない

> データパケットの先頭をゼロとして
> ポインタ値をオフセット値に変換して通信、
同一オブジェクトへのオフセットは, 当然, 考慮されてるんだよな
こっちでは a -> x, b -> x
あっちでは a -> x, b -> y
だったら洒落にならないんだが…


211:デフォルトの名無しさん
11/03/29 22:51:14.57
すまん、根本の話がすっとんでた。順番に書くと

(1)マシンが別ならメモリアドレス値は別になるから
アドレス値渡しても意味無し。
(2)マシンAでポインタを含むデータ構造を持ってて、
それをマシンBで再現できればいいのであって、
具体的なアドレスは変わっててもいい。
(3)マシンAにてパケットで表現できる形式に変換して、
マシンBに渡して、マシンBでメモリ上に再現する
てのが基本。
(4)パケット表現は、テキストやバイナリがある。
テキストで有名なのはXML、JSON。
バイナリも古くからいろいろあって、
固定長好き派の
NDR(IBM HP MSのRPC)やら
XDR(Sun RPC)やら、
タグ・長さ・値 派のBER(SNMP)やら。

あと、いろいろ環境ツールも含めて
GoogleのProtocol Buffersやら
FacebookのThriftやら
MessagePackやら
もある。

俺が言った、「アドレス値をオフセットに~」っていうのは
バイナリパケット形式の、独自方式を自分で実装する
って話。
201は多分べつの物知りさんだな、
いまocn規制できつい、ゆっくり頼むが
同一の固定OSでないと固定addrは無理だろ

212:デフォルトの名無しさん
11/03/30 00:20:45.86
浅い話を長々書くな

213:デフォルトの名無しさん
11/03/30 10:07:58.23
>>211
> ポインタを含むデータ構造通信の件、おいら大好物。
> ゆっくりでよければ教えるよ
と宣言したんだから、>>200も考慮してきっちり教えてやれ。w

214:デフォルトの名無しさん
11/03/30 14:01:33.18
なんかフォールトレランスシステムで、同じシステム上で同じアプリが複数動いてるのを前提にしてそうな環境だな。

お互いにポインタで参照し合って相互に確認しながら、動作するプログラムが組めそう。

215:デフォルトの名無しさん
11/03/30 15:10:11.16
インデックスなら

216:デフォルトの名無しさん
11/03/30 16:47:20.77
ちょっと質問いいですか。
ここの掲示板でURLリンク(aurasoul.mb2.jp)書き込むと名前の横にIDが自動的につくのですが、
このIDを変える事はできませんか?プロバイダーが変わっても串を刺してもクッキー消しても変えられない。手軽に変える方法は無いですか?


217:デフォルトの名無しさん
11/03/30 19:22:16.64
             ,. ' ´  ̄ ̄ ̄ ̄ ̄ `ヽ、
           /    /          \    
          /     /             \
         /     /―――――イノ
         /     /: : : : : : : : : : : :| |
        ,'    ,∠ __________/ |
        |   <__:.:.イ:.`メ、/|:/ |:./\レ:.:.〈 |
        ノ!     |/リレ',ィrそド"´ レ ィチxV:.!:.V}
       /|    /!:.:.! 〈. トzリ     トzリ }:!::Nリ
     /     /ソ:.:.i xx`¨´    , `¨x{:从 }
    /      //|:.:.込、         /:.|.ハ∧    なんかわたし
    /     /厶|:.:.|\ ヽ、  r つ ,. く:.:.:! ∧ ヽ      呼ばれた気がするんだよ?
   /    /    |:.:.|::::::> ミ  、 <}  |::.:|   ヽ. }
  /i   〃     レ‐‐く\   ̄´ /::!  !:.:<フ二ヽリ
./   //     / /⌒く:\  イ:::::|  |:. 厶--、 }
   / /     (   /,. ┤:::::ヽ /::::::|  |:.厶--、 /

218:デフォルトの名無しさん
11/03/31 00:24:27.59
どんなパケット形式を使うにしても、
(a)循環参照をどうするのか
(b)同一値のエントリが2個以上あるのか
とか、
そのシステムではどうなのかちゃんと
調べて設計の前提条件にしないとダメよ。

ーーーー
リンクリストは後にして、まず文字列のポインタで例だそう。

1エントリに
固定長サイズの部分と可変長サイズの部分があるとするだろ。

struct Hoge {
 uint32_t num1;
 uint32_t num2;
 char *str1;
 char *str2;
}
したら、俺ならこの1エントリに対して例えば

219:デフォルトの名無しさん
11/03/31 00:26:08.56

|----+----+----+----|
|entrySize-------| //パケット独自項目
|num1------------| //ここから固定長部分
|num2------------|
|str1Offset------| //データとパケットで違う項目
|str2Offset------| //データとパケットで違う項目
|str1の中身........| //ここから可変長部分
|.....文字列おわりnull|
|str2の中身........|
|.....文字列おわりnull、4バイト切りいいところまでnull|
とかの形でパケット化するんだわ。

受信側は、
entrySize分のメモリを用意して、
num1~str2の中身をコピーして、
str1Offsetとstr2Offsetの値を書き換えてやれば
struct Hoge のできあがりと。

これは例だからもちろん他のやりかたでもよし。

220:デフォルトの名無しさん
11/03/31 00:28:53.06
で、循環参照や重複エントリはないシステムだとして、
双方向リンクリストだったら、
エントリ->前,次 と書くとして

e1 -> null, e2
e2 -> e1, e3
e3 -> e2, null
をパケットで表現したければ、パケットにはアタマから

ヘッダ(エントリ個数3、とか)
e1
e2
e3

とならべる。
それぞれのポインタを指すフィールドには、パケット先頭からの
e1,e2,e3先頭のオフセットを格納しておけばよい。
ヘッダがあるからnull値と先頭エントリの区別はつく。

つたわるかな?

221:デフォルトの名無しさん
11/03/31 00:29:27.02
>>219
offsetって何?

222:デフォルトの名無しさん
11/03/31 00:37:22.68
offset くらいググろうよ(;-;)
昨日の書き込み見てもわからん?

どんなシステムでも使えてかつ高速な、夢の方法はない。
どんなシステムでも使いたきゃ
実行コスト払ってXMLなりJSON使う。

[アドレス固定]の話は...man shmat 参照。
でも使える場面はかなり限定されるよ。



223:デフォルトの名無しさん
11/03/31 00:41:36.98
>>222
ごめん、質問が悪かった。offsetを何に使うのか。
データさえわかってしまえば、送り先のメモリアドレスな
んて必要ないと思っただけ(offsetってそういう意味じゃない?)。
json,xmlならそんなことしないから使い道が気になっただけ。

224:デフォルトの名無しさん
11/03/31 00:42:51.63
ごめ、「送り元」のアドレスだったorz

225:デフォルトの名無しさん
11/03/31 00:42:56.74
循環やら重複エントリを扱いたかったら、まずはその元データについて
全エントリを重複無くたどるアルゴリスムを考えてみれ。
ソコまでできればあとは楽勝だろ。

226:デフォルトの名無しさん
11/03/31 00:52:36.29
受信したマシン上で、struct Hoge を再現するんだろ。パケットではoffset を入れてるところに、受信マシンがアドレス値を上書きして、struct Hoge * として読むんだよ。
C言語はわかってるんだよな?

227:デフォルトの名無しさん
11/03/31 01:00:19.13
あああ、疑問点わかった。
ウム、文字列途中にnull が入らないことが確定なら確かに値だけでも
問題なく伝わるね。
それでもイイヨ。受信データと再現データを完全に別にするなら。

228:デフォルトの名無しさん
11/03/31 01:09:57.65
あああ、意味分かった。
num1からstr2をまるごとコピーして、各offsetに
コピーしたstr1, str2のアドレスいれれば再現可能って訳ね。
で、可変の場合は各エントリのoffsetをたどって同じこと
繰り返す、と。失礼した。

229:デフォルトの名無しさん
11/03/31 10:28:01.02
教えてください。

linux の snmptrap や snmpinform などのコマンドで、data binding 部のデータの型を
i:整数、s:文字列 みたいに指定するのだけど、Opeque や NsapAddress を指定することは可能でしょうか。

↓コマンドで指定できる型を参考にした場所(表3)
URLリンク(www.itmedia.co.jp)

↓snmp で指定できる tag の型を参考にした場所(表2)
URLリンク(www.netwatcher.jp)


あと、inform は要求を受信した後に返す応答の送信先は
要求を送信してきた側の IP アドレスとポート番号でいいのでしょうか。
snmpinform で要求を投げて、以下の場所に返してみたのだけどタイムアウトになってしまいます。
・受信したUDPソケット (当然?送信できずににエラーとなる)
・新規に作成したUDPソケットで要求を送信してきた側の IP アドレスとポート番号
・新規に作成したUDPソケットで要求を送信してきた側の IP アドレスとSNMPの既定ポート(162)

お願いします。


230:デフォルトの名無しさん
11/03/31 10:39:19.10
net-snmpの場合、usage:にOpaqueで扱える型が出力される。
NETSNMP_WITH_OPAQUE_SPECIAL_TYPES定義でコンパイルされていれば。


231:デフォルトの名無しさん
11/03/31 13:01:53.84
>>230
ありがとうございます。
usage に見当たらないので、、、残念。


inform の返信先についても、分かる方がいらっしゃったら教えてください。

232:デフォルトの名無しさん
11/04/12 22:48:34.55
WinSockでUDPのプログラムを組んでるんですけど、
ポートはbindしてて、INADDR_ANYでsendtoしたときに、
実際にrecvする側で送信元として受け取るアドレスは、
送信元のどのアドレスなのでしょう?
「どの」っていうのは、送信元のマシンにはエイリアスで
アドレスが複数追加されているので・・・

INADDR_ANYで送信するときって、送信元として入るアドレス選択に
きまりはあるのでしょうか?

233:デフォルトの名無しさん
11/04/12 22:53:17.51
bindしてれば、そのアドレス
してなければ、出て行ったインターフェースのアドレス

ただWinSockはいろいろ斜めを行くから…

234:デフォルトの名無しさん
11/04/13 12:32:56.36
>>232
>INADDR_ANYで送信するときって、送信元として入るアドレス選択に
>きまりはあるのでしょうか?

ホストのルーティングテーブルでネクストポップを決定して、
そのネクストポップと同じサブネットのアドレス。

>>233
>してなければ、出て行ったインタフェースのアドレス

232が聞いてるのは一つのインターフェイスに複数のIPアドレス振ってる時の話でしょ。

235:デフォルトの名無しさん
11/04/13 12:38:44.84
同じNICに二つのIPアドレス振ってるときは
出て行くのはプライマリのIPアドレスからになる


236:デフォルトの名無しさん
11/04/13 18:19:07.72
>>235
んなわけあるかい。
「プライマリの」なんて概念が前時代的。

237:232
11/04/14 00:35:43.37
>>233-235
ありがとうございます。
>>234さんの指摘のように、1つのインタフェースに複数のアドレスが定義されている場合です。

>>234
> ホストのルーティングテーブルでネクストポップを決定して、
> そのネクストポップと同じサブネットのアドレス。

浅学ですみません。。。定義した複数アドレスが、同一ネットワークの場合はどうなるでしょうか?
基本的な質問で恐縮なのですが、なぜこういう質問をしているか、
>>232の話をもう少し具体的に言うと

① サーバ    : アドレス 192.168.0.20/24 さらに同じNICに対して、エイリアスで 192.168.0.1/24 を定義している
② クライアント : アドレス 192.168.0.10/24

この状態で①→②へ送信します。送信方法は>>232に書いたように、UDPで、ポートは固定で指定、
ホストアドレスは INADDR_ANY で作ってバインドしてあります。
①でsendtoして②でrecvfromしたとき、②で受信したときの送信元(①)のアドレスがどうなるか?なのです。
というのも、①がWindowsXPの場合は、送信元アドレスが 192.168.0.20 となったのですが、
Windows7の場合は、192.168.0.1 となるのです・・・
>>234さんの指摘をもらって、route print してみると、
確かに WindowsXP では、192.168.0.0/24 の interface が 192.168.0.20 となっているのですが(>>235さんの言うプライマリですね)
Windows7の場合は、192.168.0.0/24 の interface は 192.168.0.1 となっています。
Windows7の場合、アドレスが小さいものが interface に優先されてしまう?と疑問を持った次第です。

これまでXPで使っていたプログラムで、Windows7へ持っていくと動作が変わるので、
これをなんとかしたい、というのが背景です。

238:デフォルトの名無しさん
11/04/14 06:30:29.12
INADDR_ANYをやめる

239:デフォルトの名無しさん
11/04/14 15:29:36.22
Linuxのソケットで
まだreadしてないたまっているバッファをすべて破棄するには
どうするのが一番スマートで速くて格好いいデスか?

240:デフォルトの名無しさん
11/04/14 15:43:31.87
select, readループ

241:デフォルトの名無しさん
11/04/14 15:53:11.93
>>240
空読みが許されるのは童貞までだよねー

242:232
11/04/14 18:19:21.77
自己解決しました。

結論から言うと、OSの仕様でした。(無印Win7しか確認していませんが)
URLリンク(support.microsoft.com)

↑のKBの修正Hotfixを当ててから、
netsh で skipassource=true にしてエイリアスのIPアドレスを
同一NICに追加してやると、プライマリ相当のアドレスで返ってくるようになりました。
またこのとき、route print すると Gateway と Interface がプライマリ相当のアドレスになることが確認できました。

>>236さんの言うようにプライマリという概念がそもそもなくなってるともいえますし、
OSの動作が、XP/2003Server → Win7/2008R2 で変わったともいえると思います。
まあプログラム側がOSの仕様を決め打ちした動きになってるのが悪いんですが・・・w

とりあえずOSのアップデートか、>>238さんの言うようにプログラム側で対処するか、
どちらかで検討します。
お騒がせしました。

243:デフォルトの名無しさん
11/04/14 19:55:54.78
くっそ
ソケットに対してlseekするとエラーになるんじゃん!

244:デフォルトの名無しさん
11/04/14 19:59:14.69
いやいやいやいや
常識的に考えて出来るはずなかろう?

245:デフォルトの名無しさん
11/04/14 20:01:50.14
向こうが shutdown で閉じてれば あるいわ… ってTCP限定の話になっちゃうか

soket 閉じて開きなおすのはマズイのだろうか と戯言

246:デフォルトの名無しさん
11/04/14 21:36:35.72
shutdownマナーはFAQです。よく読んでください。

247:デフォルトの名無しさん
11/04/14 21:43:05.47
>>244
lseek を実装して、現在あるバッファを読み飛ばす(捨てる)だけは可
にすればいいんだがまぁ、対称性に著しく書けるインターフェースだわな


248:196
11/04/14 21:52:01.14
ソケットでのプロセス間通信について質問です。
AとBのプログラムで通信する場合ですが、こういう認識で合ってますか?

 プログラムA    プログラムB
   ↑         ↑    ユーザランド
-----|-----------------|---------
 プログラムAの   プログラムBの
  ソケット←ーーーー→ソケット  カーネル

249:デフォルトの名無しさん
11/04/14 21:52:44.84

名前の196は関係ないです。
すいません。

250:デフォルトの名無しさん
11/04/14 22:10:21.58
>>248
ええ。
まあ環境によるんですけど。

251:デフォルトの名無しさん
11/04/14 22:13:46.39
>>250
例外もあるんですか?

252:デフォルトの名無しさん
11/04/14 22:27:29.18
プロトコルスタックがカーネルにある必要は無いし、
逆に、インカーネルなhttpdとかありうるし。

253:デフォルトの名無しさん
11/04/14 22:52:12.25
NFSサーバとかカーネル内にある。

254:デフォルトの名無しさん
11/04/15 00:08:01.48
インターフェースがupされた直後に
いくつかのソケットでconnectし始めるプログラムを実行すると
一番最初のconnectはつながるまで約3秒かかるのに
ほぼ同時ながら別のスレッドでconnect呼ぶところではほぼ即座につながる
ってことが起こるんですが、何が原因でしょう?
あと、一発のconnectの待ちを短くしてやるにはどうすればいいでしょう?

255:デフォルトの名無しさん
11/04/15 00:13:37.91
DHCPとかDNS引いてるんじゃない?

256:デフォルトの名無しさん
11/04/15 00:18:31.32
ああすいません
インターフェースは固定IPでupさせてます
あと、接続もIPアドレス直です
1回目のconnectと2回目のconnectは同一ホストへの接続で
ポート番号が1個違うだけなのに2回目の方が先につながるのが納得いかない。。

257:デフォルトの名無しさん
11/04/15 00:27:05.93
ARPが必要だけど、そんな時間かからない。
OSは何?

258:デフォルトの名無しさん
11/04/15 00:31:52.32
linuxです
ひょっとしてarpテーブル見に行って該当無かったら
arp投げて3秒後synリトライしているとか?

259:デフォルトの名無しさん
11/04/15 00:35:34.94
ARP終わらなければパケット投げられません。
リトライになるはずないです。
ルーティング設定も手動ですか?
DNSの逆引きが行われてませんか?

260:デフォルトの名無しさん
11/04/15 00:36:19.85
ethersharkでパケットダンプすれば?

261:デフォルトの名無しさん
11/04/15 02:23:27.15
>>260
ちょ、まじってる

262:デフォルトの名無しさん
11/04/15 14:06:04.59
>>253
マジ?

263:デフォルトの名無しさん
11/04/15 15:40:07.26
>>262
常識

264:デフォルトの名無しさん
11/04/15 16:46:17.40
>>263
いや、今でも使ってる人いるの?

265:デフォルトの名無しさん
11/04/15 16:50:47.51
>>264 うちでは、普通に使ってるが


266:デフォルトの名無しさん
11/04/15 19:03:36.63
>>259
ルーティング設定も手動、DNSの逆引きは行われていないと思います。

>>260
wiresharkが使えればよいのですが
組み込み系かつWiFi直結間での通信なので・・・

とりあえずノンブロッキングで
connect→close→connect
ってすると即座につながったのでこれで良し?

267:デフォルトの名無しさん
11/04/15 19:15:37.64
Peerも組み込み?
PeerをPCにしてperrでwireshark動かせば?

268:デフォルトの名無しさん
11/04/15 19:30:43.86
>>264
たとえばWindowsのIISのHTTPサーバーはカーネルで動作するように実装されてた。
パフォーマンス優先で設計すると、そうなる。

269:デフォルトの名無しさん
11/04/15 19:43:28.92
されてたってまたユーザモードに戻されたの?
カーネルモードに移動したのがServer 2003あたりの比較的最近だった気がするけど

ちなみにLinuxにもカーネルモードのhttpdがある

270:デフォルトの名無しさん
11/04/18 12:02:15.56
NFSもカーネルモードのがあったな

271:デフォルトの名無しさん
11/04/18 12:06:45.71
あったなじゃなくて、元祖のSUNの実装がインカーネルなんだよ。
坊やならしょうがないけど、人前でそういう発言しな方が良いぞ。w

272:デフォルトの名無しさん
11/04/18 13:56:48.22
>>271
システムコール呼んだら2度と帰ってこないって、あれだっけ?
まぁ、当時はカーネルスレッドなんかなかったからなぁ


273:デフォルトの名無しさん
11/04/18 15:36:01.74
>>271
元祖の話とかしてどうするの? 懐かしむの?

274:デフォルトの名無しさん
11/04/18 16:29:33.47
NFS-3GもFUSEからカーネルに取り込まれたよ。

275:デフォルトの名無しさん
11/04/18 17:03:04.79
>>273
しょうがないよ。坊やが生まれる前からある技術だから。

276:デフォルトの名無しさん
11/04/18 18:05:41.66
今はもう使われてないしなぁ

277:デフォルトの名無しさん
11/04/27 10:01:35.90
おじいちゃんは昔話好きだからな。
今頃バブルの話とか太古のアイドルの話しても分からないってw

nfsに限らずファイル周り呼んだら帰って来なく成るって多いorz

無線だと無線の物理層のリンクもいろいろごにょごにょしてそう。
ipで下位レイヤを気にせず使える分、いろんな状況を想定する事が求められる。

被災地の観測機器にパケット飛ばしたら、無線基地局が流されて消失してたとかね。

278:デフォルトの名無しさん
11/04/27 10:55:57.72
都会ね。

279:デフォルトの名無しさん
11/04/27 17:18:18.60
ちょっとお尋ねします。

サーバからデータをpush送信したいと思いってます。

ちょっと調べた範囲では余りよく分かりませんでした。特にプログラミング言語で当該機能を実装するような具体的な例を見つけることができませんでした。

何かヒントとか、または、ここを
見れば分かりやすいよ、とかありましたら、よろしく願いします。

なお、サーバはwindowsでクライアントはandroidです。


280:デフォルトの名無しさん
11/04/27 19:39:28.10
.NET framework4.0とC#で非同期TCPでソケット通信してバイナリデータの
送受信クライアントアプリ作ってみたいな~
なんて思ってる人生の初心者です。
invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとかもうちんぷんかんぷんです。
基礎からじっくりと使い方の学習してみたいのですが、お勧めは何かありますでしょうか?

コードの断片だけじゃてんで頭にはいんないし、書籍は○○層があってだなとかフレームの中身の話とか
で、言葉の定義で実際にはソケットよりもNIC担当の処理内容に紙面を費やしてたりと
意欲だけ空回りで、てんで前進してる気配がないので、お助けください。

281:デフォルトの名無しさん
11/04/27 19:42:56.80
> invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとか

それはネットワークとは関係のないC#自体の話ではありませんか
ネットワークの話とは分けて勉強した方がいいと思いますが

282:デフォルトの名無しさん
11/04/27 20:02:26.51
確かにそうかも。
送信した後に非同期で受信した側の処理を身に付けたいんですけど
ソケットの使い方じゃなくて、非同期の勉強でつまづいてるってところが大きいですね。
非同期だとF10押していってもデバッグ出来ないですよね?別スレに行ってしまって。
どう試行錯誤していいのか、先ずそんなところから錯誤してますです。

283:デフォルトの名無しさん
11/04/27 23:33:33.79
>>280
ぐぐれば非同期の作り方の例が出てくるよ。
でもスレッド作って同期でしたほうが分かりやすいし作りやすいと思う。

C#内容についてはこちらで
スレリンク(tech板)

284:デフォルトの名無しさん
11/05/02 16:12:32.87
winsockでプロセスが生成しているソケットを
列挙するようなI/Fがありますでしょうか?

285:デフォルトの名無しさん
11/05/02 21:03:46.47
ない。

286:デフォルトの名無しさん
11/05/03 03:56:32.35
>>284
WinSockには無い。
IP Helper APIを使う。

287:デフォルトの名無しさん
11/05/05 04:39:15.21
ご存知の方いらっしゃれば助言頂ければ幸いです。

NAT越え関係のプログラミングを作らないといけないのですが
何をどうすればよいのやらで、行き着いたのが
uPnPでのポートマッピングに行き着きました。

諸所の本、サイト等は見て回ったのですが、
「マルチキャストでM-SEARCH」の一点張り
マルチキャスト(UDP)で送信しても受信側がどうしてもできない?
※sendtoでの戻り値状は送れていると思うのですが。
といった所で、このGWをほぼ潰す結果になりました(´・ω・`)

何か コレみれば(・∀・)イイ!! といった物はありませんでしょうか?

288:287
11/05/05 05:03:06.46
補足:環境は、Win32のVC++です。

289:デフォルトの名無しさん
11/05/05 09:27:46.55
>>287
Microsoft Windows SDKのサンプル。 google依存症だな。

290:デフォルトの名無しさん
11/05/05 12:28:27.64
無理(無駄)なことをしてるだけのような

291:デフォルトの名無しさん
11/05/06 15:42:33.43
使ってるルータがちゃんと対応してるかどうか調べたほうがいいよ。
それからどうでもいいことだけどUは大文字。Universal Plug a'n'd Play


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