WSAGetLastErrorでエラーコード取得したんだけど、0だったんだが、 これどういう意味? WSAGetLastErrorって連続で呼び出したら、エラーコードの情報が リセットされることってないよね? ちなみに0が返ってくるのは、クライアント側のウィンドウを強制的に 終了させた時です。 そのときにWSAGETSELECTERRORでエラーになったので、 WSAGetLastErrorでエラーコード取得してみたら0だったんです。
winsock2.hで、ローカルアドレスをプロミスキャスモードでtcp通信を全て監視したいのですが、 while(1) { recv(); すこし重たい処理; } とするとrecvのデータが欠落(跳んでしまう)してしまうみたいなんですが、どう対処したらいんでしょうか 考えたのは buff格納キューテーブル thread1 { while(1) { recv(); buffをキューテーブルに格納 } } thread2{ while(1){ キューテーブルを参照、処理 対象データを取り除く } } という素人案ですが、格納にどれくらい負荷が掛かるかも心配で、 何かいい案はないでしょうか?よろしくお願いします
「すこし重たい処理」を「とても軽い処理」にチューニングする。
WSAAsyncSelectを使ってノンブロッキングモードの通信を行っています。 connect関数を使ったのですが必ずエラーになります。 WSAEWOULDBLOCKのエラーが返ってきます。 これは非同期処理においては当たり前のことなのでしょうか? もしそうなら、SELECT等やタイムアウト時間を自分で設定するしかないのでしょうか? これは結局同期処理になってる気がするのですが、CONNECTのときは仕方ないのでしょうか?
WSAEWOULDBLOCK は、 本来はブロッキングする処理だけどノンブロッキングモードだからブロックせずに制御を返したよ(もちろんまだ完了してないよ) っていう意味だから、あなたの望む結果じゃないのでしょうか? それともノンブロッキングモードを誤解しているのでしょうか? 単に WSAAsyncSelect の FD_CONNECT の存在に気づいてないだけでしょうか?
>>11 これは非同期処理においては当たり前のことなのでしょうか?
yes
>>11 状況が分からないが
connect関数はコール後すぐに制御を返すが、実際にはまだ接続が完了していない。
その状態であることを知らせるのがWSAEWOULDBLOCKであり、
接続が完了したことを通知するのがFD_CONNECT。
connect関数コール後から接続完了(CONNECT)まで何も処理することがないなら一見するとブロッキングモードと同等になる。
しかし、それらの処理がメインスレッド上で行われている場合、ブロッキングするconnect関数コールは、他のWindowsメッセージの処理すらされなくなる。
>>12-14 本当にありがとうございました。
FD_CONNECTを待とうと思ったんですが、
色々面倒だったので、select使うことにしました。
メインスレッドで実行しますが、接続時なんで多少ブロックされてもいいと判断しました。
>>15 select()の待ち時間を0秒にしてもグッとブロックされたりしますか?
それともselect()を使う限りブロックしてしまうものなのでしょうか?
winsockの非同期通信で1台のパソコンで通信のプログラムを作っています 送信側と受信側では同じサイズと間隔で下のように送受信しています for(i=0;i<j;i++) send(sock,&buf[l],k); l=l+197; Sleep(16); 1回のループに196byteなら問題なく送信できるのですが、197にするとエラー(WSAEFAULT)が 発生します。 これは秒間12KBの送受信になるのですが 同じ1台のパソコンでapacheを起動し画像を送受信すると重い画像でも表示できます 原因が思いつく方がいましたらご教授下さい
>>17 お前のバグ。
WSAEFAULTは&buf[l]が有効なメモリアドレスをさしていない場合に出力される。
てすと
20 :
17 :2010/12/31(金) 10:45:45
解決しました 原因はサーバ側でrecvのbufの使い方が間違ってました recvは必ず指定したサイズを受信するわけではないので 不便だと思い下のような関数を作ってたのですが おそらくはcのアドレスを直接渡したのが原因か またはcのアドレスをサイズ分移動させた後のアドレスと 固定のサイズの4096が一致しないのが原因かと思います 正しい原因は調べてないですが、改善例のように修正したら 問題なく動作するようになりました。 int recv2(SOCKET s,char buf[],int len){ char *c=buf; char wrk[4096]; while(1){ i=recv(s,c,4096,0);駄目な例 i=recv(s,wrk,4096,0);改善例 memcpy(c,wrk,i);改善例 if(i==SOCKET_ERROR){ shutdown(s,2); closesocket(s); return 0; } c=c+i; }
c を読み込んだバイト数分進めてるついでに len も読み込んだバイト数分減らしたうえで recv に渡す大きさを len に
winsockの非同期通信で1台のパソコンで通信のプログラムを作っています 送信側と受信側では同じサイズと間隔で送受信しています 送受信するサイズは4MBで、送信側は4MB送信できてますが 受信側は4MB受信しないで最後のrecvが0を返して終了します。 受信側でデータが無くなることは実際ありえるのでしょうか? ちなみに毎回決まったサイズ受信して終了します。
>>22 >送信側は4MB送信できてますが
ちゃんと戻り値を確認してのこと?
24 :
22 :2010/12/31(金) 13:39:22
ちょっと連絡が来ないからといって破局と決定するのはどうかと
>>25 普通どれくらい待つのでしょうか?
recvが最後に0を返しても送信サイズと受信サイズが一致しないとループし続けるように
コーディングしましたが、1分ぐらい延々とrecvが0を返し続けました。
27 :
22 :2010/12/31(金) 15:05:44
受信データを少し調べてみたら 途中のデータが欠損しているようです。 最後に特定の文字列を送信してそれは受信できていました。
28 :
22 :2010/12/31(金) 15:38:36
結局原因は分からなかったのですが、最初のデータが欠損していましたので 最初のデータを送信する前に1秒Sleepすると問題なく送受信できました。
>>22 ,28
なんか根本的に間違っていると思う。
やっているのは「非同期通信」なんだろ?
その場合、情報が常に必ず届くという保証がwinsock自体にない。
だから、届かなくてもいいような仕組みを持った通信経路を設計する。
これには色々ある。今の考え方では、すぐに行き詰まると思われ。
30 :
22 :2010/12/31(金) 16:06:38
>>29 申し訳ない
同期通信の間違いでした。
TCP/IP自体データが保障されていると思ってたんだけど
違うのでしょうか?
>>30 同期通信なら、保証されるが、それはバグがない場合だ。
何かがバグってるな。
あなたはここで質問するレベルですらないので
>>1 のリンクのサイトや本を見てからにしてください
??到達性に同期も非同期も関係ないだろ?
>>22 TCPなのかUDPなのか書け。
#UDPな悪寒。
逆。 メッセージ境界が保証されていないTCPで、メッセージ境界が保存されて いると仮定してプログラミングしてるんだろ。
>>24 で戻り値は確認していると言っているからおれはないと思うが。
ただSOCKET_ERRORかどうかしか見てなくて、実際に受信バイト数までは確認していないってことか?
>>36 Unixでも初心者に良くいるよ、こうかくやつは…
if (recv(sock, buff, BUFF_SIZE, 0) == -1) {
/* エラー処理 */
}
/* BUFF_SIZE 受信したつもりになりきって buff の処理 */
38 :
22 :2011/01/01(土) 17:02:14
>>34 TCPです
UDPは信頼性がなさそうなので
>>36 sendの戻り値でどうやって受信バイト数を取得すんだよ。
>>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 が戻ってきてれば終了するのではなく、またループに戻るようにする。
>>40 sendとrecvの戻り値は確認しています。
戻り値が0より大きい場合にその戻り値をlenとしてmemcpyするように
しています。
WSAEWOULDBLOCKについては知りませんでした。
ご指摘ありがとうございます。
TCP/IP通信でWSAAsyncSelectを使って非同期通信をしています。 データを適当なバイト数送るとします。 受信側がそのうち200バイトしか受信できなかったとします。 受信できるまでrecvループしようとしましたが、その間はそこで処理が 止まってしまうので、ウィンドウが固まってしまいます。 なので、一度だけ受信した後、一旦受信処理ルーチンを抜け、 また再度FD_READメッセージを待ちます。 そこで受信できなかった分を受信し、先ほど受信したデータの後ろにMEMCPYでデータを くっつけようとします そのためには先ほど受信したデータのバイト数を記録しておく必要があると思います。 さらに、相手は何バイトデータを送ってくるかわかりません。 この場合、まずデータが何バイト送ってきたのかを記録しとくところまではできますが、 何バイトまで受信すればよいのかわかりません。 単純にrecvがsocket_errorを返し、WSAEWOULDBLOCKを返したときが受信データは全て 受信し終わったと判断してよいでしょうか。
普通は送られてくるデータの先頭あたりにデータ長の情報が含まれる それをヘッダと言うことが多い どういう形の書式にするかとかを決めるのがぷろところろろr
ヘッダを作って、最初にその数バイトだけ読んでデータの大きさを調べて、 その分だけ受信するってことですか。 いろんなプロトコルがありますが、データサイズだけわかればなんとかなりそうなので、 自分独自のヘッダでも構わないんですよね?
馬鹿の考え休むに似たり
どうにかするわ
一度、標準入出力で書いてみりゃ良いのに… ストリーム故、同じ思考にいきつくと思うが (fgets はそうでもないか)
>>44 データ長があらかじめ判らないときには
データ末尾に終了符号をつけることもある
その場合データ中に終了符号と同じデータを含めることは出来ない
こういうのデザパタで何て言うんだっけ?
改行区切りパターン(いま考えた)
皆さんありがとうございます。とにかくやってみます!
まとめてやるんじゃなくて、1バイト毎にやったほうがいい時もある。
なにいってんだおまえ
>>48 ダサい設計だけど、HTTP1.0のようにデータの最後まで送ったら
ソケットを閉じるという方法もある。
別にださくないんじゃね、 ftp もそうだけど…
>>33 亀レスだが、非同期通信に到達性を保証する事は出来ないと思うのだが。
その点について俺が間違っているの教えてくれ。
まず第一に、非同期通信経路上位でのプロトコルによる同期は除いてくれ。
単純に非同期通信経路で、受信側がいつまでたってもデーターはこなかったとしよう。
その場合いつかはタイムアイトになり情報が所か無かったとしよう。
送信側は送信しているので、それが届いたかどうかは感知できない。
この場合どう考えても、情報の到達性を保証する事は出来ない。
ではないのか?
>>57 何を勘違いしてるのか分からないけど、あの文脈では同期/非同期
はAPIのモードの話で
同期:ブロッキング
非同期:ノン・ブロッキング
でしょ?
それともブロッキングのsend成功=到達とでも思ってるとか?
なんだ、ノン・ブロッキングの事を言っているのか、がっかりだな。 それを非同期の代名詞にして話す事自体がっかりだよ。あきれた
じゃあどういう意味の”非同期通信”ならTCPで到達性が保証できなく なるのかな? 昔の非同期モデム使ったPPP回線でも(TCPの意味での)到達性は保証 されているのだが。
それにブロッキング /ノン・ブロッキング を同期/非同期って 表現するのはごく普通に行われているよ。 なにせWinSockのAPI名がWSAAsyncSelectとかだし。
>>61 それMSの表現が馬鹿なだけw
だけど、 TCP 使って非同期な通信系ってのはどうゆう意味か説明してほしいな >59
非同期通信 非同期型API がごっちゃになってる?
言葉の定義の問題だから、おまえの中では非同期でいいんじゃない。 まあ、あまり大声で言わない方がいいと思うがwww。 それに、がっかりしたのも事実だし。言葉の定義はそれでもいいんじゃい。
参考までに、IT辞書のノンブロッキングの説明部分を張っとく。 通信相手との同期を取らない点では一種の非同期通信といえるが、いわゆる非同期通信が 単に通信相手からの返事を待たない(同期を取らない)というニュアンスであるのに対し、 ノンブロッキング通信では主に、通信処理の完了を待つことによって他の処理の進行を妨げな いことを表わしている。
66 :
62 :2011/01/05(水) 00:54:39
>>63 おれ?
TCP ってのは、 end-end 閉じてないとだめなプロトコルなのね
で、少なくとも、
syn -> syn/ack -> ack
で、コネクションつくって、 こんなやりとりするでしょ?
[data]/ack <-> [data]/ack
この状態が、成立してる限りにおいては同期処理系なのよ
つか、state-fullなプロトコルってのは、どこかで同期する必要があるのは当たり前
もっと上のところでやるのはあんたらの勝手だけど、どの部分指して言ってるの?
ってのが 62 の主旨
上位のAPIの動きで話が進むんだよね。 TCPの実際の動作がわかってない感じだから、どう言っていいのやら...
>>66 たとえば、HTTP/1.1は非同期。
レスポンスが返ってくる前に、リクエストを投げることができる。非同期だろ。
発端の
>>22 の「非同期」はWinsockの非同期系APIを指しているのだろうけど。
>>65 その説明書いた人良く分かってない感じ。
socket APIのブロッキングモードのsendは送信バッファに空きが
出来れば復帰するのであって、通信処理が完了するかどうかとは
関係ない。
チャット作ってます。 非同期通信をして、文字だけのやりとりはできるようになりました。 ですが、ユーザごとに名前をつけれてません。 名前付けたいんですが、名前のデータは文字のバッファに含めて送信すべきでしょうか? それとも名前は名前だけで送ったあとに、後から文字のバッファを送るほうが都合がいいでしょうか? 今はクライアント→サーバにメッセージを送ったら、 サーバから、サーバに接続しているクライアント全てにそのメッセージを送信し、 リアルタイムチャットを作ろうとしているところです。
この流れで「非同期通信」の質問は釣りにしか見えない。
>>69 じゃ、そこまできちっとしたら、ブロッキングモードの通信も非同期だなwwwww
腹抱えて笑うぜwwwwwwwwwwwwwwwww
Winsock2 : UDP : 鯖側 addr は INET_ANY で create & bind -- (*) WSAAsyncSelect FD_READ でパケ待ち パケ到着なFD_READをきっかけに recv & 内部処理開始 内部処理後の応答を パケ送信したピアへ戻したい... (*)のソケットに write ではうまくいかず
なぜwrite? recvfromとsendtoを使え
あ。 単純ミスorz recvfrom の末尾で ピアのアドレス受けとれるし…
新スレに今気づいた俺が横からレス
>>58 >>62 どっちとも俺の解釈と違う(と思う)。
まだデータが到着してないときにrecvした場合、
データが来るまで関数が返ってこないのがブロッキング。(1)
関数が返ってきて「まだない」と言われるのがノンブロッキング。(2)
データが到着したことがわかった後で、カーネルに「俺のバッファにコピーしる」
と要求したら、コピー完了後に返ってくるのが同期。(3)
コピー完了前に帰ってきて、コピー完了が別に通知されるのが非同期。(4)
と思ってる。
unixしか知らないひとがよく非同期と誤解してるのが(2)
MSが言ってる非同期は(4)
でないかな?
すまん誤解は言いすぎだ 用語の使い方がずれてんだよ、WindowsとUnixは。
適したスレがぱっと見当たらなかったのでここで質問させてください 今迄画像処理関連のプログラムばかりやってきて 4月からネットワークプログラムの仕事になりそうなんで 異動前に勉強したいんだが ネットワークプログラムする以前にネットワークに関する知識(スイッチングハブの知識、ネットワークの構成・設計、セキュリティetc)が無い 何かオススメの本あったら教えて
もう一個補足。Unix(Posix.1)で recv, send は「非同期I/O」とは呼ばない。 「非同期I/O」は aio_read, aio_write のこと。 aio_readなんて誰も使ってないだろうけど、 Windowsで言ってる非同期はまさにaio_xxxなんだぜ
>>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という
システムコールは(まだ)存在していない(はず....)。
>さらに(3')としてノンブロッキングモードの同期recvが加わる。 だな。 そのノンブロッキングの同期が一番おいしいのに そこを飛び越えてしまったのがWinsock2
ふつーIO完了ポート
何で非同期IOの方が効率がいいっていわれてんの?
待たなくていいから待ってる間に他のことが出来る
90 :
デフォルトの名無しさん :2011/01/11(火) 16:53:41
インタラクティブなアプレットをなにか作らないといけないのですが、誰か助けてください
おせちアプレットでも作ってください。
重箱におせちを詰めるゲームか
ボリュームが足りないくらいがちょうどいい
94 :
デフォルトの名無しさん :2011/01/12(水) 08:46:27 BE:1197386429-2BP(0)
>>84 ,
>>85 レスありがとうございます。
スレ違いにも関わらず…助かります。
IPv6 そろそろ端末側も本格対応が必要なのかな なんかITProの記事では、v4アドレスが2011年2月に 枯れるとか言ってるんだがホント?
去年10月の時点で残り7ブロックとかそういう話でしょ。 それまでのペースを維持すれば、当然3月くらいまでに無くなるよ。
HTTPプロトコルで Accept-Encoding: gzip Range: bytes=41318- として、順次差分をダウンロードしたいのですが gzip圧縮された差分がgzipのヘッダー情報を含んでいるらしく レスポンスのContent-Lengthと食い違いが生じてしまいます この場合の定番の書き方はどうなっているのでしょうか? それとも差分ダウンロードと圧縮は同時に使用しないものなのでしょうか?
> gzip圧縮された差分がgzipのヘッダー情報を含んでいるらしく > レスポンスのContent-Lengthと食い違いが生じてしまいます ダウンロードした圧縮差分を順次つなげていっても 元のgzipファイルにならないという意味です。念のため
HyperText Transfer Protocolプロトコルですか。 馬から落馬しそうですね。
何を転送しようとして何を期待して実際どうなったのかさっぱりわからん・・・
単に複数レスポンスをそのままファイルマージしちゃっただけのような 1レスポンス→unzip→マージ じゃないのかなぁ…
リソース本体 - CTE: gzip 処理 - 部分抜き出し(こいつの大きさが CL) - ヘッダ追加 の順を期待してた 流れてきてるのは リソース本体 - 部分抜き出し - CTE: gzip 処理(こいつの大きさが CL) - ヘッダ追加 の順だった プロトコルとして正しいのはどっちかは知らない
すいません、説明が悪かったです やりたいことは2chのスレッドのダウンロードです 最初はAccept-Encoding: gzip、Rangeでダウンロードして展開したファイルのサイズを渡していたのですが、 416 Requested Range Not Satisfiableが着てしまってダメでした。 gzipの位置ではないかと推測して、 今度はダウンロードしたgzipのサイズを渡して、差分のダウンロード自体は成功したのですが、 展開すると、一番最初にダウンロードしたブロックしか展開されません。 ファイルの残りの部分は無視されてしまいます。 ここまでやって混乱してきたのでご相談に上がった次第です よろしくお願いいたします
差分DLに成功して最初にDLしたブロックしか展開できないの意味が分からないけど、 rangeの書き方あってる? 結合してないよね?
>>105 Rangeはこんな感じです
Range: bytes=104672-
gzipファイルが15kで展開したファイルが10kになっていたり、
差分を元ファイルに結合していっても最初の10k分しか展開されません
Rangeには保存したgzipファイルのファイルサイズを渡しているのですが・・・
gzipを直接結合する事はできませんよ 一度展開したもの同士を結合して再圧縮する事はできます 1、まずgzip ,no-rangeでリクエスト gzipのサイズをメモ gzipを展開して処理 2、gzip ,range:gzipのサイズ-でリクエスト(304以外なら) gzipのサイズをメモ、1のgzipサイズを足す gzipを展開して処理 3、gzip range: gzipのサイズ(1+2)でリクエスト(304以外なら) 以下略
>>107 451. デフォルトの名無しさん [sage] 2006/05/26(金) 19:44:35
Content-RangeとAccept-Encoding:gzipを同時に指定すると、
httpの意味上からは、「gzip済みのdatファイル」の途中から
しか送ってくれないので役に立たない。
Transfer-Encoding使えばいいんじゃね
ごめん、確かによく考えたら共存できないな 物理的に圧縮アルゴリズムから全体圧縮済みサイズと一部圧縮が、非圧縮時の比例と一致するとは限らないな
>>106 です。レスありがとうございました
>>107 ,108
いろいろやってみましたが、
Content-RangeとAccept-Encoding:gzipは共存できないみたいです
初回だけgipにすることにしました
>>109 ちょっと見てみましたが難しくてよくわかりませんでした
余裕ができたら調べてみようと思います
禿から取り上げるべき。
親機ルーターだけだったのを、PCを1台追加して、無線で子機ルーターを接続しました。 すると、今まで出来ていた、WinSockの関数では、接続できなくなりました。 どのように回避すればいいのでしょうか? お知恵を貸してください。
俺のエスパーによれば、子ルータをアクセスポイントモードに設定するといいらしいよ
>>116 回答ありがとうございます。
アクセスポイントモードってプログラミングで出来ます?
ググってみると、何か・・・違うことのような気がして・・・
まぁエスパー回答だから外れることもある、仕方ない ちゃんと判断するには情報が足りない ネットワークの構成図を書いて、どこからどこへ接続したいのかとかを説明するべき
>>118 ネットワーク構造図といわれましても・・・
親機1台があり、それをハブ・・・でいいのかな?を使って、接続できる部分を増やして、
有線で片方のパソコンを繋ぎ、さらに無線ルーターを繋いで、もう一台の方に繋いでいます。
作りたいのは、簡単なチャットプログラムで、
他のPC(ネットワーク上)と、テキストのやり取りをしたいと思っています。
独学ではじめ、ネットワークを使ったプログラムの練習をしています。
>>119 何処に無線ルーターをつないで、もう一台に繋いだんだ?
もう一台ってPCか?
有線で繋いだのか無線で繋いだのか?
無線に決まってるとか言うなよ。どう繋いだかはお前にしか判らないんだよ。
親機っていうのも無線ルーターだよな?それに無線で繋いだのかもしれないしな。
文章でも良いから曖昧さのない様に説明しろ。
これがネタニマジレスか
>>120 親機は有線、子機は無線です。
繋ぐのはPCです。
>>122 正確な図、ありがとうございます。
そのとおりです。
>子ルータをAPモード
この時点で詰みそうですが、ググリながらやってみようかと思います。
まず、APモードとは何かから探さなければ・・・
>pingは通る?
192.168~~のデフォルトゲートウェイに、pingを試したところ、
ちゃんと通ってるようです。
それと、ipconfig /allで確認したところ、
192.~.1と192.~.2しかありませんでした。
>>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になってる?
ルータの説明書を読むべき
>>124 1:知りませんでした。
2:なっています。
3:なっています。
4:なっています。
>>125 それもそうですね・・・
読み直してみます。
ipv6のパーサ書いてて構文上はOKみたいなんだけど 2文字のコロン「::」もIPV6のアドレスとして有効な表現なの?
>>127 それは 0 を省略した形
~:0000:~ なら ~::~ にできる
130 :
127 :2011/02/08(火) 22:24:03
えっと、一応その形式は知ってるんだが 疑問なのは数字なんか付かない、まさにコロン2つ「だけ」の場合 ABNF抜粋すると問題の箇所は ipv6address = | //色々なケース | //色々なケース | [*6(h16":")h16]"::" となってて、[]は省略可能なんで 他に全く数字の付かない「::」のみのケースがあるのよ
131 :
127 :2011/02/08(火) 22:25:40
あ、失礼、それも含めて「::」=0ということか
132 :
127 :2011/02/08(火) 22:27:55
うぜえ
書き忘れましたが最初の取得だけはうまく出来ます 差分の取得のはずがうまく出来ず、こうなります 返ってきたdatを"\n"で区切ってString[]に入れたものです デバッガで見る限りではレンジやモディファイは正しいと思われる値にはなっています・・・
ログをまったく読んでない上にテキストでなく画像とか喧嘩売ってるんだよな?
マルチキャストの受信をしているのですが、ブロードキャストで送信されると受信してしまいます。 何故なのでしょうか?
同じ部屋に居る椰子が大声で騒いだら聞こえるのと同じ。 黙って無視すればいい。
139 :
137 :2011/02/20(日) 22:59:15.93
140 :
デフォルトの名無しさん :2011/03/05(土) 06:38:28.58
ネットワークプログラミング初心者なのですが、何から始めればよいでしょうか。 よくソケットからと言われますが、具体的にどういう処理から始めるのでしょう。
適切な言語とフレームワーク使えばソケット気にせず書けるようになる
>>140 > ネットワークプログラミング初心者なのですが、何から始めればよいでしょうか。
お約束だが、「やりたいことを見つける」ことからかな。
winsockで通信ソフトを作っているのですが、ある利用者の環境では socket関数でINVALID_SOCKETエラーが発生したそうです。 XP SP3では一度も発生したことがないのですが、原因が分かる方が いましたら、ご教授下さい。
・WSAStartupの戻り値は確認しているのか? ・ある利用者の環境ってのがどういう環境かわからない
> ご教授下さい。 どこの馬の骨かわからん奴を弟子に取る気はないが、俺だったら、 WSAGetLastErrorを仕込んで置く事を忘れなかったな。
IPv6インストールしてないのにPF_INET6使おうとしたとか?
>>144 原因はそんな情報で分かる人間が居ると思うような奴が
作ったプログラムだから
おまえらって、TCP、UDP、IPライブラリの組み込みへの移植とかやったことある
ソースくれ
>>153 必要なら買うなり、OSS使うなりしなよ。
ゼロから作ってデバッグするのは大変だよ。
そうだね どっかのPICのソース流用しようと思ったけど プロトコル完全実装じゃなくて かなり適当に必要最小限しか作ってなくて 結局参考にならなかったな
154じゃないがuIPあたりは?
質問させてください。 XP環境では問題ないのですが、Windows Vistaで s=socket(AF_INET, SOCK_RAW, IPPROTO_IP); とするとエラーになります(INVALID_SOCKETを返す)。 目的はWindows7からチカチカ点滅しなくなった タスクトレイのネットワークアイコン(通信の有無を示す)の自作です。 (有無だけに注目して内容を見ないパケットモニタのようなものです。) ネット上で調べた結果、Vistaからは上のことは無理で それをやりたければWFP(Windows Filtering Platform)とやらを 使うしかない、という答えに現時点では行き着いています。 実際、1.うん、WFPを使うしかないね。なのでしょうか。 それとも2.いや、他にやりようがあるよ。なのでしょうか。 さらに質問すると、Windows7をご利用されている方は タスクトレイのネットワークアイコンを見ても通信の有無が わからないことについて、どのように解決(もしくは許容)されていますか?
setsockoptでTCPの再送間隔と再送回数を制御したいんだけど なにをいじるんだっけか
160 :
デフォルトの名無しさん :2011/03/17(木) 14:18:52.60
おっぱい!
>>159 OSは?
*BSD なら sysctl で設定
Linux なら /proc で設定
Windows はしらん
その他の Unix なら man よめ
>>161 setsockoptで制御したいんです。
>>161 ワロタ、setsockoptで言っているのに
いつもトンチンカンなことをして周りに迷惑かけてるんじゃないか
>>163 sockopt インターフェースは, カーネルのソース読むとないな, *BSDとLinux
Windowsだってソケットごとには設定できないよ
>>161 Linuxだけどさ、どこで設定するのよ
そんな設定箇所無いよ
憶測でモノを言っているの?
教えてください。 もしスレチでしたら誘導をお願いします。 以下のようなことをしたいとお勉強中です。 ・snmp を使用してネットワーク上の機器の状態を管理する ・状態の取得には snmp の trap を使用する ・ネットワーク上には snmp のバージョン v1 と v2c の機器が存在していて両方に対応したい ・当人はソケットを使用したプログラムは経験があるものの、ネットワークそのものは初心者 で、質問です。 ・v1 trap の PDU には Enterprise などがありますが、v2c には存在しません。 これは v2c では取得できないということでしょうか。データ部に存在するのでしょうか。 ※できれば v1 と v2c の実処理を行なう箇所を同じ処理で統一したいため同じデータを取得できたら便利だな、と ・v2c trap の PDU は v2 のものと構成が同じであり、 Comunity の部分だけが v1 と同等であるとの認識は正しいでしょうか よろしくお願いします。
誰かツイッターapiについて詳しい人いませんか? api制限で150回までに制限されてしまうのは仕方ないのでしょうか? でもtweenとかは常に最新の状態に更新出来ている気がするのですが。。 あれはどうやっているのでしょうか?
>>169 APIを使わなくても見れる情報なら、APIを使わなければよい
>>169 >api制限で150回までに制限されてしまうのは仕方ないのでしょうか?
いいえ。
個別に交渉すれば、割と簡単に制限を緩めてもらえるみたいです。
>>170-171 API使わなくても見れる情報というのは例えばどんなものでしょう?
個別に交渉するということはどういうことですか?
>>172 ブラウザ使ってツイッタ見た事ないのか?
html 取得すればよい。鯖負荷は・・・・。
やはりその方法でしたか。 鯖負荷ってどれぐらいのアクセス数なら大丈夫でしょうか? 一秒1アクセスはやっぱきついですかね?
>>174 WEBアクセスでも認証なしで同一IPから何度もアクセスしてるとAPIと同じようにブロックされるよ
1アクセス/1秒は、偽計業務妨害の疑いで逮捕、20日間勾留されるくらい、悪質な行為。
逮捕されるところでした・・ ありがとうございました・・
ブチこまれた前例つくっちゃってるからな 前例がある事は容赦なく捕まえるぞ警察は
>>176 無罪になったんだから別によくね?
拘留期間中の分お金もらえるし
不起訴処分と無罪はまったく別物だぞ
有罪だが罰はほぼ勘弁してやった、という結果だったよな
懲りずにやる奴が出て売ると、有罪+実刑になるパターン
毎秒ごとに株価とか為替採りたいと思ってた所だったw 前例有るのかw
岡崎図書館 岡崎市立図書館 で検索してみ
ネットワークプログラミングをやってる人間であれば、知っておかなければ恥だ
恥で済めばいいが、人生終了しかねないからな
187 :
デフォルトの名無しさん :2011/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の時間を判断できますか? よろしくお願いします。
各fd毎に最終受信時刻を記録しておき、selectに入る前にチェックする。
今、Winsockの勉強でパケットキャプチャを作成しているのですが パケットがどのアプリケーション宛に送られて来たものなのかを 特定する方法はあるのでしょうか? よろしくお願いします。
>>190 「netstat -b」で「リッスン ポートの作成に使われた実行ファイルを表示」できる。
(手元のWindows 7で確認した)
これをパケットと付き合わせればよいかと。
>>191 こちらはXPですがその方法でやれそうです。
ありがとうございます。
おおっすげーと思ったが、 これ/etc/services参照してるだけだろw
ほほう、linuxだと netstat -p でできるようだ。 いいこと聞いたありがとう
>>168 そもそも
「v1 と v2c の実処理を行なう箇所を同じ処理で統一したい」を
「同じデータを取得」で実現するなら最小公倍数の項目で
やるしかないからこの場合は無理。だいいち
Enterprise=ベンダが勝手に定義して勝手に使うところだろ。
SNMPバージョンどころかベンダとか、最悪機器ごとに
処理変わるじゃん。アホか。
SNMPには落とし穴がいっぱいあるから
(例えば32ビット数は5バイトで表現されるから気をつけろ)
目的や対象機器を具体的にせまく絞って始めないと苦労するぞ。
大した目的がないならトライ&エラーで勝手にガンガレ
196 :
デフォルトの名無しさん :2011/03/27(日) 20:32:46.13
こんばんは。 ソケット、プロセス間通信でポインタを含む構造体を送受信したいのですが、どうやればいいですか? ポインタをそのまま送るのはNGだと聞きましたが。。。
送り側がデータをftpサーバにアップして 受け取り側はftpサーバからダウンロードしたほうが簡単だと思う
>>196 > ポインタをそのまま送るのはNGだと聞きましたが。。。
同じアドレス空間で動いていないから、ポインターのさす先を別途送りつけるしかない
その先にポインターがあったらさらにもう一回… … …
199 :
196 :2011/03/27(日) 21:06:19.64
>>197 ソケットを使うことが条件なので。。。
>>198 構造体をポインタがない構造体にしてから送るしかないですよね。。。
ありがとうございました。
200 :
196 :2011/03/27(日) 21:25:36.74
>>198 何度もすいません。
構造体が線形リストの場合(データが何件あるかわからない場合)、
どのように展開すればいいですか?
最初にデータの件数を数えてその個数を送るか 1件送るたびに次がまだあるか無いかを示すフラグを送るか
202 :
196 :2011/03/27(日) 21:30:50.90
>>201 なるほど。。。すごいなぁ。
ありがとうございました。助かります
やっぱりftpで送ったほうがいいと思う (まだわかんねえかな~)
ポインタ受け取ったら実体を要求すればいい。
205 :
196 :2011/03/27(日) 21:39:35.27
>>203 すいません。
ftpで送るってどういうことですか?
ソケットとは違いますよね?
ソケットは手段 ftpは通信規約
>>195 レス、hx
言われることはもっともなんだけれど、そういう風に要求されてしまったので可能なのだろうかと調べていたところで。
数値の扱いなども言われるとおりでちょっと苦戦していました。
※その後、もともとのプログラムが v2c に対応していないことが判明しました。w
もうちょっとがんばってみるです。
ありがとうございました。
SNMP廻り全部自前で書くの? 結構難しいよ。ただただ面倒だし。 出回っているライブラリーのソース読めば その辺のことは大体分かると思う。
ポインタを含むデータ構造通信の件、おいら大好物。 ゆっくりでよければ教えるよ 問題なのは、最近のOSではメモリが確保される具体アドレスは マシンごとに違うから、単にメモリアドレス値を渡しても 普通うまくいかんっつーことだな。 レアなやりかたで、メモリが確保されるアドレスをそろえてしまう ってのもある。 オイラが好きなのは、データパケットの先頭をゼロとして ポインタ値をオフセット値に変換して通信、 受信側はオフセットをポインタ値に戻す、ってやつ。 "シリアライズ"で検索するといろいろでるよ。 あと、.Net等で同一マシン内の違う言語で構造体データ渡すのにも 似たテクを使うんだが、それは検索キーワード"マーシャリング"だ
> レアなやりかたで、メモリが確保されるアドレスをそろえてしまう どうやって? 相手のマシンが同じアーキテクチャである保証はない ましてや同じOSである保証はさらにない > データパケットの先頭をゼロとして > ポインタ値をオフセット値に変換して通信、 同一オブジェクトへのオフセットは, 当然, 考慮されてるんだよな こっちでは a -> x, b -> x あっちでは a -> x, b -> y だったら洒落にならないんだが…
すまん、根本の話がすっとんでた。順番に書くと (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は無理だろ
浅い話を長々書くな
213 :
デフォルトの名無しさん :2011/03/30(水) 10:07:58.23
>>211 > ポインタを含むデータ構造通信の件、おいら大好物。
> ゆっくりでよければ教えるよ
と宣言したんだから、
>>200 も考慮してきっちり教えてやれ。w
なんかフォールトレランスシステムで、同じシステム上で同じアプリが複数動いてるのを前提にしてそうな環境だな。 お互いにポインタで参照し合って相互に確認しながら、動作するプログラムが組めそう。
インデックスなら
216 :
デフォルトの名無しさん :2011/03/30(水) 16:47:20.77
,. ' ´  ̄ ̄ ̄ ̄ ̄ `ヽ、 / / \ / / \ / /―――――――――イノ / /: : : : : : : : : : : :| | ,' ,∠ __________/ | | <__:.:.イ:.`メ、/|:/ |:./\レ:.:.〈 | ノ! |/リレ',ィrそド"´ レ ィチxV:.!:.V} /| /!:.:.! 〈. トzリ トzリ }:!::Nリ / /ソ:.:.i xx`¨´ , `¨x{:从 } / //|:.:.込、 /:.|.ハ∧ なんかわたし / /厶|:.:.|\ ヽ、 r つ ,. く:.:.:! ∧ ヽ 呼ばれた気がするんだよ? / / |:.:.|::::::> ミ 、 <} |::.:| ヽ. } /i 〃 レ‐‐く\  ̄´ /::! !:.:<フ二ヽリ ./ // / /⌒く:\ イ:::::| |:. 厶--、 } / / ( /,. ┤:::::ヽ /::::::| |:.厶--、 /
どんなパケット形式を使うにしても、 (a)循環参照をどうするのか (b)同一値のエントリが2個以上あるのか とか、 そのシステムではどうなのかちゃんと 調べて設計の前提条件にしないとダメよ。 ーーーー リンクリストは後にして、まず文字列のポインタで例だそう。 1エントリに 固定長サイズの部分と可変長サイズの部分があるとするだろ。 struct Hoge { uint32_t num1; uint32_t num2; char *str1; char *str2; } したら、俺ならこの1エントリに対して例えば
|----+----+----+----| |entrySize-------| //パケット独自項目 |num1------------| //ここから固定長部分 |num2------------| |str1Offset------| //データとパケットで違う項目 |str2Offset------| //データとパケットで違う項目 |str1の中身........| //ここから可変長部分 |.....文字列おわりnull| |str2の中身........| |.....文字列おわりnull、4バイト切りいいところまでnull| とかの形でパケット化するんだわ。 受信側は、 entrySize分のメモリを用意して、 num1~str2の中身をコピーして、 str1Offsetとstr2Offsetの値を書き換えてやれば struct Hoge のできあがりと。 これは例だからもちろん他のやりかたでもよし。
で、循環参照や重複エントリはないシステムだとして、 双方向リンクリストだったら、 エントリ->前,次 と書くとして e1 -> null, e2 e2 -> e1, e3 e3 -> e2, null をパケットで表現したければ、パケットにはアタマから ヘッダ(エントリ個数3、とか) e1 e2 e3 とならべる。 それぞれのポインタを指すフィールドには、パケット先頭からの e1,e2,e3先頭のオフセットを格納しておけばよい。 ヘッダがあるからnull値と先頭エントリの区別はつく。 つたわるかな?
offset くらいググろうよ(;-;) 昨日の書き込み見てもわからん? どんなシステムでも使えてかつ高速な、夢の方法はない。 どんなシステムでも使いたきゃ 実行コスト払ってXMLなりJSON使う。 [アドレス固定]の話は...man shmat 参照。 でも使える場面はかなり限定されるよ。
>>222 ごめん、質問が悪かった。offsetを何に使うのか。
データさえわかってしまえば、送り先のメモリアドレスな
んて必要ないと思っただけ(offsetってそういう意味じゃない?)。
json,xmlならそんなことしないから使い道が気になっただけ。
ごめ、「送り元」のアドレスだったorz
循環やら重複エントリを扱いたかったら、まずはその元データについて 全エントリを重複無くたどるアルゴリスムを考えてみれ。 ソコまでできればあとは楽勝だろ。
受信したマシン上で、struct Hoge を再現するんだろ。パケットではoffset を入れてるところに、受信マシンがアドレス値を上書きして、struct Hoge * として読むんだよ。 C言語はわかってるんだよな?
あああ、疑問点わかった。 ウム、文字列途中にnull が入らないことが確定なら確かに値だけでも 問題なく伝わるね。 それでもイイヨ。受信データと再現データを完全に別にするなら。
あああ、意味分かった。 num1からstr2をまるごとコピーして、各offsetに コピーしたstr1, str2のアドレスいれれば再現可能って訳ね。 で、可変の場合は各エントリのoffsetをたどって同じこと 繰り返す、と。失礼した。
net-snmpの場合、usage:にOpaqueで扱える型が出力される。 NETSNMP_WITH_OPAQUE_SPECIAL_TYPES定義でコンパイルされていれば。
>>230 ありがとうございます。
usage に見当たらないので、、、残念。
inform の返信先についても、分かる方がいらっしゃったら教えてください。
WinSockでUDPのプログラムを組んでるんですけど、 ポートはbindしてて、INADDR_ANYでsendtoしたときに、 実際にrecvする側で送信元として受け取るアドレスは、 送信元のどのアドレスなのでしょう? 「どの」っていうのは、送信元のマシンにはエイリアスで アドレスが複数追加されているので・・・ INADDR_ANYで送信するときって、送信元として入るアドレス選択に きまりはあるのでしょうか?
bindしてれば、そのアドレス してなければ、出て行ったインターフェースのアドレス ただWinSockはいろいろ斜めを行くから…
>>232 >INADDR_ANYで送信するときって、送信元として入るアドレス選択に
>きまりはあるのでしょうか?
ホストのルーティングテーブルでネクストポップを決定して、
そのネクストポップと同じサブネットのアドレス。
>>233 >してなければ、出て行ったインタフェースのアドレス
232が聞いてるのは一つのインターフェイスに複数のIPアドレス振ってる時の話でしょ。
同じNICに二つのIPアドレス振ってるときは 出て行くのはプライマリのIPアドレスからになる
>>235 んなわけあるかい。
「プライマリの」なんて概念が前時代的。
237 :
232 :2011/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へ持っていくと動作が変わるので、
これをなんとかしたい、というのが背景です。
INADDR_ANYをやめる
Linuxのソケットで まだreadしてないたまっているバッファをすべて破棄するには どうするのが一番スマートで速くて格好いいデスか?
select, readループ
242 :
232 :2011/04/14(木) 18:19:21.77
自己解決しました。
結論から言うと、OSの仕様でした。(無印Win7しか確認していませんが)
http://support.microsoft.com/kb/2386184 ↑のKBの修正Hotfixを当ててから、
netsh で skipassource=true にしてエイリアスのIPアドレスを
同一NICに追加してやると、プライマリ相当のアドレスで返ってくるようになりました。
またこのとき、route print すると Gateway と Interface がプライマリ相当のアドレスになることが確認できました。
>>236 さんの言うようにプライマリという概念がそもそもなくなってるともいえますし、
OSの動作が、XP/2003Server → Win7/2008R2 で変わったともいえると思います。
まあプログラム側がOSの仕様を決め打ちした動きになってるのが悪いんですが・・・w
とりあえずOSのアップデートか、
>>238 さんの言うようにプログラム側で対処するか、
どちらかで検討します。
お騒がせしました。
くっそ ソケットに対してlseekするとエラーになるんじゃん!
いやいやいやいや 常識的に考えて出来るはずなかろう?
向こうが shutdown で閉じてれば あるいわ… ってTCP限定の話になっちゃうか soket 閉じて開きなおすのはマズイのだろうか と戯言
shutdownマナーはFAQです。よく読んでください。
>>244 lseek を実装して、現在あるバッファを読み飛ばす(捨てる)だけは可
にすればいいんだがまぁ、対称性に著しく書けるインターフェースだわな
248 :
196 :2011/04/14(木) 21:52:01.14
ソケットでのプロセス間通信について質問です。 AとBのプログラムで通信する場合ですが、こういう認識で合ってますか? プログラムA プログラムB ↑ ↑ ユーザランド -----|-----------------|--------- プログラムAの プログラムBの ソケット←ーーーー→ソケット カーネル
↑ 名前の196は関係ないです。 すいません。
プロトコルスタックがカーネルにある必要は無いし、 逆に、インカーネルなhttpdとかありうるし。
NFSサーバとかカーネル内にある。
254 :
デフォルトの名無しさん :2011/04/15(金) 00:08:01.48
インターフェースがupされた直後に いくつかのソケットでconnectし始めるプログラムを実行すると 一番最初のconnectはつながるまで約3秒かかるのに ほぼ同時ながら別のスレッドでconnect呼ぶところではほぼ即座につながる ってことが起こるんですが、何が原因でしょう? あと、一発のconnectの待ちを短くしてやるにはどうすればいいでしょう?
DHCPとかDNS引いてるんじゃない?
ああすいません インターフェースは固定IPでupさせてます あと、接続もIPアドレス直です 1回目のconnectと2回目のconnectは同一ホストへの接続で ポート番号が1個違うだけなのに2回目の方が先につながるのが納得いかない。。
ARPが必要だけど、そんな時間かからない。 OSは何?
linuxです ひょっとしてarpテーブル見に行って該当無かったら arp投げて3秒後synリトライしているとか?
ARP終わらなければパケット投げられません。 リトライになるはずないです。 ルーティング設定も手動ですか? DNSの逆引きが行われてませんか?
ethersharkでパケットダンプすれば?
>>259 ルーティング設定も手動、DNSの逆引きは行われていないと思います。
>>260 wiresharkが使えればよいのですが
組み込み系かつWiFi直結間での通信なので・・・
とりあえずノンブロッキングで
connect→close→connect
ってすると即座につながったのでこれで良し?
Peerも組み込み? PeerをPCにしてperrでwireshark動かせば?
>>264 たとえばWindowsのIISのHTTPサーバーはカーネルで動作するように実装されてた。
パフォーマンス優先で設計すると、そうなる。
されてたってまたユーザモードに戻されたの? カーネルモードに移動したのがServer 2003あたりの比較的最近だった気がするけど ちなみにLinuxにもカーネルモードのhttpdがある
NFSもカーネルモードのがあったな
あったなじゃなくて、元祖のSUNの実装がインカーネルなんだよ。 坊やならしょうがないけど、人前でそういう発言しな方が良いぞ。w
>>271 システムコール呼んだら2度と帰ってこないって、あれだっけ?
まぁ、当時はカーネルスレッドなんかなかったからなぁ
>>271 元祖の話とかしてどうするの? 懐かしむの?
NFS-3GもFUSEからカーネルに取り込まれたよ。
275 :
デフォルトの名無しさん :2011/04/18(月) 17:03:04.79
>>273 しょうがないよ。坊やが生まれる前からある技術だから。
今はもう使われてないしなぁ
おじいちゃんは昔話好きだからな。 今頃バブルの話とか太古のアイドルの話しても分からないってw nfsに限らずファイル周り呼んだら帰って来なく成るって多いorz 無線だと無線の物理層のリンクもいろいろごにょごにょしてそう。 ipで下位レイヤを気にせず使える分、いろんな状況を想定する事が求められる。 被災地の観測機器にパケット飛ばしたら、無線基地局が流されて消失してたとかね。
都会ね。
ちょっとお尋ねします。 サーバからデータをpush送信したいと思いってます。 ちょっと調べた範囲では余りよく分かりませんでした。特にプログラミング言語で当該機能を実装するような具体的な例を見つけることができませんでした。 何かヒントとか、または、ここを 見れば分かりやすいよ、とかありましたら、よろしく願いします。 なお、サーバはwindowsでクライアントはandroidです。
.NET framework4.0とC#で非同期TCPでソケット通信してバイナリデータの 送受信クライアントアプリ作ってみたいな~ なんて思ってる人生の初心者です。 invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとかもうちんぷんかんぷんです。 基礎からじっくりと使い方の学習してみたいのですが、お勧めは何かありますでしょうか? コードの断片だけじゃてんで頭にはいんないし、書籍は○○層があってだなとかフレームの中身の話とか で、言葉の定義で実際にはソケットよりもNIC担当の処理内容に紙面を費やしてたりと 意欲だけ空回りで、てんで前進してる気配がないので、お助けください。
> invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとか それはネットワークとは関係のないC#自体の話ではありませんか ネットワークの話とは分けて勉強した方がいいと思いますが
確かにそうかも。 送信した後に非同期で受信した側の処理を身に付けたいんですけど ソケットの使い方じゃなくて、非同期の勉強でつまづいてるってところが大きいですね。 非同期だとF10押していってもデバッグ出来ないですよね?別スレに行ってしまって。 どう試行錯誤していいのか、先ずそんなところから錯誤してますです。
winsockでプロセスが生成しているソケットを 列挙するようなI/Fがありますでしょうか?
ない。
>>284 WinSockには無い。
IP Helper APIを使う。
ご存知の方いらっしゃれば助言頂ければ幸いです。 NAT越え関係のプログラミングを作らないといけないのですが 何をどうすればよいのやらで、行き着いたのが uPnPでのポートマッピングに行き着きました。 諸所の本、サイト等は見て回ったのですが、 「マルチキャストでM-SEARCH」の一点張り マルチキャスト(UDP)で送信しても受信側がどうしてもできない? ※sendtoでの戻り値状は送れていると思うのですが。 といった所で、このGWをほぼ潰す結果になりました(´・ω・`) 何か コレみれば(・∀・)イイ!! といった物はありませんでしょうか?
288 :
287 :2011/05/05(木) 05:03:06.46
補足:環境は、Win32のVC++です。
>>287 Microsoft Windows SDKのサンプル。 google依存症だな。
無理(無駄)なことをしてるだけのような
使ってるルータがちゃんと対応してるかどうか調べたほうがいいよ。 それからどうでもいいことだけどUは大文字。Universal Plug a'n'd Play
そもそもnat自体異常なインタ-ネットだからねえ。 せっかくの双方向性捨ててる。 natの内側からのコネクションの帰りにデータ詰めて流すしか無いと思うよ。
>>292 > しか無いと思うよ。
そんなことはありません。
じゃあどんなルータでも外から通る方法を示してくれよw
296 :
デフォルトの名無しさん :2011/05/13(金) 13:53:09.20
「natの内側から」という条件が「どんなルーターでも」にすり替わってる。
>>294 の低能ぶりがいかんなく発揮されているレスだ。
297 :
デフォルトの名無しさん :2011/05/13(金) 15:30:54.66
プログラミングど素人なんですがど素人の状態からSNSサイトを立ち上げようと思ったらどれぐらい大変なことですか それとSNSサイトを作る場合のお勧め言語とかありますか? 詳しく教えてもらえると助かります
298 :
デフォルトの名無しさん :2011/05/13(金) 15:38:59.87
ちなみに一人で立ち上げる場合です
300 :
uy :2011/05/16(月) 03:07:15.98
SNS? Rubyが良いんじゃないかな。 Rubyはatpagesとかで動く 言語覚えたら1ヶ月で作れるんじゃね 飲み込み速ければ1週間じゃね Web技術はプログラム的難しさよりも動作環境を整える事が難しいけど ようは一行目に#!ruby なんとかってかいてファイル属性を755にしてrun
俺ならPythonで1日だ!!
perlで3時間 ・・・てとこですかね
それrubyで一行でできるよ
テンプレにある「Webプロトコル詳解」って絶版なの? 前の職場で人のを借りてて良書だったし買おうと思ったら本屋に取り寄せられないって言われた。
本屋で理由を聞けよカス
恥ずかしくて聞けるわけねーだろボケ
amazonに中古があるみたいだけど
ほー、ブクヲフで見かけたら捕獲してみるか。 内容的には古過ぎて役に立たなさそうな気がw
そういえば俺が差がしたときもネットの古本ですら在庫なかったわ。 しかも在庫切れ前野縁談結構してるところ多かったから 内容がいいだけに古本があまり出回ってないのかもな、 ブクオフのネットだと安かったが在庫なかった。 たまたまオークションでそこそこ安く買えたがラッキーだったのかね。
タイプミススマソ >しかも在庫切れ前野縁談結構してるところ多かったから しかも在庫切れ前の値段結構してるところ多かったから
IPv6Day は何事も無く終わりましたとさ
>>304-309 良書ほど日本人の素人に取っつきにくくて、売れないのかね
絶版になったり、改訂版が出なかったりするんだよな
「UNIXネットワークプログラミング」も原書はとっくの昔に改訂されているのに
邦訳はいつまでも2版のままだもんな
まあ良書は新しいことだけ自分でネットの文章などで補間しとけば今でも役に立つが、
新しいこと書いてあっても中身糞なのは役に立たないんけどなw
>>313 IP V6関連の増補とか、SCTPやIPsecが追加されたとか、細かいところいろいろな。
第3版出たの9年前だが、いつまでたっても邦訳改定されないので、
2年後ぐらいに原書買ってしまったんだが、まさか10年近くたってもまだ出ないとは
思わなかったわw
おおIPv6とSCTPか。ほしいな。 でもIPv6って10年前と今とでわりと結構違うくね? 第4版まで待って買うかね
>>312 良書は必ず読むって層が英語で読んじゃうからね。
実際実装していく上での疑問点はrfcを確認することになるから、需要がある層が英語おkだったりして日本語版の必要性が低い。 ietfとかの国際会議で議論までしちゃう連中だと、日本語版を買う必要性も無いだろうな。現地で英語版買ってそのまま日本でも読み続けてると思う。
翻訳がひどいの多いしね。 全部カタカナにするだけでいいんだが・・・
固有名詞だとむしろ英語のまま残しておいてもらったほうがいいな。 エラーログまで和訳され手分けわかめなのと同じ。
ルー大柴に監修してもらえばいいんだよな
はいはい、翻訳ひどくてすみませんでした(AAry
お前翻訳者か? 反省しろよ
323 :
デフォルトの名無しさん :2011/06/10(金) 21:56:15.88
>>315 著者のスティーブンスが死んじゃったからなぁ。
まじ? 最近名前を知ってる人がポンポンよく死ぬなぁ。 もうすぐオレも死ぬんじゃないか? って気になるわ。
経絡秘孔の入林を突いたお前はもう
一昨年、高校のときの担任が病死した 去年、大学のときのたばこ好きの先輩が食道癌になって逝った 今年、高校のときの同級生がバイクで事故死した
ipv6を手がける様な人って経験豊富な高齢者だからよく氏ぬのか?
328 :
デフォルトの名無しさん :2011/06/12(日) 01:52:12.81
itojunnも死んだよね。 ipv6は正にこれからなんだが
329 :
デフォルトの名無しさん :2011/06/12(日) 03:07:19.32
.netFrameworkに追加されたparallel使ったTCPのsocket送受信サンプルって 参考になるサイトありませんか?
伊藤さんの損失は大きいね。亀プロも解散しちゃったし。日本がネット技術で先端を開く芽を失った。 爺さんじゃなかったはずだけど持病でもあったのかな? プログラマとか持病多いからなあ。 ipv4聡明期の村井さんとか砂原さんじゃこれから20年とかとても戦えないからなあ。 ウィンドウズ95の発売で一気に一般化したipv4から16年か。もうアドレス枯渇で役目を終えようとしてるけど。
>>331 自。なぜかわしらない。当時はIPv6の話をしても誰も聞く耳をもたなかったからか?
wiereshark について聞いていいですか 非同期のUDP による送受信プログラムを一台のPC で検証しています パケットモニタしたいと思いフィルタリングで ip.addr == 127.0.0.1 && udp.port == 5030 として、applyするのですが、パケットがキャプチャーできません、何処か間違ってますか?
インターフェースの指定は合ってる? -i lo
↓これくらいの検索キーワードをすぐに思いつかない奴がネットワークプログラミングする事が間違っている。 windows wireshark loopback
カルシウムやストロンチウムを採ると心が落ち着きますよ
アダマンチウムを摂取して 今よりもっと強くなりたい
カルシウム単体では吸収率低いよ。タンパク質が必要。 人間の身体はコンピュータほど単純ではないよ。
>>341 ミルクはカルシウムが、野菜はビタミン豊富、大豆はタンパク質
バランスも大切。
おまいらの場合は亜鉛の方が重要だろ 注入量以上を毎日放出してんだから
ミルクは実は吸収率悪い。量は取れるけどね。カルシウム過多でも問題あるので注意。
亜鉛中毒もきついと聞くな
日本じゃ牛乳飲んでもおっぱいでかくならんよ
ビタミンD
質問です。 今日、SFの本を読んでいて思ったんですが、 例えば10年後に火星に基地が出来たとします。 その基地と通信する場合にTCPを使ったとすると、 パケット一個届けるのに20分くらい。 ACKが帰ってくるのに20分くらい。 通信状態が悪いでしょうから、パケットが消えて 再送したりするとすごく大変じゃないですか。 そこで一つのPCにNICを5個つけて、 送信したいデータをRAID6のような形にパリティつけて分割した後、 5つのNICから送信先に向かって一度に送ってしまえば、 受信側でいくつかデータが欠損していても復元できて幸せと 思ったんですけど、そんなプロトコルというか仕組みって有るんでしょうか?
はやぶさとかあかつきはどうやってんのかな
>>350 >TTCP
ググってみましたけれど、
T/TCPのことですよね。
これってネットワーク環境が良くないと使えないのでは?
僕は、宇宙と通信する場合を想定しているんですけれど...
↑電波な発言だな~
伝播どうこうより「宇宙と通信」が言葉として既におかしいというか誤解を招く
すいません。 じゃあ、宇宙等極限環境下でのネットワーク環境についてですね。
所詮2chの名無しなんて 俺が何を作ろうと、煽り続けるんだろう 相手してるとつかれるんよ
>>348 パケットの遅延については、あなたの使ってる TCP でも ACK を待たずに次の
パケットを送ってしまい、間違ってたらそのパケットのみ再送すると言う制御
をしている。(tcp window と tcp selective ack とかでググルといいかも。)
誤り制御はわざわざ別チャネルにする必要はないので、通信データ自体に冗長
化データを付加して誤り訂正するようにしている。
複数チャネルを使うと言うのは MIMO とか link aggregation 等の技術がある
けど、基本的に高速化のための技術。
ていうか宇宙と通信するのに通信路が複数ある可能性は無いよね。
>>357 「宇宙と通信」は
>>352 が言う通り意味がよくわからんが、
はやぶさは3本の通信路を持ってたよ。
て言うか通信路1本だけって、怖すぎだろ。
>>358 3本もあったのか・・・
1本は直通だとして、残りの2本はどことどこ経由?
やっぱ火星のアンテナ経由するのかな
100mbpsでも物理想は4本の撚り線使ってた気がするけど。
>>359 直通って...、流石に宇宙と通信しようとしてる奴は違うな (w
マジレスしとくと、低利得アンテナ (8bps)、中利得アンテナ (32bps)、
高利得アンテナ (4Kbps) の3系統。
>>356 >>357 >>358 >>359 >>360 おお、皆さんありがとうございます。
僕が思ったのは、惑星間航行が普通に行われるようになっても
これだけ普及したIPという仕組みは無くならないと思うんですよね。
でも、TCPだとちょっと?機能が足らないと思ったんですよ。
パケットの送信に何十分もかかる状態なら、
いっそパケットを多重化してしまえば再送が必要ないんじゃないかなと。
別チャネル?にしたらいいんじゃないかなと思ったのは、
通信路が複数有ったら一本磁気嵐とかでデータが飛んでも
リカバリできるんじゃないかなと。
どちらかというと絶対確実に届くUDPの方が近い気がしてきた。
そういう仕組みって誰も考えたことないのかなぁ。
ガンダムとかだと、
AMBACとか細かい設定まで有るのに。
まぁ、あの世界だとニュータイプがいるからいいのかな。
363 :
デフォルトの名無しさん :2011/06/19(日) 13:54:57.28
>>362 先ずはIPとかTCPとかよりもっと低位層のが問題では?
>>362 > どちらかというと絶対確実に届くUDP
色々考えるのはいいことだと思うが、まず基礎からちゃんと勉強して
おくことをお勧めする。
でないと、まともな人から相手されなくなるよ。
わかりました。 勉強してきます!
よーし、じゃあ俺も!
>>364 お前は日本語を勉強しろよ・・・ それはたとえの部分だろ
>>362 そんなことはずっと昔にわかっている・・・というか、
昔は遅延が大きかったので、遅延が発生するのが前提で設計されていた。
それを遅延が無いのを前提で使い倒すようになったのは最近の話。
数時間~数日単位の遅延が発生する場合でも、Windowsサイズを大きくして、
タイムアウトを長くとれば、それなりにちゃんと動くはず。
もちろん遅延が大きいので、アプリケーションレイヤのプロトコルは
それなりに設計していないと使い物にはならない。
エラー訂正などについては、物理層の仕事。
369 :
デフォルトの名無しさん :2011/06/19(日) 15:45:51.10
受信済みのデータを削除する方法を教えてください。 今までは空読みしてたんですが、どう考えてもこれって無駄ですよね。 なにかいい方法ありますか?
>>367 例えだからと言って、堂々と間違い書いてたら相手にされなくなるぞ。
>>368 そういうことを言いたいんじゃないんですよ。
例えば火星で人が病気にかかったとして、
地球に対して、治療方法を聞くとするでしょ。
もし、パケットが不着だと、再送するだけでも40分かかる。
それは、windowサイズやタイムアウトを長くとっても
回避できますか?
エラー訂正が物理層の仕事なら、
なんでTCPに再送制御の仕組みが備わってるんですか?
パケット自体を冗長化するようなアプローチが有っても良いんじゃないんですか?
ってことです。
deep space networkでぐぐれ
絶対確実に届くUDPがあったらいいなぁっていう鼻血だろ そんなことも言ってはいけないって言葉狩りじゃまいか
>>371 >エラー訂正が物理層の仕事なら、
>なんでTCPに再送制御の仕組みが備わってるんですか?
物理層で訂正できないエラーが発生するから。
>パケット自体を冗長化するようなアプローチが有っても良いんじゃないんですか?
パケットと言うのがどこを指しているのかよくわからんけど、TCP レイヤーの
パケットを言っているなら、そう言うアプローチは無意味だから。
>>373 >そんなことも言ってはいけないって言葉狩りじゃまいか
誰も言ってはいけないなんて書いてないと思うが。
ただ相手にされなくなるだけで。
>>374 >パケットと言うのがどこを指しているのかよくわからんけど、TCP レイヤーの
>パケットを言っているなら、そう言うアプローチは無意味だから。
なぜ無意味なの?
誰か実験したの?
物理的にパケットが届くのに20分かかるなら なにをどうしても「不着」が発生したら40分のロスは生じる まずは物理的なレイヤーで、光速を超える通信ができる技術を考えてくれ それが無理なら、結局は最悪遅延すること前提で設計するしかない
>>375 SCTPの説明をするときよくそういう言い方する
>>376 物理層と同じ機能を TCP レイヤーで持ってもしょうがないから。
それは間違っているとか、すげーいい方法考えたとか言うなら、
それこそ実験や理論で証明するなりすればいいと思う。
>>371 >例えば火星で人が病気にかかったとして、
>地球に対して、治療方法を聞くとするでしょ。
なんでわざわざ地球に聞くの?
火星にいる人に聞けば問題ないのに。
え?火星で解決できなかったからだって?
事前に想定した事態に対する荷物しか用意していないし、
事前に用意した荷物なら使い方を知っているし、
その範囲でどうにかできないなら、同意ようもない。
>>371 >もし、パケットが不着だと、再送するだけでも40分かかる。
>それは、windowサイズやタイムアウトを長くとっても
解決できるよ。ちゃんと40分後に再送され、運が良ければ60分後に届く。
>なんでTCPに再送制御の仕組みが備わってるんですか?
物理層以外でデータをロストする可能性があるから。
>>371 >パケット自体を冗長化するようなアプローチが有っても良いんじゃないんですか?
あるよ。アプリケーションレベルで好きに実装すればよい。
IP電話なんかは、一部のパケットが無くなっても問題ないようになってるし。
>>380 バカが考えた例え話は突っ込みどころ満載だから、バカは例え話しない方が良いぞ。
事前に用意した荷物をどの組み合わせと順序で使えばいいか。
>>362 > パケットの送信に何十分もかかる状態なら、
> いっそパケットを多重化してしまえば再送が必要ないんじゃないかなと。
別チャンネルにする必要はなくって、物理層が冗長符合を大量に持って
謬り訂正すればいいだけじゃね?
誰かも書いてたけど再送要求でてもそれが届くのは数十分後
> どちらかというと絶対確実に届くUDPの方が近い気がしてきた。
絶対確実に届かないのがUDP
つか、エラーパケットは積極的に捨ててる実装しかみたことがない
>>380 ねえ、ネタでやってるの?
>>371 の例えもどうかと思うが、そんなとこに突っ込みいれる君はそれ以上だよ。
>>382 > IP電話なんかは、一部のパケットが無くなっても問題ないようになってるし。
全然違う話を持ってくるなよ...。
>>361 ありがとう。謎が解けた。なんとかなりそう。
パケットのじょうちょうか
すまん。iPhoneなもんで間違って送信ボタンに当たった。 パケットの並列送信による冗長性確保に付いて言いたい事があるが、また後でな。
>>373 > そんなことも言ってはいけないって言葉狩りじゃまいか
そんな考えは無駄だってことを、
Token Ringや100VG AnyLANやATMが教えてくれたんですよ。
冗長化よりも行間(パケット間)を読み取る能力が大事と言うことですね
気になったけど、ウィンドウサイズ大きいほうがエラーで廃棄される確率高いと思うけどな。 再送に40分かかる距離として、どれだけ冗長に送っておいたほうがスループットいいのかは検証が必要だ。
「思う」って言われても… それは通信路の性質によるし。 帯域は太い、しかしラウンドトリップタイムが大きい通信路で、 転送効率上げるにはウィンドウを大きくするのは定石で、 今のTCPにもヤコビソン先生が衛星回線用に書いたロジックが入ってる。
なんのためにLGAMGAHGA三段階にしてあると思ってるんだこいつ
じゃあそれぞれのパケットドロップ率を描いてくれよw
>>395 mopera経由の通信モニターしてると結構TCPセグメントが焼失して再送が発生してるわけだが
>>396 だったらそのTCPくっつけて見られるようにしてくれよ
くだらん話が続いてるな。
ドコモのデータ通信程度でも5パケットに一回程度はエラーで再送されてたりするのかな? 家政往復なんて1万個パケット送って1こと独程度だったりしてw
それは通信路、通信相手による。 パケットのロスはほとんど輻輳なんだから。 はやぶさなんか専用線なんだから輻輳ロストなんてほぼ0。 通信路の性質上、バーストロストは頻度高いだろうけど。 ただこういうのは、土方プログラマーが考えることじゃない。 最低でもStevens本くらい読みこなしてないと考える意味がない。
専用線っていえば、そうなんだろうけど
>>400 専用線なんだっけ? あれって他の人は使ってないの?
データ受ける側は世界中にいるけどな
>>388 >すまん。iPhoneなもんで間違って送信ボタンに当たった。
>パケットの並列送信による冗長性確保に付いて言いたい事があるが、また後でな。
まだ~?
マカってホント情報弱者だな。
マカってホント肉体疲労・虚弱体質な人向けネットワークプログラムに向いてるよね。
はやぶさの近くに同じ周波数帯を使う物体が飛んでいるのか?
はやぶさに偽指令って送ることは可能だった?
楕円暗号とかの署名付けて送らないと無視するぐらいの機能はついているべきだな。
「楕円暗号復号回路が壊れました!署名を検証できません!」 「こんなこともあろうかと、署名無してもコマンドを受けつけるようにしておいたんだ!」
>>406 せつこ それ ネットワークビジネスや
あまりにも通信状態が悪くて署名で付けた楕円暗号が毎回エラーで、タイミング会わずに軌道に乗れずに宇宙の彼方に飛んでいったってのはあるだろうなw
UDP通信でNat越えしたいんですが、 パケット、セッションについて教えてください。 ネットでサンプルプログラムを見ると、クライアント側では while( true ) { 送信処理(サーバへ) 受信処理(送信処理で使ったsockaddrを使用) } こんな感じになっているんですが、このときの送信処理というのは何回も 必要なのでしょうか? また、発信元ポートというのは、宛先が同じ間でも変わることがあるのでしょうか? ちなみにNat越えはNat内のクライアントと外部のサーバ間を想定しています。
>>416 > こんな感じになっているんですが、このときの送信処理というのは何回も
> 必要なのでしょうか?
NATやってるルーター次第
> また、発信元ポートというのは、宛先が同じ間でも変わることがあるのでしょうか?
バークレイソケットインターフェースだとよほどの変態実装でない限り
socket()で作られた発信元ポートは変化しないと思われる
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような そんな言語使ってる奴ってどうみてもゴミだと思うんだけど もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの? そうか、二度と話かけんなよ きも
(^_^;)
デリミタ=区切り文字だから、改行で意味が区切られる言語も対象ってことは・・・ アセンブラか 流石にそこまでローレベル言語は使いたくないな
すれ違いのマルチは死ねばいいが pythonの「:」も存在価値が微妙
422 :
416 :2011/07/04(月) 00:19:35.96
>>417 ありがとうございます。
とりあえず、送信と受信は別スレッドにして良さそうですよね?
Rubyの行継続ルールは微妙
rubyはうんこだからしかたない。 というかネットワークには関係ない言語だからスレ違いだろう。
425 :
416 :2011/07/05(火) 08:29:00.96
416の内容でクライアントがVPNを利用して、 DMZ内にあるサーバと通信する場合だと、 416のやり方でも大丈夫でしょうか? ちなみにVPNはCiscoのIPsecを使っています。 NAT トラサーバルとか、良くわかりません。。
vpn糞遅いからな。sslしてるのと変わらない。
>>427 根拠は?
IPsec なら専用ハード積んでる GBE だと wire rate でるんだが?
大丈夫だ、問題ない。
>>428 専用ハードをツンデレ場だろ。 うちのPCはツンデレ場が無いよ
431 :
416 :2011/07/06(水) 20:09:59.35
VPNですが、サーバまでは通信されましたが、 戻りの通信が出来ませんでした。 クライアント側は3G回線+VPNです。 これって、VPNのASAとかの問題でしょうか?
>>431 どこでマミられたかわからないとデバッグできないぞ
ルータでドロップ全部ログる設定にしてやりなおしてみたら?
一番いい装備で頼む。
434 :
416 :2011/07/06(水) 22:57:57.99
>>432 確かにデバッグが必要ですよね。。
本番の環境しかないため、自分の権限では、ここから先は出来ません><
テスト用の環境作るにも機材が必要になるので、厳しそうです。
とりあえず、当初の目的だった、外部サーバとNAT内のクライアントで通信が
出来ればよしとします。。
>>434 よかったな。
もしもテスト環境をポンと渡されたらと思うとぞっとするわ
>>435 あぁ本当に。
「治るまで作業してていいからね♪」ってサーバー室に閉じ込められた事ならある。
よくよく調べたら、ネットワーク構成図には書かれていないファイアウォール・・・。
使っていたクライアントOSが、何故か毎回同じクライアントポート番号で
接続しに行く不思議仕様だったため、ファイアウォールにたたき落とされていた。
セキュリティ嬢どこにファイヤウォールとか入れてるかは明示しないのが普通。 どこで図面漏れるか分からないし。口頭でファイヤウォール入ってないのか確認しなかったのが敗因だな。 むしろなりすましを考慮されてない実装なのが(ry
エンジニアリング的におかしいだろ
UDPで、一度に大きなサイズのデータ(数十万バイト)は送れないのですが 具体的に、最大どれくらいのサイズまでならば可能なのでしょうか?
500~1500バイトくらい
>>439 です
>>440 thxです
現在winsock で
320×240×23=230400バイトのフレームバッファーを、
1492バイトで分割して、UDPで下記のサイズに分割送信しています
1492×154回
632×1回
受信側で、分割して送られてきたデータを、230400バイトに、再構築するつもりなのですが、
考え方は間違っていないでしょうか?
失礼 ×320×240×23=230400バイト ○320×240×3=230400バイト
>>441 UDPは送った順に届くとは限らないということは理解してるよね?
送った順に到着しない 送ったものが届かない 分割して送るなら ヘッダに通番つけといて 上記2点を考慮することになるが… 再送処理とかしだすと、TCPじゃだめなの?って話になる
>>441 です、お世話になります
>>443 はい、それは理解できています
>>444 TCP/IPの送受信実験はすでに成功しており、UDPによる、送受信の実験がうまくできないので
数週間、チャレンジしていますが、手がかりがなくて模索しています。
>>分割して送るなら ヘッダに通番つけといて
ここら辺のことをお聞きしたいのですが、単純に考えますと
例えばデータ構造を
stract UDP{
unsigned int serial;
char data[1492];
};
このようなことが、考えられると思います
しかし、これでは、UDPなので、所詮投げっぱなしのデータなわけですよね
そこで、通し番号はTCP/IPの3way handshake で送り
その後、UDPでデータを送るというような、アルゴリズムになるのでしょうか?
それから、2230400のデータですが
1492×154回
632×1回
こんな送り方より
1440×160回の方が、単純で再構築もしやすいですね^^;
ごめんなさい、また間違えました ×それから、2230400のデータですが ○それから、230400のデータですが スマソ
UDPのデータにそういうふうに番号を付けて、 「何番までのデータは受け取った」とか「何番のデータはまだ来てない」とかそういう返事を受信側から送信側に送り返す それを見ながら、未着の(たぶん失われたと思われる)データをもう一度送る 返事も失われることがあるので、何秒か返事がなかったら同じものをもう一度送る 「全部受け取った」という返事が来れば終了
449 :
デフォルトの名無しさん :2011/07/09(土) 17:02:16.53
TCPじゃだめなの?
>>449 >>445 です
マルチキャストの実験もしてみたいので、TCPではムリポなのでUDPに拘っています^^;
マルチキャストで複数(多数)の受信者から違うパケットの再送要求が来たらどうするつもりなんだろう
仮にどうにかできたとして 果たしてそれはマルチキャストと言えるのだろうか
>>451 >>452 >>448 です
そうですね、やはりapache の実装のように、子プロセスのインスタンスを生成し
管理するような、システムを構築するべきでしょうね
>>452 パソコンサンデー的なものになると思う。
マルチキャストでネトゲのパッチ配布実験とかしてなかったっけ。もちろん実験だけで実用にはならんけど。
まずTCPのセッションを複数張って実装してみて、 それで駄目ならUDPとかマルチキャストとか考えるべき。 大抵TCPで何とかなる。動画サイトを見ろ。
それから、
>>439 確実に知りたければ"Path MTU Discovery"するしかない。
まあ途中に入っているルータが正直に応えるかどうか不明だが。
IPv6の場合はルータの対応が必須だけども。
>>456 IPv6でも続々と変なルータやFireWallが増えてきてるので、
PMTUDが通る前提は崩されつつある。嘆かわしいことだ。
>>454 マルチキャストとブロードキャストは違うんじゃね?
パソコンサンデーはブロードキャストだよね
>>458 ipベースのマルチキャストではないけど。。。
言葉の意味を考えると1対Nなので
TV放送は全てマルチキャストじゃないの?
無差別なのでTV放送(ブロードキャスト)はブロードキャスト(放送)です。
>>459 マルチキャストは1:N、ブロードキャストは1:∞ みたいな感じ
と覚えとくといいと思う
受信料とられるん?
WinSockでrecvを実行した場合に ----------------------- 7330 : recv(7330) = 0 ms 13242 : recv(35562) = 0 ms 22320 : recv(22320) = 200 ms ----------------------- (戻り値:recv(受信長) = 所要時間) となった環境でJavaのInputStream.read()をしてみると全受信まで50msほどでした。 そこでrecv毎にrecv(all)して受信のバッファリングなどしてみたのですが、結果は変わらずでした。 APIを直接叩くよりInputStream.read()のほうが速いのはなぜなんでしょうか?
はいそうです
>>464 ソケットの設定による。
デフォルトでrecvの中でちょっと待つようになってる。
待たないように設定してみるといい。
>>466 ack周りかなと思い、それっぽいオプションをsetsockoptで色々設定してみたのですが変わらずでした...
もうちょいヒントを頂けると助かります
ノンブロックにすればよくね?
>>466 の言っている遅延タイマがまさに200ms。
Winsockのrecvの馬鹿チョン仕様。
470 :
464 :2011/07/14(木) 22:09:23.33
>>468 やってみましたがダメでしたorz
>>469 Nagleアルゴリズムの事であれば無効の試行済みです。
信頼性の高いマルチキャストプロトコルで 実装が簡単なのって何がありますか?
>>464 いっそ、Javaの標準ライブラリが何をやってるのか、ソースコードを調べてみたら?
JDK に付属する src.zip にJava部分が、「Java SE 6 JDK Source Code」に C/C++ 部分があると思う。
473 :
464 :2011/07/18(月) 00:54:34.43
>>472 そんな物があったのとは!
やってみます。ありがとうございました
474 :
デフォルトの名無しさん :2011/07/20(水) 11:49:04.57
>>474 time.nist.govを買い取って、好きな時刻に設定すればいい。
NTPサーバを用意してhostファイルでtime.nist.govにそのIPアドレスを指定する
>>474 逆アセしてそのチェックして分岐させているところを書き換えるといいよ
478 :
デフォルトの名無しさん :2011/07/20(水) 14:50:14.36
winsockのsend関数で char buf[100]のものを送るとしたら実際に送られるデータは何バイトになるのですか?
>>478 それにTCPヘッダとIPヘッダを足した大きさ
それぞれのサイズは忘れた
なるほどありがとうございます
どの層を気にしているかによるが、 データリンク層のヘッダにも注意。
>>478 環境や状況による。
Ethernetなら+TCPヘッダ+IPヘッダ+MACフレームになる。
PPPoE経由でPPTPVPN使ってたりすると、さらに幾つもヘッダがつく事になる。
他のTCPやUDP通信とまとめて、一つのIPパケットにのる場合もある。
>>483 >他のTCPやUDP通信とまとめて、一つのIPパケットにのる場合もある。
こんなことあるのか?
ありえねーって突っ込もうとしたけど、
>>483 特製トンネルならばありうるから止めた。
486 :
デフォルトの名無しさん :2011/07/25(月) 11:39:48.33
「他のsend関数でカーネルに渡したデータと一緒に」 ならTCPでは有りうる。
>>486 UDPも入ってるから、その可能性は却下。
誰がどう言ったかとか興味ない。
>>478 の質問に即してレスした。
490 :
デフォルトの名無しさん :2011/07/25(月) 16:12:23.06
> 他のTCPやUDP通信とまとめて、一つのIPパケットにのる場合もある。
既にハンドシェイクされて確立されたTCPコネクションがあって そこにパケットを入れ替えるのではなく追加するというのは可能なのですか? 任意のパケットをNICに入れるのはこの際問題にしなくていいです(それは出来る) TCPプロトコルがいまいちよくわからない パケットをそのまま入れればいいって問題じゃないですよね? ACKとかシーケンス番号とかも揃えないといけない? となるとACKの区切りを検出して、自分のデータのACKのやりとりを丸々入れないけないのですかね?
TCPハイジャックだっけ
めんどくさそうだから別の方法でやろう
難しそうなので僕には出来ませんだろ
難しいことをやり遂げるのが主目的じゃない 簡単な方法があるならそれを使うまで パケットを直接入れる方が簡単だと言うなら別だけど
せやな
>>491 簡単にはできない。
TCPストリームのデータを中間者が増やした時点で、それ以降のACK/SEQがずっとズレっぱなしになるので、
任意のデータを入れたが最後、その後の通信を全部加工して送らなければならない。
ftpに対応したNATルータがまさにそれをやっている。
へ?
全部TCP/UDPパケットをいったん別のソケットにリダイレクトする方が簡単だろ? 一旦正規のソケットに仲介させることで中身をいじるのは簡単になる 1.接続要求がきたら自分のListenポートに修正 2.本来のポートに普通にコネクションを張る 3.自分のソケットから本来のポートに対するパケットのソースアドレスを元に戻す 4.以後はそのパターンでソースとデスティネーションを書き換え続ける これで完全に仲介したソケットが完成して、本来の接続プログラムが リモホを参照してもちゃんと元のリモホとして認識されるはず これでいけると思うんだけど間違ってるかな? この方法で問題になるのが自分でconnectやacceptする部分であらかじめポート番号を決定できた方が都合がいいんだけど Winsockってそういうことは可能なんだっけ?
一生懸命説明してるとこ悪いけど、 > 既にハンドシェイクされて確立されたTCPコネクションがあって という前提なので。
>>502 パケットを挿入するという前提があるので、その条件を入れただけですよ
その前提と条件がどう関係するんだよ。 よくわかってないなら、変な条件つけなきゃいいのに...。
>>504 こういうスレではあらかじめかなり条件を絞って質問しないと
毎回毎回、知識ひけらかし君が、その部分をまずやれとか意味不明なことを言い出して
それはとっくに出来てるんでとか言うと以後レスしなくなるという
そういう経験ばかりしてきてるんで
無駄なやり取りを減らすために条件を絞るくせがついてるですよ
妖しそうなことやりたいんじゃないの?
>>505 >毎回毎回、知識ひけらかし君が、その部分をまずやれとか意味不明なことを言い出して
>それはとっくに出来てるんでとか言うと以後レスしなくなるという
自分のやったことと、前提条件がちゃんと説明できてないからだろ。
>>507 妖しいことも出来ない奴がネットワークを語るなよ
そんなレベルの奴に用はねーし
逆にそのレベルに達してきて怪しいことをやったことが無い奴なんて居ない
ホメラレモセズ クニモサレズ サウイフモノニ ワタシハ ナリタイ
おれにはできない。 どういう状況でそんなことやる必要があるのか 知りたい。
>>501 それは別のネットワークになるので駄目です。
513 :
デフォルトの名無しさん :2011/08/18(木) 22:05:34.40
Socket.Send メソッド (Byte[], SocketFlags) Socket.Send メソッド (IList<ArraySegment<Byte>>, SocketFlags) のSocketFlagsの存在が何故あるのかが良く解らないんです。 SocketFlags.Noneを指定するのなら Socket.Send メソッド (Byte[]) でイイのではないかなぁと思うのですが、サンプル求めてググッてみても SocketFlags.Noneを指定するのが過半なので、どうしてかな~と疑問に思い質問です。 なんで?
514 :
デフォルトの名無しさん :2011/08/19(金) 00:11:39.24
Windows上で特定のポートに帯域制限を掛けるプログラムを C++で組みたいのですが、何から勉強していいかわかりません・・・ 何かいい本かサイトを紹介してくれませんか。 スキルとしては、画像やテキスト処理のコマンドラインプログラムを C++で書ける程度です。
>>514 どういう方法でやろうとしているの?
特定のwindowsサーバにインストールして、そのサーバの下にいるwindowsPCに帯域制限をかけたいの?
それともwindowsPCにインストールして、インストールしたwindowsPCのみに帯域制限かけたいの?
賢い人達はLINUX使うと思う。
まあ、どういう方法をとるにしろ、
デバドラまで入り込まないと無理だぞ。
今日も眠れぬ青画面の世界までようこそ。
WELCOME!WELCOME!WELCOME!
>>512 そうらしい、実際にやってみたがループバックは物理的なネットワークが違うものとして扱われるらしくリダイレクト出来ない。
パケットをいじるだけで同じPC内でプロキシをするのは無理らしい。
しかし、苦労したけど結局プロキシする方法を発見して出来たからもういいのだ。
>>514 標準でQoSに対応しているので、有る程度はレジストリ設定だけで
制限できるんだけど、あくまで作るのが目的なの?
作るなら、フィルタドライバとして作るだけだけど。
518 :
デフォルトの名無しさん :2011/08/19(金) 10:13:26.00
>>515 >それともwindowsPCにインストールして、インストールしたwindowsPCのみに帯域制限かけたいの?
それです。
>>517 目的達成できるなら手段は問わないです。
具体的にはネットワークカメラを走らせていまして、
プロバイダの30GB/日のUL転送量制限に引っ掛からないように転送量を測って、
20GB超えたら速度制限、25GB超えたらそのポートを遮断
日付が変わったら累積リセット制限解除、ということをしたいのです。
制限を超えるのは極稀な日なので、四六時中制限掛けるのは避けたいですし
LAN同士の転送はカウント外にしたいので、ネットワークカメラのポートだけを監視したいわけです。
520 :
デフォルトの名無しさん :2011/08/19(金) 19:44:57.73
格ゲーだとフレーム単位でキャラ操作するつわものいるけど そういった人を満足させるネトゲって可能?
ネット対戦できる格ゲーならあるけど、そういう話じゃなくて?
フレーム単位で通信する必要ないから可能。
>>519 それって速度制限というか、絶対量制限しないといけないんじゃないの?
1フレームの転送量を計って、制限量に達するまでに何フレーム送れるか計算したら?
webcam -> localhost:8000 -> internet
みたいな感じでlocalhostさんに一度データを送って、localhostさんがwebcamの
データを外に中継だけするようにしたらどう?
ざ 残像だとっ!
>>520 地球の裏側まで光速で何秒かかるか計算してみるといい。
理論最速値でもそこまでの速度しか出ないということに驚愕しろ。
>>519 TCP/UDPプロキシでも使ったほうが手っ取り早いんじゃね?
>>520 可能。ただし1フレームがネットワークのディレイより長い必要がある。
フレーム制御だとACKタイムアウトで再送とかされて大量にフレームが来るから 帯域制限を掛けるなら当然、同じフレームは不達として落としてやらないといけないから複雑
一番簡単な方法はAPIフックだろうね send recvをフックして遅延を掛けてやればいい ただ、この方法だと100%のソフトを制御出来る保障がないけど 100%制御がしたいとなるとring3では無理 つまりカーネルモード(ドライバ)の領域に入らないと制御は出来ない
一番、簡単確実なのは
>>523 だろ。最適解が出てるんだから、オナニーするの止めろよ。
532 :
デフォルトの名無しさん :2011/08/21(日) 19:26:09.84
C#でsocket使おうと思い質問です。
参考にしたのは
ttp://dobon.net/vb/dotnet/internet/downloadusesocket.html なのですが、
//受信する
byte [] resBytes = new byte[1024];
System.IO.MemoryStream mem = new System.IO.MemoryStream();
while (true){
int resSize =sock.Receive(resBytes, resBytes.Length,System.Net.Sockets.SocketFlags.None);
if (resSize == 0)
break;
mem.Write(resBytes, 0, resSize);
}
の部分がうまく動作しません。
while一週目で全文受信したのち、2周目でresSize 0がこないのです。
ずっとsock.Receiveのところで固まってしまいます。なにか足りないのでしょうか?
オツムの足りない私めにご教示お願いします。
resSize 0 ってまず来ないと思うよ
もう忘れたけど、相手がクローズしたら 0 になるんじゃ?
>>533 Vista以降はcloseするとFINを送る前に0パケットを送信する
>>532 というわけでclose以外で0バイトの受信が来る事はない。
TCPはデータの到達は保障してくれるけど区切りまでは保障してくれない。
だからTCP通信で必須になるのがデータサイズを相手に通知する作業なの
HTTPプロトコルだと、まず\r\n\r\nでヘッダの終わりを通知して
ヘッダの中のContent-Lengthで後続するデータサイズを明記するという構造でデータサイズを渡してる。
同じようにデータのサイズをあらかじめ通知する方法を自分で考えたプロトコルにも組み込まないといけない。
そうすることで何バイト受信すればいいかがわかるでしょ。
ナルホド確かに受信文の中に数のデータサイズ部分が居ます。納得しました!
>>535 そうなんだ
でもそれってUNIX系でいうところの
readの戻り値がゼロ ってやつだよね?
良く解らんがsetSoTimeout(タイムアウト時間);とかないん?
もっと参考になるサイトがあるだろうに
540 :
デフォルトの名無しさん :2011/08/25(木) 23:18:57.16
LANケーブルを物理的にハサミでちょん切ったりしたりすると延々受信待ちしてしまいますよね? socketのReceiveTimeoutは同期の場合にしか使えないようなのですが 非同期の場合はタイムアウトや無応答をどう対処したらいいのでしょう? if (0 < sock.Available | 0 < resSize) と、ネットワークから受信した、読み取り可能なデータ量が0ならbreak? ちがうよなぁ・・・。
復帰
542 :
デフォルトの名無しさん :2011/08/26(金) 19:26:12.89
UDPとTCPを併用する場合 TCPでの送受信がUDP側に影響を与えることってありますか?
ないですね。 イーサネットの帯域食うくらいの通信をTCPでしてない限り。 100%ないと思っていいです。
いやあるね
(`ハ´) ないあるね。
ありますん
役に立たねーな おまいら
548 :
540 :2011/08/27(土) 17:30:05.25
まだ困ってます・・・ client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000); で受信タイムアウト設定したつもりで居たら駄目だった。 SocketOptionName 列挙体 ReceiveTimeout タイムアウトを受信します。 このオプションは、同期メソッドにだけ適用されます。BeginSend などの非同期メソッドに対しては機能しません。 AsyncCallback(ReceiveCallback)で非同期受信したい場合ではどうすればいいですか?
LANが切れた時のタイムアウトは非同期とかどうとかの問題じゃない 何故なら、切断タイムアウトが検出されるのはデータを送信して応答メッセージが無い時だけだからだ 逆に言えば、タイムアウトを発生させたい周期で無意味なデータを送りつけて反応を見ればいい これをPing送信を言う
>>548 BeginReceiveを使えばいいだろと言って見るテスト
>>549 pingとかいちいち送るのうざいじゃん
KIIPUARAIBUを設定してOSに勝手にやらせればよくね?
HTTPヘッダのUser-Agentに日本語などの非アスキーを混ぜたい場合、単純にutf8の%エンコーディング にすればよいだけ? RFC読めば読むほどわからなくなってきた・・・
yes
訪問者解析とかしてる奴に攻撃仕掛けるのか?
556 :
デフォルトの名無しさん :2011/09/02(金) 16:09:57.29
家庭用PCでWAN側から100ノードくらいから毎秒1~2回くらいで50バイトくらいのTCP接続受けるのって マシンとルーターの同時接続数上限的に無理かな?
MMOくらいなら一台で運用してたぞ
>>556 今時、古いノートPCでも、
ネットワークスタックだけに限れば余裕かと。
サーバの処理については内容によるだろうし、
ルータと言っても古いADSLモデム兼用もあるし機種次第だろうね。
某○ネージュIIのサーバが拡散されたとき、一台でもそこそこできるんだなと感心してしまった
561 :
全然動かないよーー :2011/09/19(月) 02:52:55.49
超悩んでます。やばいです。教えてください。 Linux上でネットワークプログラミングしてます。 IPv4でUDPで受信するプログラムです。 socket()、bind()、setsockopt()は全て成功し正常終了しているのに、 recv()だけがエラーとなり受信できません。 ソケットは確実に開けており、netstatでも確認済みです。 ICMP destination unreachableを発信しています。 何でですか。
562 :
全然動かないよーー :2011/09/19(月) 02:54:57.61
あと、recvmsg()でMSG_ERRQUEUEを使うとエラー情報が取れると マニュアルにあるので、やろうとしましたが、全然できません。 それに、疑問点が多々あります。 ○IP_RECVERRの指定はsetsockopt()でするのでいいですか。 ○msghdrにエラーがセットされるとありますが、 エラーはsock_extended_errで提供されるともあります。 msghdrのメンバにsock_extended_errなんてありません。 msghdrに具体的にどのようにエラーがセットされるんでしょうか。 ○recvmsg()でエラー情報を吸い上げるサンプルコードの載っている サイトをご存知の方は教えてください。 よろしくお願いします。
select
>>562 どうして肝心のrecvのエラーを書かないのか
565 :
全然動かないよーー :2011/09/19(月) 05:00:32.36
>>564 recv()のエラーは戻り値-1です。
これでEAGAINだったら爆笑だが、彼は一歩成長するだろう。
568 :
デフォルトの名無しさん :2011/09/19(月) 05:48:05.57
尻から目が出た!
569 :
デフォルトの名無しさん :2011/09/19(月) 13:54:55.59
ッモルピグ!作っているのですが、まとまったバイナリは送ったときに受け取ったバイナリはまとまっているんですか? send関数recv関数 2つ送って1つめより大きなバッファでrecvしたら2つめもついてくることあるんですか?
571 :
デフォルトの名無しさん :2011/09/19(月) 17:19:28.12
>>570 えっ><
自分で切り分けなきゃだめってことですか><
鯖からsendで16byteと12byteのデータが送られたときに、そのパケットが2つとも到着してる状態でrecvで24byte読み出したら最初の16byteと、次の12byteの最初の8byteが引っ付いた状態で読み出されるんですか><
逆に鯖から8byteのデータが送られたときに読み出すタイミングによっては4byteしか届いてなかったりしますか?
TCPです><
はい
573 :
全然動かないよーー :2011/09/19(月) 17:33:56.47
>>565 >>567 errnoのとり方が分かりません。
断片的な知識はあるのですが、うまくいきません。
>>562 の質問についても助言をお願いします。
>>573 #include <errno.h>
#include <string.h>
int ret = recv(/*略*/);
if (ret == -1) {
printf("recv() failed: errno = %d (%s)\n", errno, strerror(errno));
}
errnoやstrerror()についてはググッて。
>>570 ,572
ありがとうございます><
頑張ります><
>>561 パケットフィルタで蹴られましたとか言ったら殺す。
パケットフィルタで蹴られましたとさ
>>576 それは無いだろ。それなら届かないからそもそもエラーにならない。
すごいアイデアを思いついた TorっていうP2P匿名ソフトはSocksに対応してるんだよな ローカルのソフトの通信を全部Torに投げてやれば自動的にすべてのソフトを匿名で利用出来る そして俺にはそのやり方の知識と、既に作ったソフト群がある これ作ったらたぶん革命的だろうな、特にファイル共有関連とかな が作る時間がない アイデアだけ託すから誰か作ってみるといい
了解
既に作ったソフト群があるなら作る時間がなくても困らないじゃん
さっさとソース出せ
583 :
動いたよーー :2011/09/21(水) 11:29:58.67
561です。
動きましたーっ☆
>>576 ,
>>577 その通りでした。
ファイアウォール設定でごく一部のポートしか開いてませんでした。
それが原因でした。助かりました、ありがとうございます。
>>578 実は、訳あってノンブロックにしていたので、制御が戻り、
-1を返していました。
いや、
>>561 がerrnoを見たとは限らないぞ。
そうだな。あんだけ言ってもまだ-1とかぬかしてるしな
知識の無い奴は、さらに知識の無い奴を見つけると揚げ足とって猿みたいに喜ぶんだよな だから馬鹿なんだよ
CとJavaを入門書終わらせてちょっと簡単アプリなんかも作ってみたりする程度の経験で ネットワークプログラミングについても勉強してみたいな、と思ったのですが そういう状況だと入門書としては「猫でもわかるネットワークプログラミング」辺りでよろしいでしょうか
>3 >4 から好きなの読めば
>>591 UNIXネットワークプログラミングvol1と、あとは適当な薄い本買っとけ。
UDPで送信側が1から4まで番号つけたデータを順番に送信して、 受信側が1、2、4という順番で受信したときに3のデータがロストしたのか4の後に来るのか判断する方法ってある? 3がくるのをちょっと待ってみるか、2の次に4を受信した時点で3の再送を要求するしかない?
>>594 >4の後に来るのか判断する方法ってある?
ない。
>3がくるのをちょっと待ってみるか、2の次に4を受信した時点で3の再送を要求するしかない?
うん。
596 :
594 :2011/09/29(木) 08:23:58.03
応用によっては「3は諦める」という選択肢もある。> しかない? ストリーミングで行われているケースあり。
598 :
デフォルトの名無しさん :2011/10/16(日) 18:09:31.09
ネットワークプログラミングって 情報少ないけどどうしてますか?
600 :
デフォルトの名無しさん :2011/10/16(日) 18:36:58.08
エラー処理等細かいところまでしっかり説明した日本語のサイトって意味なら 少ないかもな
たとえばTCP-MD5を実装したいって思ったって、ほとんど 実装の参考になるサイトはないよね。
>>602 TCP-MD5ってよくしらないんだけど、そんなにみんなが実装したがるものなの?
>>598 ってちまたによくある「ソケットの使い方」みたいなものを指してると思ってた。
>>602 RFCにこと細かく書いてないか?
# RFC も読めないような低能はネットワークプログラミングするな
# 迷惑だ
605 :
デフォルトの名無しさん :2011/10/17(月) 14:23:16.79
WindowsからLinuxにTCPで接続したのですが、 Windows側でソケットを正常に閉じて終了した際、 Linux側のソケットでrecvしても返り値が0以下(エラー)になりません。 接続をしたままでWindows側のプログラムを強制終了するとLinux側のrecvはちゃんとエラーを返してくれます。 なぜでしょうか? そしてLinux側でWindows側のソケットが正常終了したことを知るにはどうしたら良いでしょうか? ノンブロッキングモードです。
>>605 closeはしたけど、shutdownはしてないとか?
607 :
604 :2011/10/17(月) 20:06:20.06
>>606 ありがとうございます。
シャットダウンしてなかったのでshutdown(sock,2)してみましたが変わりませんでした。
タイムアウトの判定組み込んで何とかします・・・
>>605 エラー返さないってそこいらじゅうに書いてあるじゃん
戻値0の場合, EOF とも
609 :
604 :2011/10/17(月) 23:17:12.80
>>608 すいません、shutdownの使い方しか読んでませんでした。
検出頑張って実装します。
ひとこと。余計だって言われない?きみ ひとこと余計。だって言われない?きみ ひとこと余計だって。言われない?きみ ひとこと。余計だって言われないきみ。
もしかして
>>608 の「戻値0の場合, EOF」が余計な一言と言ってるのではあるまいか?
「安易に答えを教えず自分で調べさせろ」って意味?
おしい! あと11時間でゾロメだったのに
2ちゃんでのスレの伸びなんて気にしなくていいよ。 ちゃんとメディアに取り上げられた方が勝ち。 2ちゃんなんて、どうせネトウヨが荒らしに来るだけでしょ。 普通の人が使うネット情報は、ツイッターやフェイスブックの方がメインになってきている。 流行ってるし、コミュニケーションがうまく取れない人は入り込めないから、 ネトウヨがグチグチ文句言ってるでしょw もはや、2ちゃんは、ネットの中でも上手くやっていけないタイプの人が流れ込んで来る場所でしかないんだよ。 だからデモ関係など人を集めたい場合は、2ちゃんは使わない方が良いんだよ。
氏ね政治基地外
(´・ω・`)ふ~ん
職場の新人にネットワークの基礎からたたき込むことになったのだが、新人教育は初 相手は一応ソフト関係を大学で勉強はしたがネットワーク関係はさっぱりという連中、 ソフトを扱っていたというレベルもちょと不安なところ ネットワーク関連の組み込みアプリケーション(DLNAとか)の 設計ができるところまで育てる必要があるのだが さて、どこから教えたものか? とりあえずOSI参照モデルあたりの説明でもしとけばいいのか?? 自分が独学なだけにどうしたらいいのかよく分からん、助言あれば頼む。
>>621 逆に考えるんだ。DLNAを作れるという到達目標が明確なら、
そのために必要な前提知識を洗い出す。
・・・で、さらにその前提知識を洗い出す。
これを生徒の現在のレベルであろうという場所まで繰り返す。
それが教えなければならない項目のリストだ。
生徒の現在のレベルについては、事前にペーパテストでもやっておくと良い。
事前にテストとか出来ないなら、とりあえず優しいレベルからスタートして、
生徒の顔色を見ながら知ってそうならすっ飛ばすことになる。
>>621 課題となるアプリを決めて環境構築から設計、実装までを新人といっしょにやってみるのが一番じゃね。
>>622 >>623 なるほど、とりあえず軽くテストしてレベルを調べるってことをやると
ある程度方針が決まるかもですね
そこで基礎固めがある程度できたら、
実際のシステム構築をやらせてみて
その都度必要な知識についてこちらから説明するなり
自分で調べさせるなりすれば身につきやすいか
何となくイメージができてきました。
人に教えるのって大変だよな。小学生から独学でプログラミングやって、膨大な量のソースコード書いてきたから 大学の授業でちょこっとやっただけの奴らって大丈夫かって思う。 特にデバッグ力、設計力に圧倒的な差が出る
c#スレでこちらに誘導されましたのでお願いします。 popサーバにアクセスして、新着メールを取得するプログラムを作りたいのですが、 接続~取得まではうまくいきましたが、メールをフォルダわけしている場合に、 "受信フォルダ"←ルート?のメールしか取得できません。 条件で振り分けている他のメールも取得したいのですが、行き詰まってしまいました。 よい方法がわかるかたがいらしたら回答よろしくお願いします。 言語はC#で、listやstatを投げても、ルートディレクトリのメールしか取得できない状態です。
>>626 POPじゃどうにもならないだろ。
素直にIMAP4使え。
>>625 俺は大学に入ってから初めてプログラミングに触れた人間だが
大学の授業でやったレベルだと全く役にたたんね
設計力・コーディング力以前にソフトウェア的な概念自体さっぱり身につかない
教科書見てこう書けばこう動くだけだからねぇ
やっぱり、学習と言うより経験が重要だからOJTが一番身につくのかなぁ
>>628 ベーマガ読んで倉庫番作れ。
それがもっとも早道だ。
631 :
デフォルトの名無しさん :2011/10/26(水) 20:17:30.05
質問失礼します。 C++でwinsockのUDPのプログラミングを行っています。 C/S共にsendtoとrecvfromを利用しているのですが、 まれにC/S共にrecvfromでブロックされて、それ以後の送受信が行えない事象が発生します。 sendtoでエラーは出ていませんでした。 ①サンプル通りに作ったのですが、こういった事はありうるのでしょうか? ②これはどのように回避すべきでしょうか? recvfrom関数をノンブロッキング関数にする事はできるのでしょうか? 分かる方、お願いします。
632 :
631 :2011/10/26(水) 21:02:27.21
すいません。 ②は解決しました。 サーバーで利用する関数を sendto recvfrom クライアントで利用する関数を sendto recv にして、 Ulong uloVal = 1; ioctlsocket(socket, FIONBIO, &uloVal); 上記設定を行った所、ノンブロッキング処理が行えるようになりました。 しばらくコレで様子をみます。
>>631 , 632
UDP って, 仕様的に 「必ず届く保証がない」 ってのは知ってる
635 :
631 :2011/10/27(木) 07:33:40.59
>>633 知ってました。。。確かにそうですね。
教科書のサンプル通りに組んだんですけど、教科書にも間違いがあるんですね。
お陰さまで解決できました。
ありがとうございました。
ロストをフォローするようなコードになってないだけで別に間違ってるわけじゃないだろ 自分で考える脳みそがないのを教科書のせいにすんな
「ただし、空気抵抗は無いものとする」 と同じようなものだよ。 とりあえず空気抵抗を考えるのは次のステップで まずは基本を抑えておけと言う
で?
>>638 基本を押さえたら あとは実践あるのみだよ
今時だいたい仮想化できるんだから実践なんて必要ないよ
なら仮想を実践すればいい
linuxでネットワーク用のバッファメモリの システムでの合計最大量を制限する方法ってなかったっけ。 物理メモリの何%までとかいう感じのがあったような記憶があるんだが。
>>642 無い。
ソケットごとのバッファサイズや開けるファイルの数なら設定できるから
それらの掛け算で上限を決めることは出来る。
3人プレイのゲームをオンラインにするとき、Aをホスト、BとCをクライアントとすると B・C間のデータのやりとりってAを介して行うもの? それともBとCにお互いの宛先を教えて直接やりとりさせるもの?
他のゲームがどうやってるか、考えたこと無いのか?
俺だったら、3人のうちで、誰かの通信速度が遅かったり、急に切断されても。残りの二人が遊べるような仕組みにする だから、AB BC CA間全てでやりとりさせるな 簡単にするなら、BとCはインターフェースとしての役割にして(つまり、キーの入力とかをそのままAに投げる) Aだけでゲームの処理をする
>>644 どちらでも好きに。それぞれメリットデメリットはある。
特定のPCをホストにする場合、そのPCがボトルネックになる。
その代わりに作りやすい。
P2Pにしてもいいけど、各PCごとに持っている各PCの状態が事なってたり
する可能性があるので、作るのは難しくなる。
>>645 他のゲームがどうやってるか考えたら何がわかんの?
649 :
644 :2011/10/31(月) 16:17:13.13
すみません。 ひよっこC++プログラマーで、まず1:1通信を勉強し、いずれはサーバーを置いて2秒おき程度に通信しあって仮想空間を実現したい者です。 ネットワーク系書籍で、様々なプロトコル、ネットワークを実現する機器の構成、ネットワークを実現する技術のあらまし、OSI参照モデルなどの勉強はしたのですが、 ネットワークプログラミングの勉強をしようと書籍を読むと、いきなりPCを2台準備しなければ困難 と書かれており立ち往生しています。 やはりPCが2台無いと勉強はできないものなのでしょうか? また、個人でなるべく手間をかけずに実現できるのはどの程度で、どれ以上は個人では無理が出始めるのでしょうか? メンテナンスやセキュリティの技術が無ければ仲間内の小さなお遊び程度に留めるべきなのだろうなぁとは思っているのですが…。 良い勉強方、今、そして今後知るべき/読むべき書籍などの誘導をして下さると幸いです。 よろしくお願いします。
その勉強したっていうネットワークの本、もう一度読んで ネットワークとは何か勉強しなおそうぜ♪
653 :
651 :2011/11/02(水) 01:54:14.06
>>652 擬似的2台にみせかけて勉強するとかも困難なものなのですね・・orz
友人にプログラムを送って手伝ってもらうなりしないとなのでしょうか。 少し復習してみます。。
お前さんの思い込みが入ってるように思えてならないが 本当にその本に「PCを2台準備しなければ困難」と書いてあるなら、 書名をさらして今すぐ捨てろ
>>651 端末を二つ開いて、一つをサーバーに、一つをクライアントにすれば、たいていの場合同一マシンでも確かめることができます。
あとそんな方法でさえも教えてくれないというその書籍の名前を教えてください。
657 :
651 :2011/11/02(水) 04:02:52.92
>>655 オンラインゲームプログラミング という本だったと思います。
PC2台ないと解説についてこれなくなるという標記に肩を落とした記憶が・・。
>>654 ありがとうございます・・! 初歩的・・でもとにかく感触だけでも知りたいので色々試して学んでみようと思います。感謝っ
>>657 それはネットワークの都合では無くて、
ゲームの都合でついてこれなくなるんじゃね?
プログラミング初心者だと、ネットワーク系はデバッグが無理だろ。 こういう系のプログラム作るなら、9割りがた一発で通せるレベルじゃないと
うまく動作しているLAN戦略がWANにも適用できると思ってはいけない TCP/IPプログラミング徹底解説 Jon.C.Snader著
まずはネットワークスペシャリストの資格を取るべきだろ
663 :
651 :2011/11/02(水) 18:18:59.08
>>656 1台のPCでも確かめられるんですね; ありがとうございました;
>>658 そういう意味だったのですかね、、 10ページ程は無理に読み進めてみたけれどこんがらがって挫折してました;
>>659 おそらくそれです。
>>660 初心者では無いですが、中級者とも言えないひよっこです; なんとか頑張ります;
>>661 オンラインゲームで不具合だらけのパッチが来るのはそこが原因なのでしょうか。
654さんのURLから始めて2プログラム間のやり取りを試せて嬉しい反面、
やはり実際に外とやってみないと動作保障は無いと思った方が良いのですね・・。ありがとうございましたー;
>>662 > ネットワークスペシャリスト
うちの会社のもいるけど, 現場じゃ, 全然つかえねぇじゃんw
残念だが資格もってない奴よりはまだマシなんだぜ・・・
一般的な基準にはなるわな 持っていない奴等の中から本当に使える奴を探すよりも、 持っている奴等の中から探したほうが、ずっと早いし確実
勉強すればネットワークスペシャリストレベルの知識を理解し、覚えることができるという証明だからな 教えてできるかどうかわからない奴らよりはずっと信用できる(人間性を除く) たまに面接前に応用技術の過去問やらせる会社とかあるけど 流石にあれは何を求めてるのかわからん 資格持ってる奴でも普段そういう仕事やってなきゃできるわけねーのに
ネットワークスペシャリストの取得者は東大卒レベルだからな
でも今の合格率見るとたいしたことないかも 俺が受かったときは6%くらいだったのに。
>>667 普段そういう仕事やってる香具師を採りたいんだろ
>>669 なんで変数が x しかないのに∂なんだ?
何か問題でも?
A:4
VC++とWinSock2.0で通信プログラムを作ったんだけど PC_A --- モデム --- インターネッツ --- モデム --- PC_B な構成だと普通にSENDで期待通りにデータが到達するのに PC_A --- モデム --- インターネッツ --- モデム --- ブロードバンドルータ --- PC_B という構成にすると PC_Aがリスン状態でPC_BがPC_Aに接続することはできるのに どちらからSENDしても相手にデータが到達しないっていう ブロードバンドルータ的にはDMZに登録してない限り外部からのデータは受信しないと聞いているけど それならせめて送信はできてもいいと思うんだけどNAT的にデータが到達しないのが正しい挙動なのでしょうか?
もうだめだこのスレ
ほらねこういう基礎が無い人がいるでしょ。 でもネットワークスペシャリストを取得した人間なら こんな基礎はしっかり頭に入ってる。この違いがでかい。
DMZに登録するかポート開けないと
681 :
デフォルトの名無しさん :2011/11/05(土) 14:01:39.42
ポート解放?なにそれ?っていうめんどくさいユーザーのためにサーバー役以外はポート解放しなくてもいいようにしたいんだけど無理なの?
684 :
デフォルトの名無しさん :2011/11/05(土) 19:45:07.71
最低限のセキュリティって頭はないのか?
PGなんてのは最底辺がやる仕事なんだからそんな高度なことは考えなくてもいい。 全部解放でいいじゃん。
686 :
デフォルトの名無しさん :2011/11/06(日) 00:45:28.10
プログラマといえど安全設計を念頭にやったほうがいいとおもうが まあ試しに開放で・・・。
687 :
デフォルトの名無しさん :2011/11/06(日) 01:25:56.85
まあね
安全設計やってもやらなくても評価(単価)は変わらないよ。やるだけ損。 チャッチャと作って問題おこるころにバックレている方がずーっと賢い。
そんで次からは発注してもらえなくなると。
690 :
デフォルトの名無しさん :2011/11/06(日) 03:04:32.50
>>688 それは賢いプログラマーだと思うが・・・。
ずる賢い
なぜMSに発注が続くのか理解出来ない
スマートハブとかインテリハブとかあるでしょ? スマートで済むものにインテリの見積もり費用吹っかけておいたらウマー
>>692 それを理解できないうちはお金持ちにはなれんよ
まあね
gzipで圧縮されたHTTPをGZipStreamで解凍するとパケットが分割されてない、ひとつだけの時は解凍できるのですが 複数のパケットに分割されて送られてきたものを一つにまとめて解凍するとなぜか失敗します 何が原因でしょうか?
データが壊れてないかどうか比べてみた?
壊れてないです
仕様読めよ。昔読んだけど忘れた content encodingと・・・encodingってあったような content-lengthはcontentの長さ。圧縮後の長さだったような rangeは忘れた
お前が言うな
マルチキャストのプログラムを書いたんだけど、 ひょっとしてこれスイッチの負荷が物凄い?
>>702 マルチキャストは同軸ケーブル一本に乗っていた時代だからこそ容易に実装できたわけで。
死ねクズ
>>702 まぁな, スイッチのバックプレーンには確実に負荷がかかる
まぁ, その程度でアップアップするようなスイッチは捨てろ
ってな話もあるが... ... ...
あぁーそうか、昔はネットワーク装置側にとって ユニ・マルチ・ブロードでのキャストの違いはなかったんだっけ。 今は賢いのが当たり前すぎて完全に忘れていた。
WinSocket2のOverlapped IOの質問です。 クライアント側でサーバーにTCP/IPで接続した後、WSARecvでOverlapped IOして放置して、 で、例えば、WSASendでこちらは同期呼び出しで送信してる間に、サーバー側からデータ来た場合、 WSARecvの最後の引数で指定した完了ルーチンが呼び出されるのでしょうか?というか こういう使い方はアリなんでしょうか?
すみません。忘れて下さい。
不可能
不可能か netstat -b は不可能なんだ
urlまで取るならパケット横取りして解析するしかないか?
HTTPだからだろ
proxy
715 :
709 :2011/11/30(水) 16:28:21.12
やはりパケット解析しかないですか。 接続先IPアドレスだけだとちょと足りないんで。 昔のようなバカハブが安く売ってればいいんだけど、今逆に高くて・・・
winPcapでがんばれ
ホスト側とクライアント側に別れる事ができるゲームで 「ホスト側はポート●●番を開放して下さい」とよく表記されています ホスト側はあけたポートでデータを受信しているのはわかりますが クライアント側は一体どうやってデータを受信してるのでしょうか? 丸一日ほど探したのですが見つからないので質問させて頂きます
板違い
>>718 TCPならクライアント側のポートはOSなどが決定する。
・クライアントが通信を開始する
通信用のポートをOSに要求
・そのポートからサーバの決められているポートにデータ送信
このときサーバはクライアントはどのポートからデータを送ったのかも通知している
(TCPの仕様でポート番号もヘッダに含まれるから)
・サーバはクライアントのポートに対してデータを返す
・サーバから、もしくはクライアントから接続を切る
要するに、クライアント側は出口を「返事の入り口として開けて待っている」という状態。
> TCPならクライアント側のポートはOSなどが決定する。 ウソ教えんなよ。雑魚。
>>720 TCPではとのことですけど
やっぱりUDPでは不可能なのでしょうか?
何か回避策などあったりするんですか?
>>722 何が不可能なんだ?
何を回避したいの?
cookieに関しての質問です。 2chの専ブラを制作しているのですが、cookieの管理で悩んでいます。 cookieの仕様書通りに管理するプログラムを書いたのですが、 書き込み時に、PON=????の文字列が一番最初に来ないと書き込めませんでした。 ex) PON=...; HAP=... OK HAP=...; PON=... BAD 仕様書によると、pathは優先度が変わりますが、domainはその詳細に順位が関係しないはずです。 俺が知らない何かがあるのでしょうか。
2chサーバーが仕様書通りに実装されているという保証はどこにもない。
>>725 なるほど。でも、これだけ大規模なのに?
728 :
718 :2011/12/29(木) 20:33:07.64
>>723 すみませんUDPでも
ホスト側でクライアント側のIPやポート番号を取得することができました。
しかしホスト側でそのIPとポート番号を元に
クライアント側にデータを送信してもうまく受信できません
何故失敗するのでしょうか?
サンプルがいくらでも転がってるから、それを動かしてみて動かなかったら質問しろ。 お前が試行錯誤ででっち上げたクソコードの動作の予測なんてできるわきゃねーだろ。
>>728 クライアント側でconnect()でもしてなきゃ無理だよ。
>728 パケットキャプチャのソフト(ワイヤシャークとか)で、パケットが届いてるか確認してごらんよ。 あとはサーバとクライアントでプログラム入れ換えたらつながるか
>>728 ポート開放とか書いてたけど、もしかしてそれNATルーターの話か?
エスパーすると、サーバー側で受信したそのソケットから返信してないとか?
734 :
718 :2011/12/30(金) 19:32:14.69
手順は以下の通りで実装してます サンプルは色々探しているのですがUDPを使用したクライアントとホストの相互通信で ホストのみがポート開放をする例のサンプルが見つからずに苦戦しております ●ホスト側 ・準備 ①受信用のUDP用socketを作成する ②受信用に使うsockaddrを作成する(ポート▲番指定) ③送信用のUDP用socketを作成する ・受信 ①bindで受信用socketを結びつける ②recvfromで受信用socketからデータを取得する ③上記の処理で手に入ったポート番号とIPで送信用socketを設定する(ポート■番がわかる) ・送信 ①sendtoで送信用socketを使う ●クライアント側 ・準備 ①送信用のUDP用socketを作成する ②送信用に使うsockaddrを作成する(アドレス・ポート▲番指定) ③送信用のsocketをconnectする ・受信 ①bindで受信用socketを結びつける ②recvで受信用socketからデータを取得する(■失敗する■) ・送信 ①sendtoで送信用socketを使う Q1・クライアントでホストがポート何番に返信されたかが不明なので受信は不可能なのか Q2・UDP通信でconnect()は本来の用途ではないと書かれていたのですが正しいのか
だから、ちゃんとした教科書つかえよ。 ホスト側、クライアント側ともに「送信用ソケット」と「受信用ソケット」を使わない。 1つのソケットを送信、受信で共用する。 ホスト側にUDPが届く設定ができているなら、これで送受信できるはずだ。
同じポートで2つソケット開いてるんだな。それだと、どっちのソケットに届くか不定だったはずだ。 普通ソケットは、同一マシン送受信で1個で設計する。 サーバ側 7001 クライアント側 7001 (分かりやすくするため7011とかもok) まあ送信用と受信用で別にしても作れる。その場合は、同一マシン内はポートを別にする。 例えば、 サーバ 受信 7001 サーバ 送信 7002 クライアント 受信 7001 (7011とかもok) クライアント 送信 7002 (7012とかもok) 送信で相手ポートを指定するのに、sendじゃなくsendtoするんだからconnectは不要。 自分のポート指定は全部bindで行ける。 前の人も言ってるとおりまともな教科書買えよ。スレのアタマ見たか?
あと、基本を勘違いしてそうだな。 1方向の1通信で、送信元ポートと送信先ポートがあるんだぞ。 サーバ側プログラムでrecvfrom 呼ぶときお前が指定すべきなのは、クライアント側の送信元ポート。どの送信元ポートでも受け付けるならanyaddrを指定する。 呼んだあとで取得できるのは、サーバのどのポートに届いたか(送信先ポート)であって、送信元ポートじゃない。普通はbind済みで自明なので、そんなの見る必要ない。
anyaddrじゃなくanyportだった。間違い。
先ずは車輪の再発明と模倣と反復練習と復習。軟弱地盤にゃ土質改良が必要。
>>734 サーバー側が recvfrom で受け取ったアドレスをまんま使って sendto しないのはなぜ?
以下じゃだめな宗教的理由でもあるの?
recvfrom(s, rb, sizeof rb, 0, (struct sockaddr*)&a, &l);
/* 何かの処理, aとlの内容はつつかない */
sendto(s, sb, sizeof sb, 0, (struct sockaddr*)&a, l);
すみません間違えて投稿してしまいました
>>737 そうなのですね勉強になります
anyportについて検索してみても資料が出てこなかったので別の言い方とかありませんか?
>>740 わかりにくくてすみません
ちゃんとプログラム側ではそう実装しておりました
そう実装してました、って、じゃあ
>>734 で書いてることと違うじゃん。
どっちが本当なのよ?
そうなのねですか勉強になりすます
すまん間違えた。recvfromで取れるアドレスはやっぱ送信元だ。吊ってくる
DoCoMoの不具合連続で不安になったんですが、 C++やjavaでtcp通信用のソケットを生成して通信する場合、 生成から破棄まで、特殊なことをしない限りは、通常は通信相手は固定ですよね?
>>746 まぁそうだね。
自分が特殊な事をしなかったとしても、経路上にある機器や、
通信相手が特殊な事をしていないとは限らないけどな。
やっぱそうですよね、よかった。
何がよかったのか…
通信がおかしい場合は「相手が特殊なんだ」と相手のせいにできる 口実を手に入れたつもりになっているんだろう。
>>746 の1行目とそれ以降が繋がってない気がする。
752 :
デフォルトの名無しさん :2012/01/08(日) 18:29:24.53
IPv6でdivertでパケットを横取りしてルーティングヘッダを 付けようとしていますが、うまくできません。 誰かIPv6でヘッダに拡張ヘッダを付加する方法を知りませんか?
ルータにはじかれるだけでしょ、小細工すると
はじかれる前にパケットを送れてないんですよ
Windows 7 Professionalで、XPのrsh.exeと同等の機能を使いたい何とかしてくれ。 用途は、VC++で作った自前のアプリからrsh.exeを呼んで、サーバのシェルを実行し、その結果を取得したい。 無償、有償は問わない。rshクライアントのソースコードでも構わない。
ここはプログラミング板なので作成依頼ということだな。 100万/納期1か月で作ってやるよ。
>>758 どうしてCygwinのrsh.exeは論外なの?
VB5で書かれたrsh.exeがころがってるからVCに移植すれば? そんなに複雑なコードじゃなかった記憶があるし
>>759 CygwinのrshってVC++からコールして使えるの?
あとCygwinって商用利用とかダメだった記憶が。調べてないけど
あくまでもrsh単体を自前のアプリに含めて商用利用したい
一応売り物なんでどこぞの怪しい物は使いたくない
>>761 コマンドラインアプリなんだから普通に使える
GPLなので商用利用は問題なくできる
ソース公開義務はrshにのみ発生する
rshの使用を強要される商用アプリなんか使いたくないな。
もうほっといたれよ
>>755 PuTTYのplink.exe使うと良いよ。
怪しい物は使いたくないって言ってんだろカス
超メジャーなんですけど・・・ Googleの検索結果 約 31,200,000 件 (0.13 秒)
こんなのも自前で作れない奴がソフトでお金を取るとか
>>770 人月いくらでやってるITドカタには、こんなレベルの奴腐るほどいるよ
html書けます!perl書けます!って そこらへんの主婦でも書けるもんな アセンブラからC#みたいな今風のやつまで全部できる奴が欲しい あと、大規模なプログラムも設計できて、他人のコード読めて、数学ができて、コードが速く簡潔に書ける奴 俺のことだけど まあ、プログラミングの仕事したこと無いんだけどさ
もう少ししたら始めるんだけど、どのくらい稼げるのか楽しみ><
>>772 俺もできる。
ついでのハードもできる。
初任給手取り16万がいいとこかな
マジかYO
ネットワークプログラミンクの話に戻すよ。 C#のWCF、やってみたらなかなかよかったぞ。 オイラ、(多分ここの住人も同じと思うが)バークレーソケットをこのスレの頭にあるような本で学んだクチだ。 SolarisやLinux、HP-UX、win32等の仕事で大いに役に立ったが、あのAPIっていまいち「イケてない」感があると思っていた。 RPCエンコとかもXDR,NDR,SDR,...統一されてないし。 WCFはイマドキな(httpやxmlなど、ヤレヤレって思うような)感じだが、少し対象レイヤーが上で、API構成に「イケてる」感がある。 機会があったら毛嫌いせずやってみるといいよ
778 :
755 :2012/01/25(水) 16:43:56.75
自作するのがただ単純にめんどくさかっただけなんだ 仕方ないんでC++でRSHクライアント自作することにした どこかRSHの詳しい通信仕様のせてるサイト教えろ
なんでplink.exeつかわんの? アホなの?
それのどこが仕様だよ 馬鹿じゃねえの
残念ながらこれがberkeley伝来の仕様なんだ。これ以外には存在しない。 だから100万出せって。w
>>778 rfc1258.txr
^^^^^^^^^^^^^^^^t の間違いだった
それはrloginだから違う。100万払う気になったか? w
webサービスでやったほうがいい
>>787 実際楽だしな
httpsでパスつけりゃやりたいことはすぐ出来るしね
質問に対し親切に教えているにも関わらす、まともに礼も言えないかまってちゃんは、徹底的に無視でお願いします。 荒らしをいつまでも構うのも荒らしです。
今時、商用アプリでrsh使おうってくらいだから… 多分無能上司の下で働く、上司に輪をかけた無能なのだろう。
>>790 ちっさいちっさい視野でほざくなカスが。
特定の企業向けアプリケーションで、当然お客様にも了承済み。
ポートも開放してもらう。
ローカルエリアネットワーク内にアプリの乗った端末PCを入れて、
装置ワークステーション(以下W/S)に対して様々な通信処理を行う。
内一つの機能として、RSHを使用し、W/Sのシェルを実行して、
その結果を得る機能を提供している。
先日、RSHクライアントの仕様が掲載されている良い書籍を見つけました。
汎用的なRSHクライアントではなく、機能を限定した形で自作完了した。
以上、いろいろとご教授ありがとうございました。
徹夜明けなんで今から寝ます。
792 :
755 :2012/01/27(金) 06:18:49.43
rshの利用を検討したとき
まともな客:まともなSIer → (SIer)rshはやっぱダメですよね。(客)うんダメだね。
無知な客:まともなSIer → (SIer)rshはやっぱダメですよね。(客)そーなの? じゃやめとこう
まともな客:素人SIer → (SIer)rshでいいですね? (客)寝言言ってるんじゃねー、帰れ
無知な客:素人SIer →
>>791 ロシアンクラッカーの踏み台候補が一つ増えたって事だな。
だから相手すんな。話変えるぞ。 今の時代、パケットのエンディアンてリトルに合わせたほうが多数が幸せな気がする。 最近のビッグ陣営ってどことどこなの?
バカSIerの犠牲者を減らすためにバカっぷりを晒しておく必要がある。 「パスワード無しのサーバーと同等ですが、いいですね。情シスにも そのようなサーバを設置すると報告しておいてください。」と説明し て了承受けたわけでもあるまい。 > 今の時代、パケットのエンディアンてリトルに合わせたほうが多数が幸せな気がする。 バカ? エンディアンが混在するなんて真っ平御免だ。 既存のネットワークと一切無関係な世界作るなら勝手に作れ。
もうバイナリをやり取りするの辞めようよ
リトルエンディアンにするより遥かに現実的だな。
>>790 相手(サーバ)側の都合で、sh叩いてくれってのは今でもたまにあるが。
>>798 rshでなくsshでやれ
といいたいんだと思うが、今時のrshはsshなのでどうでもいいかな
>>794 IP層とかTCP層とかがビッグ代表格じゃね?
>>799 え、そういう話?
なら、そう言えばいいのに。
>>794 > 最近のビッグ陣営ってどことどこなの?
汎用機, power, 68k/coldfire, spark 辺りかな
# メモリーマップの左上が 0 番地な big の方がドキュメント書くときは楽
数字の表記もリトルエンディアンの方が便利だったような気もするなぁ。
>>802 良く落ちるスパークの綴りぐらいおぼえておいてくれよSPARCだよ
WinSock2.0でパケットキャプチャをしたいんですけど WSARecvで受信した後、いろいろ処理してて次のWSARecvまでに 間があると取りこぼしちゃうみたいなんですけど 取りこぼさないようにする方法はないでしょうか?
ネットワークプログラミング以前の問題だなwww
>>805 間を開けずに次のWSARecvを呼べばよいです。
いろいろ処理を別スレッドにしてみました。
取りこぼし減りました。でもやっぱり大量に来ると だめみたいです。あきらめます。
質問です。 adobeのRTMPにて映像のストリームと音源のストリームをサーバーに送信したいと思っています。 OSはWindowsでクライアント環境は.Net(C#で組もうと思っています)です。 FluorineFxというのを見つけたので、中のサンプルを動かして見て接続はできたのですが、その先が分かりません。 (Misc\RtmpClient\WindowsApplicationというのを動かしました) 映像のストリームと音源のストリームをサーバーに送る方法が分かる方がいらっしゃいましたらお願いします。
>>799 > 今時のrshはsshなのでどうでもいいかな
油断禁物。普通に古典的なrshが入っているOSある。
一か月近く前に終わった話題に、今頃になってトンチンカンなレスつけるってかっこ悪い。
814 :
デフォルトの名無しさん :2012/02/26(日) 14:02:06.36
ライブラリに限らない話だけど最近はちゃんと調べるのをさぼって 使い方だけ知って終わりにする奴が増えた気がする
いいんだよそれで すべての人がすべてを知る必要は無い
でいずれ誰も知らないという時代が来るわけね
料理は作れないがメシは食える 料理人が絶滅したらメシ食えなくなるかもな そのころには料理ロボでもできてるかもしれんが
技術は継承されない 悪習は蔓延する
継承できないのなら先人たる我々の力不足か元々いらないものなんだろう
winsockを使いたい奴はいると思うが、winsockの中身をいじりたい奴はあまりいないだろ。 全てを調べろというのは無茶だ。 っていうかソレ言うと、このスレの存在意義が無くなる。
今度は中身をいじるとかわけわからんこと言い出すが出てきたなw
>>821 君はwinsockの全てを知っているといいたいのだな。
お前らは全部言わんと分からん子かw
そりゃぁ お らは わんと からん かw 一部だと解らんがな?
馬鹿には無理
目クソと鼻クソが争ってるな。 2chもレベルが下がったもんだ。
ネットワークプログラミングをTDDでやろうとしていつも挫折するわ
TestDrivenDevelopment
>>828 RFC standard tracking 自体が TDD だと思うんだが
思うんだが…と書かれても
>>830 思ってるだけじゃダメだろ!
その思いをもっと表現しろよ!
マルチキャストについて教えてくれろ 239.255.255.6と受信設定した場合、239.255.255.6宛のマルチキャストのみ届くの? それとも、239.255.255.2、4、6宛のマルチキャストがすべて届くの?
受けるほうがマルチキャストに対応してないといけないんとちゃう
>>833 joinしていれば239.255.255.6宛のマルチキャストのみ届く。
192.168.0.255/24のブロードキャストアドレス場合、 192.168.0.255 & 192.168.0.X == 192.168.0.X が成立すればブロードキャスト範囲に含まれる!とかそういう発想でもあったのであろうか?
正式に名前解決が出来ないことが保障されているドメイン ってなんだっけか。 なんかあったよね?
example ?
example.comは解決できます。到達も可能です。
まあいいや chinko.unko とかぜったい解決できないだろ
844 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/29(木) 01:45:01.22
アッー!
AIJ社長の詐欺罪を必ず立証する! 官僚が他人の金を盗んでしゃーしゃーと「年収7千万は問題ない」 などと国会答弁するんだから人権以前の問題だな 完全にトチ狂ってるw
いかにうまく国民から巻き上げるかしか考えてないぞあいつら
UDPは以下の認識で合ってますか? ・送ったものが届かないかもしれない ・送った順番で届かないかもしれない ・受信されたものは受信側のPC内部で化けない限り正しい ・送られたパケットが重複して受信される事はない
3. ヘッダのチェックサムを信じる限りは。 それじゃ信頼性低いという用途であれば、 自分で信頼性を確保しましょう。 4. 重複します。
>>848 UDPってエラーパケットは闇に葬る仕様だと認識してますけど
どういう仕組みで重複するのでしょう?
850 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/01(日) 12:41:15.32
MAC層が誤認で再送することがある
>>850 ありがとう!
Ethernetが大きなお世話をすることがあるのか。
あ、Ethernetのコリジョンチェックの誤認識で再送される場合があるってことか。
・受信されたものは中継側で化けたりしてると受信側のPC内部で化けてる
>>853 え?
CRC合わなくなるんで破棄されて届かないんでは?
256分の1の確率でCRC合うんじゃないの?
CRCって16bitじゃないの?
Ethernetで使われるのは32bitのCRC IPで使われるのが16bitのチェックサム
まあ細かいことはいいっこなしで
いや、細かいことも理解していないと たまたま運がよくて動いているプログラムが出来上がる。
信頼性あるもの使えよ
>>849 IPやUDPの設計の基本は、
「(ルータ等が)こういう仕組みで~してしまうことがあるから」ということじゃなくて、
ピアトゥピアのパケット転送で保証できないことは何も保証しないということ。
つまり中間がどんな馬鹿な経路であっても、(ただし邪悪"mal-functional"な経路は仮定しない)
端末と端末だけでできることのみ保証する。
これにより経路設計に自由度を与えている。その代わりにTCP層その他で頑張ってる。
この設計はEthernetから大きな影響を受けてる。
残念だけどこうなってしまったねということじゃなくて、
雑多なネットワークを様々な種類の経路で接続するための中間(inter-)ネットワークとして開発され、
自由度を最大限に発揮するために、理屈詰めで設計されている。
消極的ボトムアップ設計ではなくて、色々と概念整理した後の積極的トップダウン設計です。
ハード屋だけどもバーストエラーあるから ビット数から受ける印象よりも頻度高い。
バースト読んでまだ入るからな
864 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/04(水) 11:33:05.82
ネットワークやるときはな、ガチでやるならな 相手が何をしてきても平気なように作れ 自分の家から出たらみんな敵
866 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/04(水) 12:19:26.44
apacheのヘッダーが長すぎるとメモリバカ食いして落ちるみたいなバグあったじゃん あんなの最初作ったときに想定しろっつーの
サーバ側の一番単純な記述例=テンプレート、スケルトン等があるURLをお願いします。 単に固定応答でかまいません。 ですがシングルタスクタイプはNG 検索したのは複雑のばかりでした。
868 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/05(木) 16:45:16.64
ソケット通信によるサーバプログラムを書いている初心者です。 ノンブロッキングで複数のクライアントを待ち受けるとき select()を使うのとスレッドを使用するのはどちらがいいのでしょうか? 速度とか安全性とかそういう面も教えて頂きたいです。
OSは?
処理そのものはマルチスレッドにしなくていいんだろうか
>>870 そんなん状況によるとしか言いようが無いだろ
なので、メインロジックはどっちの方法でも動くように書いとく
>>870 aioも検討対象にしようぜ。
まあOSと言語によるが。
>>870 スレッドが良くわかっているとすると
CPUコア数と同じスレッドとSelect()の組み合わせ
謎なぞ? 複数クライアント同時処理したいとして、俺なら select方式にするならシングルスレでブロッキングでやるし マルチスレ方式にするならなおのことブロッキングでやるから 何言ってんのか分からん unix 系とwindows では公式リファレンスが「非同期」と呼んでるものがズレてるからos分からんと混乱するし 作る気あるなら手動かしてから○○が上手く行かないと 聞くはずだし 覚えたての単語で書き込みたかっただけか?
>>876 ソケットそのものはノンブロックにするのが基本だろ?
なに言ってんだ?
878 :
デフォルトの名無しさん :2012/04/14(土) 13:21:21.88
1ソケット1スレッドならブロッキングで良いだろ。
ブロッキングにしたらブロックしちゃうだろ 何考えてるんだ
>>879 ブロックしちゃってもまずくなければブロックのままで良いのでは?
>>879 メインのスレッドが「accept()→別スレッドにブン投げ」くらいしか
やることがないなら、ブロッキングで充分じゃないか。
(クライアント数が少ない場合)
>>881 ブロッキングだと自分の側からスレッドを終了できないのがつらいところ(通信相手から QIET みたいなのを送ってもらう、とか取り決めておかないといけない)。
>>876 例えばCPUが4コアなら4つのスレッドを立ち上げて
それぞれのスレッドでSelect()処理を行わせて多重化する。
workerスレッド方式でやる場合、各workerがselect()するやり方って一般的だっけ? そのとき、select()で監視するソケットは各workerに振り分けるんだろうか?それとも共通なんだろうか?
>>884 常識的に考えて select() はひとつ、read() した結果をみてから各スレッドにわけるんじゃないかい?
俺はselect()はひとつで、そこで起きたソケットをworkerへ渡してそっちでread/write
するのが普通かと思っていたが。
>>883 も
>>885 もやり方違うんだな。
listen(), Accept()がひとつでAccept()で起きたソケットをworkerに振り分けて select()で処理すりゃ良いんじゃない。
いや、それだと1socket=1threadになるんじゃないか?
>>888 select()って複数ソケット守りできるんでは
>>890 nクライアントmスレッドに出来るだろ・・・
>>889 そこで、1threadが複数のsocketを処理するworker方式で
>>883 はどうやってるんだろう
というのが元の質問だったんだが。
新しくaccept()されたソケットを各workerのどれかに振り分けるとした場合、
・1つのworkerが担当するソケットが複数読み書き可能になった場合、他のスレッドが遊んでいても
直列的にしか処理できない
・そもそも割り振られたworkerがselect()で待ち受け中の場合、新しいソケットを待ち受けることができない
という問題がありそうに思えるけど。
>>892 割り振ったworkerが偏っちゃった場合は諦める
895 :
デフォルトの名無しさん :2012/04/15(日) 00:55:26.36
レイテンシのことでしょ
>>894 なのにそれでもworkerスレッド内でselect()したいという理由がわからないんだが。
他になにかメリットがあるんだろうか?
それとやはり、そのやり方だと全スレッドがselect()でブロックされたまま新しいソケットを
処理できなくなることがあるように思うんだが。
897 :
デフォルトの名無しさん :2012/04/15(日) 07:35:59.32
コルーチンで実装したことある コルーチンの切り替え判断をC++のストリームに内臓させちゃって 結構使いやすいんだ
898 :
デフォルトの名無しさん :2012/04/15(日) 07:42:15.64
でもなんだっけ、linuxでファイルをそのまま送るやつ。lighttpdの売り カーネル内でなんかやってメモリコピーが減りましたってやつ 思い出したsendfileだ
899 :
デフォルトの名無しさん :2012/04/15(日) 07:48:03.60
みみっちいよな。メモリアクセスがオーバーヘッドになることなんて 俺なんてサーバー作ったとき書きやすさのためにバッファ何層も重ねたぞ chunk用のストリーム、・・・用のストリームって
sendfileが軽減したのは、 単なるメモリアクセスじゃなくて、 カーネル/ユーザ空間間のコピーだよ。
>>896 リスナーのソケットをSelect()に入れればAccept()拾えるんでは?
そもそも、select()を使う場合は recv()~何かの処理~send() が 短時間で終わらないと破綻する。
どれかひとつのスレッドでリスナーを待ち受ける場合、他のworkerに 処理を渡せない場合があることは変わらない。 それとも、全部のスレッドで同じリスナーソケットをselect()する?
>>904 複数ソケットでそれを行うとselect()の再発明になる。
>>905 select()のかわりにノンブロッキングI/Oを使えと言っているわけじゃないよ?
select()でトリガを受けて、read/writeをノンブロッキングでやるのが最近の流行。
>>907 今更と言うか、結局、
>>883 のように各workerスレッドでselect()するという場合
どのスレッドでどのソケットを監視することになるのか、これだけ質問しても
よくわからなかったんだ。
今更というくらい明らかなことだったらちょっと教えてくれないか?
>>906 select()でトリガ拾うとrecv()/send()はブロックされないのでは?
ソケット廻りって結構古いもんを引きずってるからね。
>>909 待ってれば読めるだろうけど多少なりともブロックされることはあるらしい。
>>912 WSAEWOULDBLOCK をスルーすれば良いのんか。
>>910 入門本に書いてあることが流行だと言ってる?
>>908 1スレッド100本くらいで100スレッドくらい
これならそんなに無理なく1万本管理できる
916 :
デフォルトの名無しさん :2012/04/15(日) 13:53:58.20
1万コネクションサポートするのに1万スレッド作ったら問題あるのだろうか? OSにもよるだろうけど。。。
32bitOSじゃ無理。64bitならもしかしたら大丈夫かも。
>>916 無理がある気がするな。
Apacheなんかどういう実装になってるのだろう?
>>915 いや、そういう問題じゃなくて。
その100本のスレッドのうちリスナーを監視するのが1本なのか全部なのか?
もしリスナーをselect()しないスレッドがあるとした場合、そいつらがselect()で
ブロックしてしまう問題をどうするのか?ってことなんだが。
もちろん、100本もスレッドを用意したのに状況によって1本しか走れない
ということも考えられるし。
>>919 そのselect()とやらが何をブロックするのだ?
>>917 ,918
そうですね。当然でした。
調べてみると、例えばWindowsのCreateThreadで作れるのは
最大で1プロセス2028スレッドとありました。
当然そのスレッドを、だが。 もしかして、timeout=0でブン回すという使い方なのかな?これ。
>>922 そのスレッドでアイドリング処理をしないのならブロックしても問題なかろう。
recv(),send(),accept()の処理以外で何をするのだ?
いや問題あるだろ。 1スレッドが100ソケット受け持ったとして、そこで複数のソケットが読み書き可能に なったとしても他のスレッドは何もできないんだから。
>>914 入門書であること力点をおいているのではなく、1990年代の書籍であることに力点をおいています。
1990年代にしめされている手法が「最近はやっている」とは考えにくいでしょう、普通。
関係ありませんが、この本、ネットワークバイトオーダーに問題はあるものの、 fj でも一定の評価がついていましたね。
いやー、昔から使えたということと流行は関係ないでしょ。 一昔前ならわざわざ面倒なノンブロッキングI/Oを使うよりも 上の人のようにスレッド+ブロッキングI/Oの方が人気があった ような気がする。さらに前だとfork()が主流だったよねぇ。
1992年でfjってのも微妙な話だなw
C10Kみたいなことが言われて、selectやpollの性能向上が始まったのが、 1990年代後半からだよ。本格的には2000年代入ってから。 マルチスレッド+ブロックI/Oやforkによる実装も普通に行われていた。 非同期I/Oの優位性は80年代から言われていたけど、(X11のプロトコルがそうだし) 低レベルAPIとして登場したのはその後だね。
>>924 そうならないように分配すればいい
その上でどうしてもそうなったらあきらめればよろしい
>>919 リスナーは1本で。
各ワーカーにはパイプで適当にソケットを送りつければ良い。
select使うのにlistener必要? 分配にポリシーを実装する必要なければ、複数のworkerが直接同時にselectすればいい。
>>931 だれも待ち受けしなかったらサーバにならなくね?
スレッド1万あるよりはマシ
WIndowsのselectは性能悪かったしね。たぶん今もそうだけど。
>>935 winならそれでいいんじゃね?
unixlinuxには選択肢ないからな
>>930 なるほど、やりかたはわかった。ただ、わざわざそうすることのメリットがよくわからないな。
activeなソケットの偏りで効率が落ちる問題は残るし、特にプログラミングが簡単になるようにも
思えないし。
>>929 「そうならないように」って、無理だろそりゃ。どのソケットがactiveになるか事前に判断できる
わけがないし。
>>936-937 スレッド嫌いなのでselect()で実装してやったけど
なんの問題もなくサクサク動いたよw
Winsock FAQってWindows 9x の時代のものじゃないのかな。
UNIXだとfdが多くなったらselectより、poll, epoll, /dev/poll, kqueueでしょ。 意外にもfd maskのbit演算がボトルネック!
>>938 C10Kのようなのだとスレッドのオーバーヘッドのが大きくなるから。
クライアント数が少ないのならスレッド実装のが楽
95系のselectは性能どころか仕様にも問題あった。 詳しくは古いwinsockのドキュメント読んでくれ。
>>931 こっちは同時select()か。全スレッド同時に起きるけど、mutexを奪った1スレッドだけが
処理するという形になるわけかな。
>>943 それではスレッドにする意味がないような。
>>943 違うよ。
同時selectしているスレッドの一つだけが起きる。
どれが起きるかはスケジューラ任せ。
自分で選びたいならlistener/schedulerを作らないと仕方ない。
read等も同様の仕様。ほとんどのUNIXが。
>>945 そうだっけ?それだとレベルトリガじゃないような気もするが、正直1つのソケットを複数のスレッドで
同時にselect()するなんてやったことなかったから勘違いしていたかもしれん。
であれば、どのスレッドにどのソケットを監視させるかという割り振りも必要なかったといことか。
forkするマルチプロセスサーバが一つのsocketで全員acceptしてますよ。 じゃないと同じポート番号にならないし。 もちろん起きるのは一つのプロセスだけ。
>>947 Unix 系はいいんだが, WinSock ってそのへんどうなってんの?
# 明日から Windows でネットワークプログラムするはめになってしまった orz
>>938 1万スレッド起こせるならその方が楽だけどね
普通は無理っしょ
>>938 事前に判断なんて無理なので、無理しないで淡々と振り分ける。
偏ったらあきらめるか、ソケットを余力がある他のスレッドに投げる。
Winsockの場合は、対象となるWinsockのバージョンのドキュメントをしっかり読んでください。 特にXPでは~、Vistaでは~、7では~との注意書きは必ず読みましょう。 読まない人はプログラム書くなと言いたくなるくらい細かい違いが多い。
>>945 これ本当?どこかにリファレンスがあるなら教えて欲しいな。
例えば、ソケットがread readyになって起こされたスレッドがreadしなかった
場合とかどうなるの?
別に何も起こりませんが?
>>954 「何もない」があるのよ!
epollとかでエッジトリガとかだと何もしないがゆえに
問題になることはあるかも
>>954 理解できないです。
select/pollはレベルトリガですよね?
起こされたスレッドがreadしないでsleepしたら同じsocketでselectしている
別のスレッドが起きない?
>>956 それでいいだろ
Aのスレッドでなにも怒らないからBのスレッドで怒り爆発だろ
この程度の基本的な枠組みの常套手段すら確立されてないなんて・・・
されてるってw 2ちゃんねるは世界の全てではない。
すいません。よくわからないので具体的に教えてもらってもいいですか? unixでCPUコアが4つあって 1000人までクライアントを待ち受ける場合 ・スレッドを4つ作る ・各スレッドでselect()をする ってことですか? その場合、各スレッド250人までをどうやって割り振ればいいんでしょうか? 均等に割り振る事ができるんでしょうか?
別にスレッドは4つである必要は無い。 スレッドを作らなくてもいい。 振り分けは適当でいい。 全部スレッドでもいい。
ワーカー数と各ワーカーの担当数の積が 最大せっちゃん数を 上回ってればどうでもいい
>>960 > 1000人までクライアントを待ち受ける場合
処理する内容を詳しく言わないとわからない。
スレッド数、ジョブの回し方は処理する内容に依存する。
4人対戦のゲームのサーバを想定しています。 1000人までのロビーがありゲームする部屋が10あるとします。 4人集まったらゲーム開始、サーバではゲームの進行やカードを配ったり といった処理もさせます。 こんな感じのことをしたいのですが、どうでしょうか?
どうぞご自由に
967 :
876 :2012/04/16(月) 22:49:16.49
うむ。どうやっても出来るから、まずは手を動かして作れよ。 OSがUnix系なら、Windowsに関する話は参考にならないよ。 >3 先頭のリチャードスティーブンスの本を、超おすすめする。 お前の人生上絶対、もととれる。 参考までに、俺なら ・4プロセス。 ・各プロセスは別ポート番号。全く別のマシンであるかのように設計。 ・1プロセスは1スレッド。 ・長いトランザクションで1クラがサーバを占有しないよう トランザクションを中断・再開できる工夫をする。 で組む。 マジレスだが、プロトタイプを各方式で作って実測し、 本チャンの方式を決定するのが王道だぞ。どんな案件でも、 方式設計でプロトの実測値がないと空中戦(机上の空論ばかりで 結論が出ない)になる。 「均等に割り振ることができるんでしょうか?」じゃねぇよ アプリの特性を考慮してお前がそれを考えて、比較して、決定するの。 そんなレベルで1000人とか言ってないで まず250人処理できる1個のサーバを作るほうが先。
968 :
876 :2012/04/16(月) 22:57:49.50
もし本当に負荷分散を勉強しいなら、「ロードバランサ」製品が
どうやってるかを学んで、そこで振り分け先の「サーバ」を
「プロセス」に置き換えて考えてみやがれ。
参考まで:
http://www.networld.co.jp/slb/load_sharing.htm (俺は、お前さんが今やるべき事は違うと思うけどね)
>877 俺と君は意見が違うようだが、
Unixでselect(epoll等含む)するならブロッキングのままのほうが、
俺の経験上は楽だった(テスト工程とか)。
君がどうつくるのが好きかは君次第だから、君の言葉で語れ。
俺は否定しない。
>879 ソケットはブロッキングモードで、selectすれば
ブロックしないよう作れるよ。"Unixでは"その方が普通。
てかselectってそのためのものだよ。
syn reset してくる、普通じゃないクライアント(ポートスキャナ等)
の対策とか、高度な話はいろいろあるけど、今はそういう話じゃない
から割愛します。
>>968 そう。だからソケットはノンブロックが基本なんだよね。
select使うならなおのことブロッキングにしとく意味がない。
やっぱ、この程度の基本的な枠組みの常套手段すら確立されてないじゃんw
>>965 俺なら、
・部屋数プロセスを起動
・ゲーマごとにスレッド
・その他必要なプロセス(対戦者入り口、割り当てなど)とスレッド(カード配布する親など)。
ポートは、
・入り口 (*1)
・部屋ごと
でacceptして、前者のプロセスから後者のアドレス/ポート番号を聞き、
部屋プロセスとゲーマのクライアントは直接接続を張る。
こんなところから始めてみる。
開発では、最初は1プロセスのみで、1部屋4人だけのサーバを作る。ロビーとかなし。
部屋割り当てロジックは後から作る。
上の構成なら分離されてるので、独立に開発できる。
つまり、このスレの住人は、workerの仕様もわからないのに自分語りをはじめてしまうお馬鹿さんばっかということだね
そうだね。質問の直後はひどかったね。
>970 そうだよ。だからどうした。スタートはそこからだ。 それを理由におまいさんがネットプログラムやめてくれても 全く構わないし、「俺がガンダムだ」宣言して 各OS統一できる基本的な枠組みを作ってくれてもいいぞ。 そしたらおっちゃん嬉しくて涙出る。 みんな夢見て挫折した、死屍累々の歴史があるの。 俺はWindowsの64ソケット制限がガンだと思うんだが、 でもその分WinはUnixのAIOより非同期が明後日の方へ進化して カッケェことになってるしなぁ。
>>976 だからどうしたって、されてないでしょと言ったらされてると主張した奴がいたから、
やっぱりされてないじゃんと言っただけなんだけど
なんか気に障ることでもあんの、おっさん
>>972 >開発では、最初は1プロセスのみで、1部屋4人だけのサーバを作る。ロビーとかなし。
スレッド(カード配布する親など)、これはゲーム進行をコントロールしている
スレッドって意味ですか?
それプラス4人の計5つのスレッド構成でやる感じでしょうか?
スレッドを駆使してやる理由を教えて頂いてもいいですか?
select()では駄目でしょうか?
やっぱりIDいるよな
もはやこのスレとは論旨が異なってきてる気がするな。 妥当なスレってないのかな。
>>976 64ソケット制限っておっちゃん浦島太郎なのか?
>>979 対ゲーマーのロジックに専念出来るから。
ちなみにマルチスレッド構成と、
selectは共存しうる。
1スレッドが複数の(I/O)イベントを対象いすることがありうるから。
イベントで全部済ますのは作るの楽でいいな
>>986 ありがとうございます。勉強になりました。
979を指針にして作成してみようと思います。
>>987 作るのはスレッドにしてしまったほうが楽だが。
>>988 間違いました。972でした。
ありがとうございました。
うめ
うめす
協力うめ
佐川梅三郎
うめ
1
2
3 ダー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。