1 :
echoちゃん :
2008/02/29(金) 21:19:37
keep-aliveの使い方を教えてほしいです。
/ ̄\ | | \_/ | /  ̄  ̄ \ / \ / \ / ⌒ ⌒ \ よくぞこのスレを立ててくれた | (__人__) | 褒美としてオプーナを買う権利をやる \ ` ⌒´ / ☆ /ヽ、--ー、__,-‐´ \─/ / > ヽ▼●▼<\ ||ー、. / ヽ、 \ i |。| |/ ヽ (ニ、`ヽ. .l ヽ l |。| | r-、y `ニ ノ \ l | |ー─ |  ̄ l `~ヽ_ノ____ / ̄ ̄ ̄ ̄ヽ-'ヽ--' / オプーナ /| .| ̄ ̄ ̄ ̄ ̄ ̄|/| | ̄ ̄ ̄ ̄ ̄ ̄|/| ______ / ̄オプーナ/|  ̄|__」/_オプーナ /| ̄|__,」___ /| | ̄ ̄ ̄ ̄ ̄|/オプーナ ̄/ ̄ ̄ ̄ ̄|/ オプーナ /| / .| | ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/l ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄|/| / | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
10 :
デフォルトの名無しさん :2008/03/01(土) 14:29:19
age
11 :
デフォルトの名無しさん :2008/03/04(火) 13:04:04
Windowsの質問です。 「Winsock Programmers FAQ 2.13 - ネットワークの異常切断はどのようにして検出できますか?」に あるような状況で、プロトコルに「コマンド/応答」の仕組みがないやり取りをする場合があるときの話です。 クライアントアプリケーションを開発してるのですが、次のような場合どうすればいいのでしょうか? 1. クライアントアプリ(これを作っている)がサーバにconnectする 2. サーバからの要求を受け取り処理結果をsendする このとき、ネットワークが異常切断していたら、disconnectして再connectすることを求められています。 異常切断しても、ローカルのソケットが生きている場合は、sendは失敗しません。 また、FAQにあるようにecho機能を追加することもできず、既存のプロトコルを変更することも 許されていません。 FAQにあるように、pingで生存確認するしかないんでしょうか?
12 :
デフォルトの名無しさん :2008/03/05(水) 00:36:53
WinSockのconnectについて質問です。
POST
https://aaa.bbb.jp/ccc/ddd/eee HTTP/1.1
したいのですが、connectすると
10060「接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。」
となってしまいます。
IEのアドレスに
https://aaa.bbb.jp/ccc/ddd/eeeを入れてやると応答があります (ボディを送っていないのでエラーメッセージしか表示されませんが)。
どうしたらconnectしてPOSTできるようになるでしょうか?
httpsだから特別なことをしなければならんのでしょうか?(その辺がわかりやすいページや本を教えてもらえると助かります。どれもhttpのGETの例ばかりで、httpsやPOSTの例がなくって。)
よろしくお願いします!
>>12 httpsなので特別なことをしなきゃならんです。どういうことをするかは
ここにはとても書き切れないぐらい複雑。
よく知らないけど、Windowsだったらwinsockじゃなくてwininetとかいう
ので簡単にできたりしないかな。
ありがとう。とりあえずwininet調べてみます!
>11 TCPならKeepAliveもあるし、 接続してから一定期間リクエストが来なければ切る手もあるし。
16 :
11 :2008/03/05(水) 10:38:10
>>15 やはり、KeepAliveしかないですか・・・。
リクエストのタイムアウトは、通信間隔が非常に長くなる(24時間を越える)場合もあるため、
なかなか厳しいです。
KeepAliveに関して詳しく調べてみます。
機能としてのサーバが、connectを発行するという時点で かなりオhルかんね。
Linux UDPでマルチキャストの勉強をしてるのですが、 recvfrom()中にifdownでネットワーク断が発生した場合、 どうやって検知すればよいでしょう? tcpdumpではifdown直後にNetwork is down.と表示されるので 何からの方法で検知できるとは思うのですが、、
sendで"0123456789"という文字列を送りrecvで受信した際に "012456789" ↑3が抜けてる というような事が起こりえますか?
>>20 規格上は "012" "3" "456789" という IP パケットに分
割されて "3" のパケットが抜けることがあるかもしれ
ないが、一つのパケットに再構成出来ないので UDP で
はパケットロストでアプリケーションには届かないし、
TCP ならパケット再送で正しいパケットが届く。
>>21 レスありがとうございます
勉強になります
もし送信側の UDP ライブラリが何らかの理由で "012" "3" "4567890" という具合いに三つのパケットに分割し て、なおかつ "3" のパケットが抜ければそういう状態 になるかも知れない。 TCP 使ってればまず問題ない。
UDPレベルで分割送出するならともかく、 それ以下のレイヤで分割されたなら、全部 届くか届かないかでないの。
>>24 > UDPレベルで分割送出するならともかく、
これが > 23 で
> それ以下のレイヤで分割されたなら、全部
> 届くか届かないかでないの。
これが > 21 のつもりだったんだけど、何か変?
UDPはそういう分割をしないんじゃなかったっけ?
>>26 あー、ユーザーランドインタフェイス内部でのつもりだった。
もちろん、それが特に書かれてるのが TCP の RFC
なのはわかってるけど
>>20 に環境が書かれてないんだもん。
SMTPが到達を保証できない理由を 分かり易く解説したサイトってない?
>>29 ・SMTPを使ったメールはインターネット上のあらゆるサーバを経由して転送される
・あらゆるサーバとは、自分のあずかり知らないサーバを経由する可能性がある
・あずかり知らないサーバを経由するということは、そのあずかり知らないサーバの管理者
がどうとでもすることができる
他にもあるが、これだけでも分かったつもりにはなれるだろ。
補足: 多分ここら辺りにポイントがあると予想する。 >なお、データの送受信の確実性の確保に関しては、 >通信レベルだけの対応では不十分であり、 >アプリケーションレベルでの対応が必要である。
確実の定義次第じゃん・・・
そういうミもフタもないハナシなのかなぁ
>>32 当たり前のことしか書いてない。まぁメールなんて使うなってこった。
ちなみにいまのインターネットだって、送信したデータが*確実に*相手に 届くことなんて保証してないぞ。TCPは可能な限りの努力をするが、 届かないときはどうしようもない。 *確実*だけのキーワードだと、ダウンタイムとか冗長性とか、 障害耐性とか、コアとなるハブの存在だとか、クラスター性だとか ・・・・。
TCPは、届かないなら届かなかった事が判るでしょ
企業や学校はメールゲートウェイとかあって メールサーバー本体と直接通信してなかったりするから TCPソケットでエラーが出なくても届いてない可能性があるかと。 直通のftpメールなら確実だと思うけど。
つうかレイヤーを切り分けて考えろよ
相手のメールサーバから「受信した」とackが来ても、 その直後にディスクがクラッシュするかもしれないからな 確実とはいえない
なにいってんだこいつ
>31が「エスパーキボンヌ」にしか見えないのは気のせい? SMTPプロトコルの欠点だけ論うなら、 bounceが存在する ->エラー通知が10年後に届いても文句言えない ->確実性✕ なんて部分があるな。
44 :
デフォルトの名無しさん :2008/03/19(水) 23:41:34
サーバ側KEEP-ALIVEの一回の接続で処理出来るリクエスト数が30で 一つのページに使われているインラインコンテンツが30以上あった場合 これらをダウンロードするためには もう一回接続する必要がありますか?
そりゃそうだろう
どんなネットワークプログラム作ったらいいかわかりません どうしたらいいですか?
>>46 特に何か作る必要がないのなら、別に何も作らなくていいのでは?
>>46 文字列を入力したらもう一方の端末でその文字列を表示するというのをソケットを使って作成しましょう
組み込みlinux機器向けにC言語ベースの簡易httpクライアントを作成しています。 ヘッダの読み取りに、1行ずつストリームから取得するという処理を 書いているのですが、1文字ずつrecvして、\r→\nのパターンが 来るまで繰り返す、という方法はありなんでしょうか? 他に何か良い方法はあるでしょうか。
ありだと思うけど、\r\nを返さないサーバもあるから気を付けてね。
一応ソースコードです。改行制限キツイですね。 // 1行読み取り,改行を含む長さを返す,バッファに入りきらない場合はnul終端文字列の長さ int readline(int sd, char *buf, int bufsize) { int rlen = 0, wlen = 0, cr = 0; char ch; for (;;) { int r = recv( sd, &ch, 1, 0 ) ; if (r < 0) { fprintf(stderr,"readline:error r < 0\n"); return r; } else if(!r) { fprintf(stderr,"readline:warning !r\n"); break ; } if (ch == '\n') { if (!cr) fprintf(stderr,"readline:warning !cr\n"); if (rlen < bufsize) buf[wlen++] = ch; rlen++; break; } else { cr = (ch == '\r') ? 1 : 0; if (rlen < bufsize) buf[wlen++] = ch; rlen++; } } if (wlen>=bufsize) wlen--; // nul終端文字列になるように調節 buf[wlen] = 0; return wlen; }
>>50 ありがとうございます。
自分でバッファリングしてくこと考えたら
頭痛くなってきたので。
\rはオプション扱いに致します。
53 :
デフォルトの名無しさん :2008/03/27(木) 12:31:48
初心者向けの本は何を買ったらいいんですか?
NAT越えって、まだ個人がおいそれと実現できる領域じゃないのかな? ゲーム作ってて、NAT越えできたらなぁとよく思うんだけど・・・
>>54 TCPで接続張ってしまえば、自由に通信できるよ。最初の
接続元はNATの内側から出ないといけないけど。
ゲームなら別にそれでもいいでしょ。
56 :
デフォルトの名無しさん :2008/03/27(木) 22:46:39
>>1 まだftpか。httpまであと何年かかるかな。
>>55 >最初の接続元はNATの内側から出ないといけないけど。
意味ねーじゃんw
>>55 ,57
質問者の54です。ちょっと意味がわからないのですが、NAT越えとは以下のことができる技術という認識であってるでしょうか?
AとBは、両方ともルータの中の人間。直接やりとりは普通は無理。
Cというサーバーに、AもBも通信を行なう
Cが、AとBをうまく結びつける
AとBが直接やりとりできるようになる(Cを経由しない!!) ←NAT越え!
これができると、マッチングサーバーCはほとんど負荷無く運営できて良いのですが。
NintendoDSのWIFI対戦も、この仕組みだと聞いております。
このCサーバーを構築する方法は、個人で気軽に手の届く技術でしょうか?
(どうやら、それをツールとして売り出している企業はあるようなのですが)
UDP Hole Punching ってのもあったような
UDP Hole Punchingは「あまりセキュリティーに力を入れていないルータ」しか乗り越えられないようなのと 具体的ソースを提示しているサイトが見当たらないことが TCPをUDPに切り替える足かせになっているような気がします。 概念はわかりやすいものなので、実験環境があればテストは簡単そうです。 この土日にでもテストしてみたいと思います。 他にも何か情報があれば嬉しいです。 NAT越えは面白い分野ですが、ム板では盛り上がっていないようなので…
初心者も簡単にNAPT設定ができれば、たいした問題にはならんのに なんで用語とか各メーカーばらばらなんだか・・
今となってはUPnPでよくね? UPnP対応ルータじゃないルータって、いまどき売ってるかね?
>>62 だね。きちんと整備されたライブラリ使えば、socketでlistenするのと、
UPnPでポート割り当てるの同感覚。特定のポート番号使えるのが、NAT内の1台だけだって制限があるけど。
54です
恥ずかしながら、初めてUPnPというものを知りました。
これは素晴らしい技術ですね。
早速サンプルソースも手に入れましたので、実験してみたいと思います。
ありがとうございました。
>>63 もしよろしければ、きちんと整備されたライブラリ〜というものの例をいただけるとありがたいです。
とりあえず
ttp://www.bosuke.mine.nu/neta/upnp.shtml ここを参考に組んでみようと思います。
余談ですが、今たまたまGoogleで色々調べていたら、ここの前スレで同じサイトを参考に組もうとしている人を発見しましたw
Flashの通信機能を遮断する方法がわからないんだよなー
>>60 RFC3489の"5. NAT Variations"あたりを見てみたら?
UDP Hole PunchingできるのはFull Coneだけでしょう.
たしかI-Dのどれかに,どの機種がFull Coneかのリストが載っていたような
>>65 TURNを作れば? :-)
NGN普及して、IPv6デフォルトになればNAPTなぞ過去の技術になる。
かなり初歩的なことをお聞きしますが、プロキシサーバーというものは送られてきたメッセージを直接ホストに送信するだけでよいのでしょうか?
駄目
>>70 proxy serverといってもいろんな種類があるが何のプロトコルのproxy?
73 :
70 :2008/03/31(月) 13:11:11
>>73 代表的なのは、
・ メソッドに書かれてる URL から正しくホストに接続する
・
http://www.example.com/path1/path2.html みたいな URL をホスト接続時は /path1/path2.html に変換する
・ プロキシ特有の環境変数を付加する (必要な場合)
・ CONNECT メソッドを正しく解釈する (CONNECT 以降はそのままデータの送受信を行う)
辺りかな。 RFC などのドキュメントを見るのが一番手っ取り早いとは思うが。
>>73 http proxyはちゃんと作るとかなり複雑だが、少くともリクエスト内容は書き換えなきゃいけないだろ。
あとは、HTTP/1.0/1.1の場合分けとかKeepAliveとかpipelineとかchunkとか100 Continueとか、
真面目にやりだすと結構大変。
とりあえずRFC2616嫁
76 :
70 :2008/03/31(月) 13:35:09
>>74-75 レスありがとうございます
RFCのドキュメントを読んでみることにします
まぁ、読んでもわかんないと思うけどね・・・
78 :
デフォルトの名無しさん :2008/03/31(月) 13:39:24
内容を理解できないということじゃなくて、proxy serverの構成要件とは何かがわかんないだろうって意味
80 :
デフォルトの名無しさん :2008/03/31(月) 13:47:37
81 :
fxで裁判中。教えて :2008/04/03(木) 08:29:02
>>68 そのNGNがv6マルチプレフィクス問題で、やっぱNAPT使うか?とも言われている件。
83 :
デフォルトの名無しさん :2008/04/09(水) 11:10:34
プロトコル定義するときに 「最初のグリーティングはクライアントから出させる事」 みたいな 一般論的なセキュリティ上の推奨をどこかで見たようながあったような気がするんだが、 これって単に攻撃のための情報を減らす目的でしたかね? 何かそういった鉄則集みたいなのを 10 年くらい前にどこかで見たような記憶があるんですが どこかご存知ないですか?
84 :
デフォルトの名無しさん :2008/04/12(土) 11:31:55
簡単なオンラインゲーム(MMO)を作ろうと思うのですが、 無料のデータベースであるMySQLかSQLServer2005Expressを使おうと思ってますが おすすめのものとその理由など教えていただきたいです。
日本語でおk
>>84 スレ違い以前に板違いだぞ、DB板かゲ製行ってくると良い
87 :
デフォルトの名無しさん :2008/04/12(土) 13:32:10
88 :
デフォルトの名無しさん :2008/04/12(土) 17:05:47
Winsockを使って相手サーバがKEEP-ALIVEに対応しているか確かめる方法はありますか?
投げてみて、その反応をさぐるしかない。
90 :
デフォルトの名無しさん :2008/04/12(土) 18:39:30
>>89 投げてみました。
ApacheではKEEPALIVEがOffにされていた場合
Connectionがcloseとなっています。
closeであるかないかで判定しようと思うのですが、
どうでしょうか?
HTTP かよ。 Connection: close ならエンティティボディ送信後に切断だよ。 RFC 嫁。persistent connection でググレ
92 :
デフォルトの名無しさん :2008/04/12(土) 21:35:08
Connection(小文字)がCONNECTION(大文字)で返ってくるサーバはありますか?
いいからRFC読めよ
97 :
デフォルトの名無しさん :2008/04/12(土) 21:59:34
だからみりゃわかるだろ低脳。
そもそも
>>1 に「関連リンク云々」書いてあること読めないか?
99 :
デフォルトの名無しさん :2008/04/12(土) 22:16:56
>>98 いや、
だからHTTPヘッダが大文字で返ってくるサーバとかあるのか、
って聞いてんだよ
100 :
デフォルトの名無しさん :2008/04/12(土) 22:21:10
あるだろうなぁ。
規定してなきゃ存在するとみなすのが当然じゃん。 その規定が書いてあるのがRFCなんだけど。
103 :
デフォルトの名無しさん :2008/04/12(土) 23:05:57
105 :
デフォルトの名無しさん :2008/04/13(日) 00:09:31
何もないと思うが。
>>105 ttp://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec4.2 4.2 メッセージヘッダ
一般ヘッダ (section 4.5)、リクエストヘッダ (section 5.3)、レスポンスヘッダ (section 6.2)、エンティティヘッダ (section 7.1)
各フィールドを含む HTTP ヘッダフィールドは、RFC 822 [9] の Section 3.1 で与えられているものと同じである共通のフォーマットに従う。
それぞれのヘッダフィールドは、名前、その後にコロン(":")、そしてフィールド値から成る。
フィールド名は、大文字・小文字を区別しない。
「大文字と小文字を区別しない」
107 :
デフォルトの名無しさん :2008/04/13(日) 00:54:11
変な流れになってるなぁ。
どうみても同一人物だろ・・・ 言い返されたからってムキになるなよ(;´Д`)
迷子のキムチさん 出て行ってください
111 :
デフォルトの名無しさん :2008/04/19(土) 21:15:07
Keep-alive使ったサンプルコードってあります? Winsockで
一週間ぶりですね
113 :
デフォルトの名無しさん :2008/04/19(土) 22:11:14
Linux用に作成したソケット通信アプリのテストにtcpdumpを使いたいのですが アプリが送受信しているデータの表示方法がなかなか分かりません。 tcpdump -s 1600 -X tcp port 1024 と打った上で、アプリに送受信させるとデータが含まれたパケットの中身が バイナリで表示されますが、アプリが送受信しているデータだけ表示させる 方法はないでしょうか? どなたか教えてください。よろしくおねがいいたします。
X環境入れてないのです(;_;)
117 :
デフォルトの名無しさん :2008/04/22(火) 14:58:59
最近ネットプログラミングはじめたのですが、 よくサーバはクライアントのパケットを信用してはいけないと書かれていて、 逆にクライアントはサーバのパケットを信用して良いのでしょうか?
クライアントが、信用できないサーバ (不特定多数のサーバ) と通信する可能性があるなら、信用してはいけない。 信用できるサーバとしか通信しないなら信用してもいいかもしれないが、 信用できないという前提で組む方が、サーバに何かバグがあったり、 通信の改ざんを受けたり、なりすましサーバに当たったりしたときに、安全でいいと思うよ。
119 :
デフォルトの名無しさん :2008/04/22(火) 17:24:53
送るときは厳格に、受ける時は寛容に、はネットワークプログラミングの基本。
受けるときも厳格に、が基本だよ
読解力が試されます
プロセス間通信用にソケットを使う場合、 どういう取り決めにしてますか? 自分はhttpと同じで、行単位で空改行までを 送受信単位にして、必要ならオプションの バイナリデータが続く、という感じにしてますが。 いきなりバイナリでやりとりするのは データ構造決めるのが面倒なんで。 何か既成のモデルがあったらいいんですが。
xml-rpcとか?
シンプルなバイナリなら TLV 任意長バイナリは GIF っぽくサブブロック化
>>123 俺の長い組み込み経験からのアドバイス。
1.レイヤを定める。下位レイヤは上位レイヤのデータ
構造を知らなくてもやり取り出来るようにする。バイ
ナリ←→プログラムデータの変換部分との間にユーティ
リティ的なレイヤがあると便利。
2.最初に「バイト長」とか入れない。これをやられる
と送信側でデータが揃わないと送出開始出来なくなる。
仕事でこういうプロトコル決めてる奴を見ると殺意が
芽生える。
3.1や2を実現するために、たとえバイナリでもエス
ケープ文字を用意する。俺が良く使うのは SLIP のエ
スケープ(昔仕事で使ったから)。下位レイヤでデー
タやコマンドの開始/終了などを用意する。読む側の
下位レイヤで「開始」が来たら読んでる途中のものを
全部破棄して例外を投げるように(初期状態 read で
catch するように)すると、通信相手のバグその他で
変な状態に陥っても元に戻ることが保証出来る。
>>127 あんまり殺気たてんでくれ。
俺の20プロダクト中16回コロされてる事になる。
俺はパート長は入れるね
任意長のフィールドは 1 バイトのブロック長と続く最大 256 バイトのデータブロック。ブロック長 0 が終端。 GIF と PNG のフォーマットは通信用データ構造のお勉強に最適。
>>127 >2.最初に「バイト長」とか入れない。
が、なぜ以下のようになるのかまったく意味不明。
>これをやられると送信側でデータが揃わないと送出開始出来なくなる。
データそろえて送信したところで、ネットワーク上で何バイトずつ
受信側に届くかなんて何の保証もないわけで。そろえて送る
理由がまったくない。
>>131 127 じゃないけど、何を言ってるか分からないのは君だけだと思うよ。
俺もわからん。RAW SOCKETの話? データ長は,送るものが先に決まるならプロトコルとしてはありかもしれないが、 エスケープ文字を入れて区切りの失敗を見つけるぐらいならソケット閉じてしまったほうが早いのでは? むしろUDPで自分で順番を制御するとか。
ヒント:組み込み屋さん
組み込みでハードウェアがらみな制限付きで、バッファの制限もついてるからかな? DLNAとかではHTTPベースでchunked encodingとかあったが、あれは、ストリーム送信用に送信開始時にデータ長が不定だったからだが。 ほかもそんなことが多いのかな?
内容検証用の MD5 ハッシュも全体を走査してみないと決定できないし。そういう情報を先頭に 持ってこられると、XSL の処理結果や BLOB を垂れ流したい場合は一度ファイルか何かに 落とさなきゃいけないからかなり不便。
時代は組み込みだからな。 データ全体を収めるバッファを用意するなんてありえない。 数KBさえ無駄にできない。 お前らはこういう基本すらわかってないんだな。
138 :
デフォルトの名無しさん :2008/04/23(水) 23:59:50
すみません教えていWINSOCKでPROXY対応なんですが リクエストヘッダーへ Proxy-Connection: keep-aliveも Connection: Keep-Aliveも指定しているのですが PROXYがサーバー間の接続を勝手に切ってしまいます クライアントー>PROXYの接続は維持しています サーバー側のエラーコードは10054を示しています サーバーからのレスポンスはしっかり帰ってくるのですが 直後に切られます。 なんで? リクエストはPOSTなんですが これって正常動作?
別に組み込みに限った話じゃないと思うが、システムの
時間ボトルネックが何処かを考えれば自明。
どうがんばっても通信速度以上のスピードでは送れない
んだから、なるべく早く送信開始して、バッファアンダー
ラン(タイムアウトによる PUSH とか)にならないよう
にバッファに詰めていければ一番効率が良い。
とはいえ最近は下手するとディスクの方が遅かったりす
るからなー。
>>136 > 内容検証用の MD5 ハッシュも全体を走査してみないと決定できない
送信時は送信しながら計算して最後に付加すればいいん
だけど、受信は受信しながらオブジェクト作っても合致
しないときに破棄する必要があるんで面倒なんだよな。
正常ではないな。 プロキシがサーバとの接続を維持する気がないなら Keep-Alive でリクエスト出したらいかん。 多分プロキシ実装が Persistent Connection に対応していないし、リクエストヘッダも何も考えず 素通りさせてるだけだと思うが。
受信時は一定容量ごとのMD5でいいんだが、それよりファイル保存時にディスクアクセスを早くしようとして、 受信サイズの最後尾までファイルを拡張してから受信を開始すると途中で中断したときにある個所から後ろがごみデータが充填するんだが、 ファイルIOで一定サイズ移行のデータを削除してファイルサイズを小さくするって言う命令が無いために、ファイルを拡張すること自体が駄目何だよねぇ。 どこかに有効なファイルサイズを別に保存すればいいんだが、管理ファイルが散乱するので避けたいのだが、いい方法は無いものか。
142 :
デフォルトの名無しさん :2008/04/24(木) 00:16:39
>>140 ありがとうございます
ただ、PROXYは定番どころのSQUIDをデフォルトで
使用しています。 レスポンスヘッダーがおかしければ
クライアントにデーターが届かないはずなんですが・・・
困ってます。
144 :
デフォルトの名無しさん :2008/04/24(木) 00:41:55
#include<stdio.h> void main(void) { int a,b,c; printf("数字を入力してください\n"); scanf("%d",&a); printf("数字をまた入力してください\n"); rewind(stdin); scanf("%d",&b); printf("数字をまたまた入力してください\n"); scanf("%d",&c); if(a == b == c) printf("等しいです,\n"); else printf("等しくないです,\n"); } これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは なんででしょうか?
>>144 スレ違いだけど
君が参考にしてるものは信用しないほうがいい
147 :
デフォルトの名無しさん :2008/04/24(木) 00:58:41
>>143 たしかにSquidが吐き出すヘッダーは 1.0になっています 調べてみます。
非同期に双方向でイベント通信するためのプロトコルって何かある? できれば 1:1 じゃなくて中継サーバかました n:n で使える奴。
152 :
デフォルトの名無しさん :2008/04/24(木) 05:17:26
SIP
153 :
142 :2008/04/24(木) 05:33:32
自己レスです 公開PROXYでテストしたところうまくいきました また、ぐぐったところ SQUIDはHTTP/1.1をHTTP1.0に 勝手に変換する事がわかりました (ヘッダーは別としてかといってPROXY側から切断するので???ですが) これ以降は板違いですので移動します m(。。)m
winsock2でパケットキャプチャモジュールを作成したのですが、 プロミスキャスモードにしないと何もパケットを受信しません。 自分宛のパケットだけキャプチャしたいのでプロミスキャスモードは使用したくないのですが プロミスキャスにしなくてもパケットを受信する事は出来るのでしょうか?
バイト長いれるなって話がまったくわからん。 カイヤでstartとか送って、endが届くまでバイナリが続くとかにすればいいの?
s/カイヤ/下位レイヤー/;
下位の部分を作るときに、アプリ(上位)側が全部を用意し終るまで出力を開始できないってことだろう。 例えばディスクへアクセスするドライバを書くときに、 ファイルのサイズが判明するまでHDDに書き込めない(領域を確保出来ない)ようだとやりにくくて仕方が無い、 というような話だと思う。たぶん。
あ、例えが悪いな。 HDDのドライバじゃなくてファイルシステムの造りの方が適切だな。
>>130 > GIF と PNG のフォーマットは通信用データ構造のお勉強に最適。
画像フォーマットはツールが知らない種類のチャンクを読み飛ばせるように
バイト長が入ってる。通信の為じゃない。
>>161 ま、確かにそうなんだけど、GIFはCompuServe由来だし、PNGはPortable Network Graphicsだから、通信用である事も意識していたと思うよ。
>>161 思いっきり局部しか見てませんて感じのレスだな。
OSPFにしろ、BGPにしろ、RSVPにしろ、そもそもIPからしてペイロード長先付けだろ。 データがそろわないと、長さが書けないから送信できず、バッファが要る、ってのは、 可変長データならチャンク化すれば済むこと。 固定長データなら、バイト列にエンコーディングするレイヤよりも上のレイヤが先にデータ長を宣言すれば済む。
長い組み込み経験からのアドバイスなんだぜ? 素直に聞けよ。
臨機応変 適材適所 一長一短
IP のパケットサイズって最大 64kB だと思うんだけど、イーサなんかの MTU の 1,500B とかっていうサイズは、IP パケットがさらにその下のレイヤーで 分割されているということですかね?
IP fragmentation でヤフれ
IPスタックが、下層から最大送出可能な パケットサイズをもらってきておいて、 IPパケットを送出する際に分割するような
>IP のパケットサイズって最大 64kB これも実装依存だそうだ
ヘッダの長さフィールドが16bitってだけでそ
selectで PULLHUP相当のエラーって感知できますか? 大人しくpull()った方がいい?
pullじゃなくてpollでggr
select失敗した場合ってFD_SETって どうやって処理すればいいの? 単純にクリアするだけでおk?
おれはそういうの気にしないために、 fdsetは呼ぶ前にコピーして、そっちをselectに掛けてる。 コピーに変更があったら手動でオリジナルを更新。 何かのサンプルの真似だけど。
sshでログインしてるとき小さいファイルを向こう側へもっていきたいんだけど わざわざFTPとか起動するの面倒なときっていい方法ありますか?
ssh ファイル転送 でggr
こっち側がwindowsの場合はどうすればよいでしょうか? たとえばpoderosaを使ってる場合。
scp
181 :
782 :2008/05/10(土) 21:29:28
linux版より誘導されてきました
よろしくオナガイシマス
linuxでの実装、通信関連の実装の経験の無い未熟ものです
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html linux TCPサーバー側
という部分のコードをコンパイルしているのですが、
accept()システムコールのこの部分で
dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
error: invalid conversion from \342\200\230int*\342\200\231 to \342\200\231 socklen_t\342\200\231
と怒られています
どうしたら怒られなくなりますか
コンパイラは gcc-4.1.2-33です
↑ 名前 782 スマン間違えてシマイマスタ
プログラムに2バイト文字使ってる?
>>183 コメント文で2バイト文字を使っていますが
ソースコードでは使っていません
>>181 dstAddrSize が socklen_t ではないっていう型エラーでは? int で宣言してない?
>>185 thx
>>tAddrSize が socklen_t ではないっていう型エラーでは? int で宣言してない?
ビンゴでした、socken_t型で宣言したら、エラーが消えました
後、
#include <string.h>
#include <unistd.h>
を追加し
int status;
も追加し
gcc tcp_serv.c -lsocket
とコンパイルすると
/usr/bin/ld: cannot find -lsocket
collect2: ld はステータス 1 で終了しました
となっ てしまいました・・・・・
-lsocket 不要
>>187 どうも、そのようですね
HPが古いのでコンパイラのバージョンが違うから、こんなにエラーが出たのだと思います
g++ tcp_serv.c -o tcp_sev
でコンパイルに成功しましたが
Waiting for connection ...
のままなのですが、これで成功なのでしょうか?
クライアントと接続したらこのメッセージは消えるものなのかな・・・・?
スマソ gcc tcp_serv.c -o tcp_sev でした
クライアント側も作成して 127.0.0.1 で接続するのだ。
>>190 >>181 です
thx
HPのコードを修正して、今しがたserverとclientの、実行ファイルを、同一PC内ですが起動して
Wiresharkでパケットが流れているのを確認シマスタ
今書いているPCの他に後2台Windows XPとFedora Core 8が繋がっているので
このサーバーで対戦型のオセロゲームでも実装してみようと思います^^
一応C++使い(MFC)なのでWindows側の実装は難しく無いんだけど
linuxのシステムコールやAPIの使い方を知らないのが痛い・・・・orz
とりあえずMFCでいう処の、GetKeystate()関数のような、linuxでのキーボード入力のAPIが知りたい
>>192 thx
>>191 です
なるほど、キー入力の前に接続方法を、再考する必要がありますね
複数のclientが、ぶらさがるサーバの場合、acceptシステムコールや、recvシステムコールをコールして実行してして
一旦、接続行われるとsocketをcloseするまでは、他からのリクエストが受けれなくなりますね・・・・orz
そこでselect()システムコールの出番ですね、ちょいと調べてみます。
ブロックするのがいやならソケットをノンブロックにしても良い。 MFCの糞ソケットクラス使ってるとこの辺の感覚が分からんかも。
WinSock2を使用して特定用途のTCP/IPサーバをCで作ろうとしていますが、ポート番号の自動割り振りでハマっています。 抜粋したコードは以下のとおりです。 WSADATA wsaData; int len; static SOCKET serverSocket; static struct sockaddr_in addr; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) return -1; serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == INVALID_SOCKET) return -1; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = INADDR_LOOPBACK; // ★ループバックアドレスを設定 addr.sin_port = htons(0); // ★ポート番号の自動割り振り bind(serverSocket, (struct sockaddr *)&addr, sizeof(addr)); len = sizeof(addr); getsockname(serverSocket, (struct sockaddr *)&addr, &len); // 自動的に割り振られたポート番号を取得 printf("%s\n", addr.sin_port); // 0が出力される listen(serverSocket, 1); getsocknameを行った後でaddr.sin_portに割り振られたポート番号が入っていることを期待するのですが、WinXP+VC7.1では0になっています。 手順がどこか悪いのでしょうか?
196 :
195 :2008/05/16(金) 01:04:52
>>195 自己レスです。
addr.sin_addr.S_un.S_addr = INADDR_LOOPBACK; // ★ループバックアドレスを設定
↓
addr.sin_addr.S_un.S_addr = htonl(INADDR_LOOPBACK);
↓もしくは
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
でした。
また、addr.sin_portは使うときにはntols(addr.sin_port)としてやる必要がありました。
197 :
デフォルトの名無しさん :2008/05/25(日) 08:38:08
こんにちは。 winsock、TCP/IP非同期の、ゲーム用のチャットを作ってます。 クライアントからサーバーにチャット文が届いたらfor文で回して 各クライアントのソケットにsendしているのですが、 (for(i=0,i<MAXCLIENT,i++) send(socket[i])みたいな感じです) この方法だとユーザーが少ないうちはいいのですが、 ユーザー全体数が150人くらいになると重くなります。 少しタイムラグがあって届くみたいな感じです。 どうすれば解決するでしょうか? よろしくお願いします。
198 :
デフォルトの名無しさん :2008/05/25(日) 09:03:57
サーバーのCPUがマルチコアなら、マルチスレッド使うと早くなるよ
IPv6のサーバーサイドのプログラムが見つかりやせん
その問題はノンブロックにして解決するの?
マルチキャスト
204 :
デフォルトの名無しさん :2008/05/25(日) 14:40:10
俺は2000クライアントにマルチキャストするプログラム書いたが そんなに気になるラグはなかったぞ。多くても150msくらいの遅延しかない。 プログラム的に問題あるんじゃない?TCPでもsendにそんなに時間かかるって事はないと思うけど・・・ 送信するデータのサイズにもよるけどね。
単純な foreach (clients) { client->send(data); } のとき 一匹でも激遅クライアントがいると そこでsendが糞詰まりを起こして全体が遅くなる
え、send()って、相手に到着しないと抜けないの?
tcp送信バッファが満杯になればblockする
なんでn回ユニキャストする発想になるのか。
そりゃmulticast/boardcastを知らないからだろjk
boardcastは俺も知らない。
TCPはmulticastできないみたいです。。。 for文じゃなくてマルチスレッドにするといいのかな? どうも同じような気がするのですが、一応やってみます。
くだんのスレがアフォなのはどうでもいいが、150ms遅延「しかない」 とかもう救いようがないな。
キューを実装して非同期sendすればプログラムが重くなるのは解消される
あれ、
>>197 には
>TCP/IP非同期
って書いてあるやん
150人に一斉同報するのってフツーに重いんじゃないの
ircdってどんな実装になってるんだろ
216 :
デフォルトの名無しさん :2008/05/27(火) 02:32:22
>>212 環境を書いてないからなんとも言えんがな。
217 :
デフォルトの名無しさん :2008/05/27(火) 02:57:49
質問者が馬鹿だったのは、二チャンネルで質問したことだろな。
197じゃないけど、似たようなプログラムでクライアントにダイヤルアップレベルの細い回線が混ざってて、 かつ数百キロバイトのデータが必要になる場合があるときは ・単一スレッドから非ブロッキングモードで送信 ・接続毎にキューを持ったスレッドを作成してブロッキングモードで送信 どちらがいいいのでしょうか? 接続クライアント数は10程度です。
10程度だったらコードの見易さからいってスレッド作るのはアリかな そうだとしてもブロッキングにはしないなあ、中断しにくいから
ネットワークとは直接関係ないのですが。。。 ネットゲームの延長の質問ということでご了承ください>< 直接アプリのアイコンをダブルクリックで起動じゃなくって、 ハンゲームとかのHPみたいにゲームスタートみたいなボタン(リンク)を クリックするとアプリが起動するのありますよね。 HPからユーザー側のアプリが起動できちゃうと悪さができちゃうからムリ みたいな事も聞いたことあるんだけど。。。 ああいうのってどうやってるのでしょうか?
>>220 ためしに登録してみたが・・・
ActiveXコントロールのインストールが必要ですって言われたぞ
署名付きActiveXだとおもうが。 #厳密には署名がなくても不可能ではないけど、 #そのセキュリティを緩めるのは致命的な筈
ActiveXコントロールってなんですか?
署名付きアプレットを認証局から証明書を発行してもらう必要があるみたいですね。 多分有料ですよね。 でも大体わかりました、ありがとうございます!
ハウス ググレカスー
227 :
デフォルトの名無しさん :2008/05/29(木) 20:55:00
ActiveXコントロールは ユーザーがインストールを許可する事でインストールされる。 インストールしなければ動かない。 実体はDLLかEXEなので起動されれば何でもできてしまう。 よくスパイウェアとして使われる。 よほどの馬鹿でなければ 信用あるサイト以外からはインストールしないので 作っても無駄
229 :
デフォルトの名無しさん :2008/05/30(金) 05:27:24
ユーザは馬鹿だぜ?
ほいほいインストールすると思う。 署名のないActiveXを使ってる企業などのサイトで「警告が表示されますがOKを押してください」なんてわざわざ解説してたりするし。 「インストール手順を増やすうざいダイアログ」ぐらいにしか思ってないんじゃない。 あれを見るにつけ、日本って終わってると思う。
231 :
デフォルトの名無しさん :2008/05/30(金) 19:26:57
作り手もかなりあほだぜ
Vistaでは署名無しAXは起動できないんじゃなかったっけ
絶対ほいほいインストールする
234 :
デフォルトの名無しさん :2008/05/31(土) 23:41:10
とあるサイトからデータを自作したプログラムでダウンロードしているのですが、 ダウンロードに成功したり失敗したり 2分の1の確率で動いているのですが、 ダウンロードに成功しないのは なにが原因でしょうか?
自作したプログラムなら、原因を調べられるだろう? どこで何のエラーが返ってきてるとか
翻訳:エスパー募集中
HRESULT h; h = URLDownloadToFile( 0, http, file, 0, 0 ); switch(h){ case S_OK: printf( " success.\n" ); break; case E_OUTOFMEMORY: printf( " E_OUTOFMEMORY\n" ); break; case INET_E_DOWNLOAD_FAILURE: printf( " INET_E_DOWNLOAD_FAILURE\n" ); break; default: printf( " error?\n" ); break; } 上のようにしてやっているのですが、 h が default の値しか返さなくて何が原因なのかがわからないのです。
値を表示してみるという思いつきができないのか なんというゆとり
defaultを使わないでもっと絞ればいいだろ
>>238 戻り値は -2146697510 です
意味わかるんですか?
>>239 リファレンスには
S_OK
E_OUTOFMEMORY
INET_E_DOWNLOAD_FAILURE
の3つしか 特に戻り値として明記されていませんでしたので これ以外の戻り値は わかりません。
仕様書か実装のバグだね MSに抗議しないと
リファレンス外の戻り値を返すとかどんだけ糞なライブラリorリファレンスだよ
-2146697510 = S_OK + E_OUTOFMEMORY + INET_E_DOWNLOAD_FAILURE
>>244 おまえすげえなwww
3つの戻り値の和を返すというのはいったいどういうことを言いたいんだろうかこの関数は
>>244 1245206じゃハゲ
テキトーなこと抜かしてるんじゃねーよボケ
死ね工作員
一体何の工作だ
FACILITYの意味からして足すのはありえんと思うんだが
-2146697510 = S_OK | E_OUTOFMEMORY | INET_E_DOWNLOAD_FAILURE
250 :
デフォルトの名無しさん :2008/06/01(日) 01:55:03
-2146697510を16進数に直すと0x800bfeda 8 は失敗をあらわす。 b は FACILITY_CERT で、電子証明書関連のエラーだとわかる。 feda は不明。 httpsで繋ごうとして何かがまずかったんだなとはわかるね。
winerror.hに詳しくなるスレはここですか
スタック破壊してんじゃネーノ
254 :
デフォルトの名無しさん :2008/06/01(日) 05:07:10
ネットワーク接続を切る、接続するAPIってあるんでしょうか? 言語は C/C++ Windowsでお願いします
あるよ。
Winsock
すいません 間違えました ネットワークでなく インターネットの接続です
259 :
デフォルトの名無しさん :2008/06/01(日) 05:50:53
どう違うんだ
稀にIPじゃない場合もあるか否か
261 :
デフォルトの名無しさん :2008/06/01(日) 05:56:17
IPじゃないってドメインのことか? ドメインならgethostbynameでIPに変換可能 あとは一緒
>>261 Internet Protocolを使ってないコンピュータネットワークもあるってこと。
connect() 関数じゃないですよ?
物理的にネットワークアダプタを抜いた状態と同じ環境にしたいってことです
266 :
デフォルトの名無しさん :2008/06/01(日) 07:41:40
>>269 アナタを・・・
telnetです・・・
>>266 ,269
AppleTalkとかIPXは?
>>265 Win32APIでネットワークアダプタを無効にするとか
やり方知らんが多分できるとオモ
WindowsでSockRAW取れないのですが どうしてですか?XP SP2です
274 :
デフォルトの名無しさん :2008/06/01(日) 16:05:42
覗くなということだ
>273 ググればすぐわかる。
276 :
デフォルトの名無しさん :2008/06/01(日) 19:20:30
MMORPGのサーバとクライアントの同期化について知りたいのですが、 何か参考になるものとかありますか?
韓国語を覚えたほうがいいかもね
市場の8割がチョン製クリゲ
280 :
デフォルトの名無しさん :2008/06/02(月) 04:57:58
日本ってなんで情報なかったりするんだろう(・ω・)
日本のゲーム業界特有の情報閉鎖性もあるけど
オンラインゲームが流行ったときに不況で
誰も手を出さなかったとういのもあるかも
そして
>>279
商売がヘタクソってのも多いと思うな>日本のメーカー あからさまな出し惜しみとかして客に逃げられるパターンが多すぎる
商売というか、小汚い金の稼ぎ方が日本人にあわないんだろうね あっちの人たちは金が儲かれば形振りかまわないから成功はする 名声はないけど
うん,高度成長期の日本そっくり
パンヤもみんゴルのパクリといわれてるし、 その他もろもろパクリは多いよな。 そりゃ作るのは楽だよ 開発で使ってるソフトも平気で割れでやってそうw
WinSockでソケットのポート番号を sockaddr_in add; int addlen =(int)sizeof(add); getpeername(Sock, (struct sockaddr *) &add, &addlen); char buf[50]; _itoa_s(add.sin_port,buf,(int)sizeof(buf),10); といった感じで取得はできましたが IPアドレスを取得するにはどうすればよいでしょうか?
getpeernameで返してもらった連中を getnameinfoにでも突っ込めば。
sockaddr_in だと長さ足りなくないか
290 :
デフォルトの名無しさん :2008/06/03(火) 22:54:40
291 :
デフォルトの名無しさん :2008/06/04(水) 01:37:08
「Winsock標準に準拠」にこだわるのでなければ(もはや意味なし) IOCPにしとけ
期待した動作をしなくてもくじけないココロがあるならなんとでもなるZE!
294 :
デフォルトの名無しさん :2008/06/04(水) 01:57:35
まったく使ったことがないのでよくわかりませんが、 select 毎回の引数の処理が無駄 WSAAsyncSelect,WSAEventSelect メッセージの通知が遅い IOCP とにかく速い、プログラムは難しくなる で良いでしょうか? ROのエミュ鯖ではselectが使われてて、引数の処理が入ってたのは見たなぁ。
selectの64制限は確か#defineで回避出来たと記憶してるが WSAEventSelectの64制限(WaitForの制限)は 複数のスレッドに64以下ずつわけるしかないんじゃなかったかな。
296 :
デフォルトの名無しさん :2008/06/04(水) 02:29:14
複数のスレッドになると難しそうですね。 マルチスレッドもネットプログラミングの経験もない自分的には ひとまずselectが良さそうな気がしてきました。 オープンソースのmmoが2つともselect使用しているみたいなので、実装例見れますし。
pthread_mutexって10万個作って使っても 問題ない?
298 :
デフォルトの名無しさん :2008/06/04(水) 20:59:21
>>297 氏とは違うのですが、ミューテクスとセマフォを分かりやすく説明できる方いないでしょうか?
ググッてみたけど、どこも似たような分かりにくい説明が多いです。。
ミューテクスは複数のスレッドがあった場合、順番に処理するのに対して、 セマフォを複数のスレッドが同時にアクセス可と言う考え方でいいのでしょうか?
セマフォは5個の資源を10人で使うというような考え方。 listenの引数みたいなというか
>>300 係数1のセマフォならいっしょじゃねーか
嘘教えるな
>>298 ミューテックスは、同時にひとつのスレッドしかアクセスできない。
1人用のイスみたいなもの。 早いもの勝ちで1人だけが獲得できる。
残念ながら座れなかった人は、イスが空くまで待つ。
イスが空いたら、待ってましたとばかりに奪い合って、勝った人1人だけがイスに座れる。
負けた人は、またイスが空くまで待つ。
セマフォは、同時にアクセスできるスレッドの数を好きに指定できる。
3人まで座れるソファーとか、そういうの。
4人目が来たら、誰かがどくまで待つ。
1にすれば、ミューテックスとほぼ同じ。
>>301 だからそのものズバリだろw
教科書でミューテックス=二進セマフォという表記も使われる。
WinやRecursiveにしたときのpthreadは、Mutexは同じスレッドならば何度でも取得できるところが一番違う。 スレッドごとの排他制御にMutex、複数の資源管理にセマフォ、単一の資源管理ならどっちでもいい。
305 :
298 :2008/06/04(水) 22:53:48
>>299-303 >>302 さんの説明分かりやすかったです。ありがとうございました。
ググッても、どこも排他的とかいまいち理解しづらいですよね。。
なんというスレ違い
308 :
デフォルトの名無しさん :2008/06/08(日) 12:56:46
boostのがおすすめ
オマイラだと?何だその態度は
>>307 一度くらいは自分で実装するべきだ。その上で便利なライブラリを探すんだ。
車輪の再発明はしたくないって便利な言い訳だね。
別に使えるものは使えばいいんじゃねえの いちいちカーネルやコンパイラから自分で書き起こしたりはしないだろ
>>307 どえす
VS2005とgcc-4.1.2-33に、boost-1_35をスコーンとインスコして
asioをやりまくっているんだが
VS2005は、無問題、gccでコンパイルする場合
いちいちコンパイル毎、変数を設定するのがマンドクサイので
.bash_profileに
CPLUS_INCLUDE_PATH=/usr/local/include/boost-1_35; export CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=/usr/local/lib; export LD_LIBRARY_PATH
追加設定して
$ g++ -pthread -lboost_system-gcc41-mt sample.cpp
こんな感じでコンパイルしてて、今んとこ無問題なんだが、どうよモマイラ、
他にいい方法があったら聞いてやるが
Makefile
316 :
デフォルトの名無しさん :2008/06/09(月) 00:07:43
>>315 boost::asioも非同期ライブラリ持ってるんじゃないの?
ACEだな、やっぱでかいし
319 :
デフォルトの名無しさん :2008/06/10(火) 21:12:45
ネットワークプログラミングの利点って何?
ネットワーク通信ができること。
宿題スレに質問投げておくと勝手にだれかが作ってくれる これがネットワークプログラ
>>312 どえす、おいモマイラ一週間ぶりに俺様が来ましたよっと
>>310 の言う通り、漏れはソケット初心者なので、動作を理解するうえで、薄いラッパークラス作っている
近い将来、サーバー側、クライアント側で行う動作を基底クラスで実装して、それぞれのクラスを派生させようと思うが、サーバー側とクライアント側で
何が共通手順なのか、今はまだよく分からないので、とりあえず前に進めるためおこなっていおる
どうよこんな感じで
class Socket {
int fd1, fd2;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
int len;
public:
Socket() : fd1(0), fd2(0), len(0) {} // コンストラクタ
~Socket(){} // デスクトラクタ
void MakeSocket(); // ソケット生成
void InitSocket( sockaddr_in saddr) ; // ソケット初期化
void NameOfTheSocket( sockaddr_in saddr );// ソケットに名前を代入
void BindSocket( sockaddr_in saddr ); // ネームバインド
void ListenSock( int fd1 ); // リッスン
void AcceptSocket(); // アスペクト
void CloseSocket(); // ソケットクローズ
};
続き void Socket::MakeSocket() { if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } } void Socket::InitSocket( sockaddr_in saddr ) { memset((char *)&saddr, 0, sizeof(saddr)); } void Socket::NameOfTheSocket( sockaddr_in saddr ) { saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = INADDR_ANY; saddr.sin_port = htons(PORT); } void Socket::BindSocket( sockaddr_in saddr ) { if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){ perror("bind"); exit(1); } } void Socket::ListenSock( int fd1 ) { if ( listen(fd1, 1) < 0) { perror("listen"); exit(1); } }
オブジェクト試行ですか?
sockの関数と1対1に対応するメソッドを作ってるうち恩恵を受けにくい。一連の決まった操作をひとつのメソッドにまとめてしまおう。 sockaddrはラップして、アドレスのクラスを作ってしまう。簡単にアドレスを設定できるようにするといい。 あと、言葉遣い直せ
JavaとかRubyとかPythonとかの ソケットクラスの構成をみれば〜?
>>326 君はまずその変な日本語を直さないとな
他人の言葉遣いを指摘してる場合じゃないぞ
さて、些細な顰蹙をかっているようだが、2ちゃんねるクオリティーということで、まぁ許してちょんまげ こんな感じで、完成形に徐々に近づきつつあると思うが、どうよ class Socket { struct sockaddr_in saddr; struct sockaddr_in caddr; public: Socket(){} // コンストラクタ ~Socket(){} // デスクトラクタ void SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr ); // sockaddrラッパークラス int DescriptSocket(); // ソケットを作り、成功したらソケットディスクリプタを返す };
void Socket::SetAddresSocket( sockaddr_in saddr, unsigned short sock_family, unsigned short sock_port, int sock_addr ) { saddr.sin_family = sock_family; saddr.sin_addr.s_addr = sock_port; saddr.sin_port = htons( sock_addr ); } int Socket::DescriptSocket() { int fd1, fd2; size_t len; if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } memset((char *)&saddr, 0, sizeof(saddr)); // 初期化 // バインド if (bind(fd1, (struct sockaddr *)&saddr, sizeof(saddr)) < 0){ perror("bind"); exit(1); } if ( listen(fd1, 1) < 0) { perror("listen"); exit(1); } len = sizeof(caddr); if ((fd2 = accept(fd1, (struct sockaddr *)&caddr, &len)) < 0) { perror("accept"); exit(1); } close(fd1); return fd2; }
しかしなんだね、g++ってVC8とは若干違うよね
accept()関数の第三引数の
accept(fd1, (struct sockaddr *)&caddr, &len))
lenだが、VC8ならintでも無問題なのだけど、g++はsize_tじゃないと嫌だと
怒ったりとかと少し戸惑う、
>>330 でした
POSIXではsocklen_tだけど、intで実害はない。 size_tとしてしまうのは誤り。 socklen_tとint(やsize_t)が同じサイズか判定をどこかに入れておくと安全。 // 偽なら負の添え字になりコンパイルエラー #define STATIC_ASSERT(cond) extern int static_assert_array[ (cond) ? 1 : -1 ]; STATIC_ASSERT(sizeof(int) == sizeof(socklen_t))
>>332 Thx
物知りですね、勉強になります
gccの場合、accept()関数の第三引数は、int型でコンパイルに成功してたんだけど、g++でコンパイルした際にエラーが出たんで
なんでかなと思ってた、コンパイラに依存しないようにアサーションマクロを書いておくと、メモメモ
Winsockで非ブロッキングモードにしたいときは selectでウインドウハンドルとそのウインドウのプロシージャを設定するけど 最初はウインドウAでメッセージ受けてたけど 次はウインドウBでメッセージ受けるように変更 とかいうことはできますか? 本当はウインドウハンドル指定しなくてよければ通信メッセージ受けるところだけ独立させたいんだけど
>>334 WSAEventSelectを使えばウインドウハンドルはいらない。
>>335 お〜 ウインドウハンドルいらない版もありましたか
ありがとうございまつ
winsockについてです gethostbynameではwinsockが確保したメモリが返されてきますが これはどうすると解放できるのでしょうか?
>>337 gethostbynameでググルと一番上に解説が出てくるし
>>329 なんだけどさ
>>327 が書いてたんで、rubyのソケットのライブラリを見てたら、やっぱ個別に
sockの関数と1対1に対応するメソッドを持ってるよね
>>326 は
1対1に対応するメソッドを作ると、恩恵は受けにくいと言うし
ネットワークプログラミングとは直接関係ないけど、どっちがいいんだろうな?
この問題にはいつも悩まされる
永遠の命題なのか・・・・orz
>>339 たとえば、自分向けのライブラリを作るなら、いきなりconnectで繋がって、closeで閉じるライブラリを作り置きしておくと、今後ずっと楽になる。
>>340 わかりやすい説明、ありがとう
たしかに、それは言えるのだけど、ついつい、かまえてって言うか、型にはめようとして
再利用性だとか、拡張性だとか、考えてしまいクラスの設計には、いつも苦労するんだよね、俺の場合
もう少し気楽に考えた方がいいかもね
>>341 共通の機能は基本クラスに、専用の機能は派生クラスに分散。一つのクラスで機能を欲張らないのが設計のコツ。
>>341 C/C++で書いてるんなら、いつでも下に降りられるから、ある意味
どうでもいい気がする。
rubyみたいな奴だと、標準で抽象度の高いAPIしか用意されてないと
そこより下に降りたければCでextension書くしかないって話になる。
だからそういう設計になってるんだと思うよ。
TCP/IPで、自ソケットが生きてる場合、一時的に通信経路に問題があってもsendは成功すると 思いますが、その後すぐにその問題が解決したら、相手側には届くのでしょうか?
僕の想いも届いて!
winsockを使っていますが ”こんにちわ” ”こんばんわ” を相手が送信したときに 2つのメッセージに対して FD_READが2回発生するときと 1回しか発生しないときがあります 2回発生するときは ”こんにちわ” と ”こんばんわ” を別々に取得できて問題ないのですが 1回しか発生しないときは ”こんにちわこんばんわ”という1つの文字になってしまいます 送信相手が1回送信するごとにFD_READが1回発生するように設定することはできますか? できないとして1送信ごとに何らかの記号をつけて識別したりするのでしょうか?
基本的にできない。「こんにちわ」と「こんばんわ」を別のものとして扱うなら、それぞれの頭に俺プロトコルのヘッダ(メッセージ長など)を付けて送り、受信側でそれを解釈する。 あと、どーでもいいけど「こんにちは」と「こんばんは」だと思う。
そういうときこそ、 SCTP。 おまいら使ってる?
>>348 そもそも
「こ」「ん」「に」「ち」「わ」と5回に分かれてFD_READが来ることだってありえるぞ。
TCPとはそういうもんだ。区別したけりゃストリームに自前で区切情報載せろ
>>349 351
ありなとうございまつ
Sendの末尾に区切り文字入れれば
1回で複数受信してもOKじゃね?
とか思ったけど1送信あたりでも分離することあるのですかorz
しかしそうなると
「こんに」「こんばんわ」「ちわ」という受信すらありえるような
それともTCPは受信順番も考慮するからそれはないと思っていいんでしょうか?
つ[延滞] 必ずしも送った順に相手に届くとは限らない この辺はUDPとTCPの違いを調べれば分かる
マルチスレッドなプログラムでsocketを使った場合に、 thread1(){ send("ABCDE"); } thread2(){ send("abcde"); } の2つのスレッドが同時にsendをコールした場合、 相手側でrecvした時に、 "ABCDE"と、"abcde"が混ざることってありますか? 例えば、"AaBbCcDdEe"みたいに。 シングルスレッドな場合だと、 send単位で送ったデータはそのまま出て来ますよね。
せめて"ABabcdeCDE"くらいの例えならな
357 :
デフォルトの名無しさん :2008/06/16(月) 11:52:11
1. netstat -a で見れる情報(プロトコルやアドレス/ポート ステータス)は どこから持って来てるんでしょうか? (同じ情報を自分のプログラムから取得するにはどうすればいいでしょうか?) 2. TDImonか同等のプログラムのソースコードはどこかにないでしょうか?
netstatのソース見ればいいんでねぇの?
>>356 >"ABabcdeCDE"
これもありうる?
カーネルの中のソケット毎の送信バッファってのは、1つだよね。
複数のスレッドがsendをコールすると、その送信バッファに、
送信データが詰め込まれて行くんだと思うんだけど、
それがsend単位に区切られて詰められない可能性もあるってこと?
こういう動きって、OS依存?
send実行中に、スレッドがコンテキストスイッチしたらこうなるってこと?
2このスレッドが、同時に100Mバイトとかのデータをsendしたら、
そうなりそうな気がしないわけじゃないけど。
そもそも同期化もせずに 1 つのソケットに複数スレッドで書き込むな。
232Cでやっちまったことはあるな
>>360 確かにおっしゃる通りですね。
ってことは、やっぱりそうなる事もありうるってことですか。
>>362 実装依存だろうし、起きるかどうか考えるだけ無駄
364 :
デフォルトの名無しさん :2008/06/16(月) 21:45:50
ロックしろよ
Unixで同期モードならおきない気がする
>>365 どういった理由からですか?保障されているんですか?
TCPだったら、sendした順に届くとは限らない。 スレッド関係なしに。 だから、逐次処理で send( "ABCDE" ); send( "abcde" ); とかやっても、相手側で abcdeABCDEと受信することも普通にある。
おいおい。TCPでそれはないって。
>367 え??
次にお前は「ワーイ沢山釣れたー」と言う…
あれ?システムコール実行中にコンテキストスイッチて起るんだっけか?
起こらないとするなら、誰かがsendを喚ぶと、戻ってくるまで システムフリーズするだけだな。
TCPは送信順番も送信内容も保障されるか破棄されるんじゃないの? 順番がかわるとか複製される可能性があるのはUDPじゃないの? おれなんか間違ってること言ってる? 手元の参考書にそう書いてあるんだけど?
>>375 スレ監視し続けてたんだね
お疲れ様
釣れて良かったね
おめでとう
>>372 普通に起こるだろ。
シグナルだって入るし、場合によっちゃスレッドだってスイッチする。
>>372 I/Oだったら普通にキューにぶっこんでコンテキストスイッチしないかな?
Winsockでconnect、send、recvそれぞれに個別のタイムアウト値を持たせたいのですが、 connectのみ WSAWaitForMultipleEventsでタイムアウトを判断して send、recvはsetsockoptを使って指定、 これで大丈夫でしょうか?
今の今までスレタイがtypoだと思ってた俺愕然。
65535まで続くよ!
382 :
355 :2008/06/17(火) 10:05:16
>>367 シングルスレッドの場合でしょ、それは絶対にあり得ないと思うんだけど。
最近のカーネルは、カーネルプリエンプションだから、カーネル内部の処理
実行中にコンテキストスイッチすることもあるかも知れないけど、
ロジックの実行順序(逐次処理)が入れ替わることはないと思います。
>>373 それとはまた別の話ではないでしょうか。
sendを呼んだひとはブロックされるでしょうが、他のプロセスは
普通にシステムコールを実行することも、ユーザーランドのロジックも
実行できると思います。
>>374 私もそういう認識です。
TCPで1つのスレッドが送信した場合であれば、sendした順に相手側では
recv出来ると思ってます。(何回recvすれば良いかは判らんけど。)
途中でパケロスしたり、物理的に線が切れたりした場合は、受信側に届いた
部分まで(これも、相手がsendした順)が受信出来る。
なにか間違ってます? >> all
getaddrinfoはブロッキングを起こしますか?
AI_NUMERIC を付けない場合は起こします
LAN接続PC間で、低速、高ping回線の環境を再現するにはどのような方法があるでしょうか? 自作の俺プロトコルアプリが低速回線環境でどういった影響を受けるのか調べたいのですが。 環境はWindowsです(98orXP)
そういうソフト使えばいいだろ。
>>367 TCPでそれがあったら大変だろ
UDPでは十分ありうるだろうが
UDPは順序がかわるどころか
複製されたりもするらしいからな
しかしUDPって順序も保障されてないとなると
1パケットあたりの情報をどうやって認識するんだろうか
区切り文字やらパケットサイズ送っても
順序がかわったりしたらアウトだよな?
このスレに出入りする奴の発言とは思えんな。
UDPは来るか来ないかだけで、「パケット」という構造自体は保証されるだろ。 2つ以上のパケットをもってきて、その関連をどうこういうと面倒だけど。
UDPで順序が変わるってのはわかります。 例えば、 (1)udp_send("ABCD"); (2)udp_send("abcd"); とした場合、(1)で作成されたUDPパケットが相手HOSTに到達 するルートと、(2)で作成されたUDPパケットが相手HOSTに到達 するルートが同じだとは限らないですよね。 たまたま、(2)のUDPパケットが相手HOSTに到達するルートの方が 速い回線だったりした場合、受信側のHOSTでは、(2)(1)の順に UDPパケットを受信する事もあり得ます。 UDPパケット毎の順序は不定ですが、複数のUDPパケットが混ざる 事はありません。(シングルスレッドの場合) で、複製されるってのはどういう意味?
udp_send("ABCD"); とかが2回以上あったかのように 複数回届くことかと思われ で、実際そういうことがある パケットにインデックスとかつけて 2回目以降のやつは棄てればいいので問題ない
>>394 それって UDP側じゃなくて MAC側の仕様じゃないの?
結果は同じだけど・・・
細かすぎるか?w
UDPパケットがネットワーク上で消失するってのは判るんですが、 重複するってのはなぜ? 誰がパケットを複製するの? マルチキャストであればルータがパケットを複製するってのは 判るんですが。
論理的にはあり得ないけど、ハードやOS側が腐っている場合は、 勝手に複製されてしまうこともあるって事ですか。 man ping より 重複パケットと障害パケット ping ユーティリティは重複パケットと障害パケットを報告します。重複パケット はユニキャストアドレスに対しては起こるはずのないものですが、リンク層での 不適切な再送信によって引き起こされるようです。重複は様々な状況で起こる可 能性があります。低いレベルの重複の存在は必ずしも警告にならないかもしれま せんが、よい兆候ではありません。ブロードキャストもしくはマルチキャストア ドレスに ping する時には、重複が起こることが期待されます。実際に重複する のではなく、異ったホストから同じ要求に対して応答が行われからです。 障害を受けたパケットは明らかに重大な警告です。多くの場合、ping パケットの 経路のどこか (ネットワーク内かホスト内) のハードウェアの故障が考えられま す。
よって、パケットの複製は、UDPだから発生するとかって話では ないってことですね。 ただ、TCPだと、勝手に捨ててくれるけど、UDPだとそのまま 複数回受信しますということね。 と、なっとくしました。 考え方が間違ってたら、指摘してもらえると嬉しいです。
貧乏人は贅沢だ 不満を言う余裕はあるくせに 戦争する暇もある
世の中の戦争の大部分は漫湖の取り合いが原因
401 :
デフォルトの名無しさん :2008/06/21(土) 18:36:22
JSFで作ったページがローカルと見ると見えるのに外から見ると見えないのはなんで?
TAPIの日本語版資料が見つからない・・・
そんなもん探してる間に訳した方が早い
ブラウザから送られたリクエストをそのまま使用ってどういうことですか?
ggrks
406 :
デフォルトの名無しさん :2008/06/23(月) 22:27:50
UPnPで多重ルーター通れるようにできる?
407 :
デフォルトの名無しさん :2008/06/23(月) 22:43:10
>>406 間のルータがマルチキャストルータで、かつルータの先のルータが
別ネットワークからのマルチキャストに応答し、かつ、別ネットワークから
のUPnPのTCP接続に正しく応答するなら可能なんじゃね?
>>408 同じLAN内で動かなかったのなら何が問題があると思われ
>>407 単に「うまく動かない」では状況がわからない
何かエラーメッセージが出るとか、こういう動作を期待したのに実際はこうだったとか、もっと詳しく
>>407 うちの環境だと動いたよ。
firewallがブロックしてんじゃねーの?
413 :
デフォルトの名無しさん :2008/06/29(日) 00:12:03
Windows(Vista限定?)のファイアーウォールって アプリケーションがネットワークにアクセスしようとしたときに とりあえずブロックしてから確認ダイアログ出すけど、 アプリケーション開始したときに確認ダイアログ出せない? ひたすらリトライするしかない? Visual Studio 2008 言語はC#かC++でplz
お前は馬鹿か
ファイヤーウォールソフトはイッパイアッテナ
馬鹿はお前か
アプリを開始したときにダミーでも通信すれば確認ダイアログくらい出るだろ 馬鹿か
418 :
デフォルトの名無しさん :2008/06/29(日) 11:16:14
while(1){ num = recv(dst, buf, buf_size, 0); if(numrcv == 0 || numrcv == -1){ status = close(dst); break; } printf("received: %s\n", buf); } ネット上から拾ったプログラムです。 簡易tcpサーバーとしてAccept後、文字列受信をしているんだが、なぜ 受信→if判定でbreak→出力 という形なのか教えてください。 自分の中では 受信→出力→if判定でbreak が普通だと思うのだが。
recvの戻り値を確認するのはrecv後すぐでしょう。 Windowsなら、socket使わなければWSAGetLastErrorでとれる値は変わらないだろうけど、 UNIXだったらerrnoが変わっちゃうかも知れない。 (errno == EINTRだったらやり直すとか) それに、毎回受信したデータを処理してしまうにしても、0はともかく-1は困らない? numrcv = recv(s, buf, len, 0); memcpy(dst, buf, numrcv); みたいなのとか。 出力するにしても、どれだけ出力すればいいのか分かるの? bufが全部'\0'で初期化されてるなら、文字列として出力する分には平気だと思うけど。
>>418 >受信→出力→if判定でbreak
その場合、受信に失敗してたら、なにが出力されるんだ?
421 :
418 :2008/06/29(日) 12:03:36
>>419 言われてみればエラーチェックと考えられますね。
ありがとうございました。
422 :
418 :2008/06/29(日) 12:08:06
>>420 エラー処理ということをわすれてました。
bufferに何もない状態でif判定すると
そこで判定で真となりbreakで抜けてしまうのでは、
と勘違いしてました。
UDPによる、リアルタイム動画通信の実験がしたくて、CCDカメラを 購入したいと思います、お勧めの商品があったら教えて欲しいのですが。
激しく板違い
425 :
デフォルトの名無しさん :2008/06/29(日) 15:50:40
ソケットの生成、bind listenをmain関数の外で(別関数を作って) 行った場合、別関数内で生成したソケット等はリターンしてきた時に スコープ外れることにより消えてしまうんでしょうか?
そーゆークラスにしたなら、そうなる。 生のSOCKET/int型にはそういう機能はない。
消えない。
なぁ、それソケットと何の関係があるんだよ
Javaなら・・・
430 :
デフォルトの名無しさん :2008/06/30(月) 12:16:49
431 :
デフォルトの名無しさん :2008/06/30(月) 19:57:17
>>425 たしか、明示的にクローズしないと自動的にはガーベージコレクトしてくれなかったはず。
>UNIXだったらerrnoが変わっちゃうかも知れない。 おまえは馬鹿か
433 :
デフォルトの名無しさん :2008/07/01(火) 21:47:58
大きい順に数字を表示するプログラムがうまくできません どこが違うのか指摘してもらえませんか? #include <stdio.h> void swap(int *nx,int *ny,int *nz) { int temp = *nx; *nx = *ny; *ny = *nz; *nz = temp; } void sort3(int *n1,int *n2,int *n3) { if (*n1 > *n2 && *n2> *n3) swap(n1, n2, n3); else if (*n2 > *n1 && *n1> *n3) swap(n2, n1, n3); else if (*n1 > *n3 && *n3> *n2) swap(n1, n3, n2); else if (*n2 > *n3 && *n3> *n1) swap(n2, n3, n1); else if (*n3 > *n2 && *n2> *n1) swap(n3, n2, n1); else if(*n3 > *n1 && *n1> *n2) swap(n3, n1, n2); } int main(void) { int na, nb, nc; puts("3つの整数を入力してください。"); printf("整数A"); scanf("%d", &na); printf("整数B"); scanf("%d", &nb); printf("整数C"); scanf("%d", &nc); sort3(&na, &nb, &nc); puts("これらの降順に並べました。"); printf("整数Cは%dです。\n ", nc); printf("整数Bは%dです。\n ", nb); printf("整数Aは%dです。\n ", na); return(0); }
434 :
デフォルトの名無しさん :2008/07/01(火) 21:51:50
お断りだ
436 :
433 :2008/07/01(火) 21:56:51
ありがとうございます! その3回の比較とはどんな計算をすればいいんでしょうか?
例えば数値が2,3,5なら、各数値を3台のサーバにsendする。 この時、2なら2時間後に返事を返してもらうように作っておく。
ネットを通して3台の端末から1つの数値を入れてもらう。 すると、数値が一つ帰ってくる。この数値から自分が何番目か予測する。 ネットゲームの作り方でつか?
a>b?a>c?b>c?swap(a,b,c):swap(a,c,b):swap(c,a,b):b>c?a>c?swap(b,a,c):swap(b,c,a):swap(c,b,a)
442 :
デフォルトの名無しさん :2008/07/02(水) 08:29:27
>>423 ロジテックが手に入り安いし関連製品が同じドライバーだから便利
>>398 UDPについて
最近上司からもUDPの早いからUDPにしろという
変なUDP=早いという間違った神話があるんだが・・・・
TV電話とかボイチャみたいな再送信されて遅延が発生するぐらいなら
捨ててくれよっていうアプリなら有効なんだが
ここでよく質問にくるゲーム系だとUDPは考えものだぞ
少なくとも再送信の実装するよりも、届かなくても動くように
実装した方がよいよ。
ただ、UDPだと1バイトのデーターでも即座に送られるのが魅力か
TCPでもNaggle切れば。
>>433 これでいいじゃん(・ε・)
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <functional>
int main() {
int a, b, c;
a = 10;
b = 7;
c = 12;
std::vector<int> array;
array.push_back(a);
array.push_back(b);
array.push_back(c);
std::sort(array.begin(), array.end(), std::greater<int>());
printf("大きい順に");
for(std::vector<int>::iterator it = array.begin(); it < array.end(); it++) {
printf("%d,", *it);
}
printf("です。\n");
return 0;
}
445 :
デフォルトの名無しさん :2008/07/02(水) 19:18:41
>>443 そだね、一時期そうしてた
ただ、この手のデーターは大量に送ることが多いから
ルーター吹っ飛ばしてからはプロトコル見直すようにした
最近、NAT越えは厳しくなっていて
UDP HOLE PUNCHINGとかもやったけど、セキュリティソフト
で邪魔される事多いし、サーバーソケット作るだけで警告出るし
特に安易にルーターに無線ルーター付けられるとUPnPも使えん
やはり素直にリレーサーバー方式が一番
ネットワークのセキュリティについて質問があります。 アプリケーション層レベルでメールをバケツリレーさせているのですが、 セキュリティのために暗号化しようかと思っています。 公開鍵暗号を利用しようかと考えているのですが、 メジャーなオープンソースソフトウェアは何がありますか? アーキテクチャ、OSに依存性がないほうが望ましいです。 アドバイス頂けると助かります。
A:誰も見ねーから適当にやっとけ
GnuPG
OpenSSLとか?
450 :
デフォルトの名無しさん :2008/07/03(木) 09:32:10
>>446 AES
とりあえずAESといっとけば皆が納得する
どんなに強固でも素人にわかる肩書きが無いと屑
>>446 見たい価値のあるデータには、強固な暗号が要る。
価値の無いものは、乱数でXORしただけでも誰も見ないし、目の端に止まっても
何かの暗号だろうと思い、誰も解析しない。
>>447 が、大正解。
まぁ世の中にはスカートをめくってでもパンツを見たい奴もいるからなぁ
>>452 アフォか、最初から丸見えだったら見る価値ねーだろ。
>>452 スカートの中身と比較されてもね〜(もれスカートならめくりたいし
簡単な暗号がいかに解析しずらいか身をもって体験する?
乱数でさくっと簡単暗号を作るから、解析して見るかい?
最近の解析ソフトはまず使えないぞ。(昔のはしらん)
イラネ。
>>454 でもギャルゲやエロゲの絵を抜く為にスクランブル済みデータの解析とかする人と同じじゃないのかな?
JpcapのPacketクラスで取得できるlen(パケットの長さ)から データのバイト数を計算したいのですが、どのようにすればよいのかわかりません。 わかる方いましたら、教えてください。よろしくお願いします。 前パートで既出でしたらすみません。
>>456 大抵はヘッダいじったBMPでしかないのが現実
>>456 ここにも、通信における暗号の意味がわかったいない人がいるとは…
何のためにこのスレにいるのか?
日本語でおk
461 :
デフォルトの名無しさん :2008/07/05(土) 14:13:35
462 :
デフォルトの名無しさん :2008/07/06(日) 19:43:15
UPnPの質問なのですが ルーターにポートマッピングして、ローカルのIPアドレスで鯖を立てました 外部から接続はできるのですが、LAN内部の別のクライアントからだと接続できません これは仕様でしょうか・・・
ルータの実装次第としか ウチのルータはグローバルIP:ポートを内部から叩きにいっても、 ちゃんとリダイレクトしてくれるよ
464 :
462 :2008/07/06(日) 20:56:10
>>463 ありがとうございます。
ルータの設定でなんとかできないかもう少し考えてみます
つーかルータのマニュアルくらい読めよ その手の注意事項くらい書いてないか?
466 :
462 :2008/07/06(日) 23:43:27
>>465 ルータのパスは父親が掌握しております・・・
これ以上は将来独立してからじゃないと無理そうなんで諦めます
いや,パスワードの問題じゃなくてマニュアルは読んだのか?と訊いてる 内側からあたかも外側からアクセスした様にしてくれるかどうかを調べろ マニュアルも大抵メーカのウェブサイトに置いてある
468 :
462 :2008/07/07(月) 01:11:18
hostsでも書けばいいのに
hostsじゃ無理じゃね?
やりたい事はできるだろ? まあIP書いてもいけるけどさ
>>468 UPnP関係ないからな。
>>462 冒頭でも書いてるし、勘違いしているかもしれないので一応。
家庭用ルータだとループバック機能ついてないのが普通。 hosts書くしかないね。
474 :
デフォルトの名無しさん :2008/07/07(月) 10:32:23
プログラムで、自分のPCのプライベートIPアドレス(192.168.0.xx)を知りたいです winsockでプライベートアドレスを取得できる関数ありませんか? よろしくお願いします
475 :
474 :2008/07/07(月) 10:51:26
すみません。自己解決しました。参照する引数間違ってました。。
日本語でおk
477 :
462 :2008/07/07(月) 17:50:31
>>472-473 そのループバック機能ってのがないのが問題なんですね、
>>469 −471,473
hostsで解決できるかやってみます
どうもありがとうございました
478 :
デフォルトの名無しさん :2008/07/07(月) 20:14:29
ADSLなんだけど、プログラムからグローバルIP取得するにはどうすればいいですか? ローカルIPは取得できました。WAN側から見るグローバルIP取得したいです。よろしくおねがいします。 VC + winsock2 使ってます。
>>478 それは無理だと思うんだが
RFC の何番だっけ、NAT って >識者
ルータがUPnP対応なら、喋ってみれば。
DiCEなどが何をしているか、見てみるといい
>>478 残念ながら汎用的は方法は無い。
NATしてるルータにwebアクセスして情報取得するとか、
NATしてるルータにSNMPできいてみるとか。
80番で外に出れるなら、外部でサービスしている適当なcgiでREMOTE_ADDRを見るとか。
集合住宅やホテルで自室からは部屋番号しかわからないのに似てる そこの住所は管理人やフロントに問い合わせるか 外からきた郵便物に書いてある住所を見るしかない 問い合わせ方法は住んでいる場所によって違うし
部屋番号がドアにしか書いてなければ 一旦外に出ない限り分からないわけだ 確かに似てる
485 :
478 :2008/07/08(火) 10:56:35
レスありがとうございます。 考えたのですが、たとえば、サーバーのグローバルIPが[ 220.222.15.xx ]でポート1200にアクセスがあると [192.168.0.13]に転送するとルータに設定。 クライアントのグローバルIPが[ 220.222.15.xx ](サーバと同じIP)でポート1201だと [192.168.0.14]に転送するとルータに設定。 この場合、転送はうまくいくでしょうか?グローバルIPが同じでもポートが違う場合、他のPC にデータを転送するのでうまく通信できると考えたのですが。。 アドバイスお願いします
ルータ使ってるならルータの仕様による。 まあできないルータなんてほとんど無いだろうが。
同一のグローバルIPでも通信可能なのか?
同一鯖でweb鯖やらメール鯖立てられるのはポートが違うから。
489 :
デフォルトの名無しさん :2008/07/08(火) 17:07:28
ネトゲ作ってて、ローカルのLAN同士では繋がったのだけど、 ルータに割り当てられているグローバルIPを使って、 クライアントPCでbindすると失敗する。 ということは、bindはルータから割り当てられたローカルIPでやると思うのだけど、 ポート番号が80とかじゃ、他のクライアントと重複するんだけど、重複しても大丈夫? それと、ルータを使わないYahooBBとかのモデム直のパソコンだと、グローバルIPでbindできるの?
何言ってんの? 重複とは何が重複? モデム直はグローバルアドレスが直接PCに設定されるでしょ。
491 :
デフォルトの名無しさん :2008/07/08(火) 17:19:14
>>490 だからルータの中にある2台のパソコンが、
同一のポート番号でbindしたら、LAN内では、ローカルIPが異なるから大丈夫だけど、
ルータの外から、グローバルIPで来た同じポート番号宛ての情報(connect)は、どうなるのかなって。
2台が同時にacceptしてしまいそうじゃん
>>491 ルーターから同一のアドレス、ポートに来たものを2ヶ所にフォワードできないから
そういう心配は要らないと思うのだけど。
493 :
デフォルトの名無しさん :2008/07/08(火) 22:03:54
たとえば80番をUPnPで設定するような香具師は居ない。 ルータで逆NATとか、DMZとかで設定したほうに届く。 その設定がなければ、そもそも届かない。
いろはも理解してない奴らがルーターに穴あけてwinnyとか使ってるから恐ろしい。
>>493 >じゃ、どっちに送るの?
これが答え、人間様でもわからんのに・・・
語弊があるが、こんな時に識別するための役割がポート
httpサーバーには80番、FTPサーバーには23番
同一ドメイン(グローバルIP)にアクセスしても所定のサーバーに
届いて処理を行うようになっている
ただ、
>>494 にもあるように同一ポートでも届く先を換えるやり方は
もちろんあるけど
497 :
496 :2008/07/08(火) 23:51:38
すまん 質問と答えがループしていた ちょっと小一時間,説教されてくるOrz
>>493 アンタがルータで設定した方のPCに送る
ちょっと上に多分別の人がループバックができないとうまく行かない ケースの質問してたでしょ。hosts書くほかない、で立ち消えになってるけど。 Globalのアドレスをlocalに割り当てとけばよいという意味だとおもうけど。 192.168.0.13 my.domain.com と言う風に。これWebサーバは 192.168.0.13 Ftpサーバは 192.9.168.10 というような 場合はどうするの?
192.168.0.13 www.my.domain.com 192.168.0.10 ftp.my.domain.com とか 192.168.0.13 my.domain.com だけで13にftpのproxy立てるとか色々あるんじゃない?
>>500 わかりました。
外部に公開しているサイトの中で、ドメインにきっちりサービス名を付加しておけばよいのですね。
hostsを見るやつだけがわかってりゃいいんだよ。 整合性も要らん
>>503 そのケースだと、どちらにしても無理だと思うんだが。
ルーター替えるのが手っ取り早いけどな。 俺はこれが使えないルーターは買ったことないからわからんが。 ずっとYAMAHAだったしなー
13にftpのproxy立てるのも有効だけど、13自身のftpが使いにくくなるなw
じゃー間をとって11を創造して両方のproxyだー(なげやり)
ああ、しまった、忘れてた 色々小細工しなくても外部のproxy経由で見ればブラウザの設定をするだけで問題なかったんだっけ
>>506 マイクロ綜合研究所だと、トラフィックルーターって名打ってる機種だけかな。
あ、最近ソフトのバージョンアップすればできるようになったのかもしれない。
もうめんどいからローカル用のDNS鯖立てる。
え・・と ネットワークプログラミングスレだよな・・・ こんなノウハウ系の話題は歓迎だが
そもそも どんな想定なんだろ? 公開サーバーを内部でデバッグするためならhotsで十分だし たとえば、管理サーバーを内外でアクセスするなら グローバルアドレス調べてサーバーと一致すれば内部と認識して 設定ファイルにかかれたローカルIPでアクセスするとか?
通信対戦を行う3Dアクションゲームを製作しているのですが 頻繁に通信の同期ズレが発生します。 リプレイデータ等を見る限り、キー情報等の情報は完全に同期がとれているのですが・・・ 双方のデータの初期化不良の可能性が高いのですがなかなか原因がつかめずにいます。 そこで3Dデータ計算で頻繁に用いられる浮動小数点型等はPCや状況によって 演算結果が変わる可能性があるという風にどこかで聞いた事がある事を思い出しました。 実際そのような事が本当にあるのでしょうか?
同じOSで同じ開発環境ならそんなことはないだろ ちゃんと受信したデータが正しいか確認してるか?
Set8087CWのこと?
>>514 中間結果をダンプして比較すれば原因をが解るんじゃないか
>>514 浮動小数点演算にはCPUやライブラリ固有の誤差があるが、毎回結果が違うというようなものではない。CPUやライブラリが同一であれば同じ入力には同じ出力が得られる。
誤差の大きさはCPUのデータシートに明記してある。
考えにくいけど、送受するデータをバイナリで送っていないとか
意味不明
馬鹿ですね
struct とかを binary で送るのに endian と alignment の問題を意識して きちんと処理してる? 基本だけど... 浮動小数点数ならフォーマットの違いも
>struct とかを binary で送るのに endian と alignment の問題を意識して >きちんと処理してる? 基本だけど... してる >浮動小数点数ならフォーマットの違いも そっちはしてない あるいは、そもそも実数を送らない
計算式を送るのか
なんかのクイズ? 同期ズレってあるけど タイミングがズレる? 座標がズレる? 送信する前の座標を取る段階でズレてない? キーを取った瞬間の座標とかクォータニオンそのまま 送ってるなら多分ずれるわな キーがズレしないのならばおそらく、このスレとは関係ない
あっそうか、物体の座標等々送っているわけでは無いだろ キーデーター送って相手側でオブジェクト再現しようと うまく再現されないんだ。それでキーデーターが同じで それを元に計算してるのに計算結果が違うのは?って事だろ? クォータニオンは使ってる? そもそもキー取得→送信→再現って同期とるの 難しいけどどうやって取ってるの? ちゃんとジッタバッファ使って同期取ってる?
届いた瞬間に適用しているとか
x86 シリーズの浮動小数点数はレジスタ表記で 80bit だから、同じ計算でもずっとレジスタだけで計算するか 途中で時々メモリに書いて 64bit に丸めながら計算す るかで結果の値が違うことがある。
キーデータって入力したキーボードのキーのデータなの? 入力した時刻とか送ってる? 送るデータをもしキーボードのキーと時刻のデータだけだったら、 逆になぜ同期が取れるのかが俺には理解できない。 ちょっと相手を押したりダメージを与えて倒しただけでも 思いっきり同期がずれるでしょ。 ある程度はキャラクターの位置データとかも送らないと行けないと思うけど。
それは仕様によるでしょ。 入力したデータが両者まったく同一であれば結果もまったく同じになる
>>531 そのとおり仕様による
スレ違いだから誤解されるの承知で書くけど(現役でもないし)
例えば車ゲーみたいに絶えず動いているオブジェクトにおいて
キー入力の再現がmmSecでも変われば車の動きに誤差が出るしょ?
また、PC相手だとフレーム数も違うから、そのままキーを反映できないし
当然 V-SYNCのタイミングで更新掛けたり
同期バッファ(ジッタバッファ)で調整するわけだけど
>>514 はそこまでやってるのかな?って
ちょっと調べたらDirectPlayは遅延を最小に抑える機能があるみたいだけど
あくまでも最小だし
そもそも私が質問を歪曲している可能性あるけど
まあ 本人居ないみたいだしスレ違いだけど
そういや、乱数のSEEDを別々にあたえていてずれた、というのも聞いたことあるなw
猫でもわかるネットワークプログラミング読んでみたんだけど、 非ブロックにしたかったらWIN32でメッセージ駆動にしなくちゃ いけないものなの?メッセージ処理とネットワーク処理を 分離したいんだけど。
514 は3Dアクションゲームって書いてあるんだから、 キーだけだと誤差が出ると思うけど。 ダイレクトプレイは UDP だからこっちの取りこぼしかも知れないし。
>>534 俺はつい最近、ネットワーク周りをダイレクトプレイから WinSock に書き換えたんだけど、
イベントオブジェクトとマルチスレッドでメッセージからは完全に切り離せる。
ただ、実装してみてわかったけど、結局メッセージングの処理に近いようなコードを
自分で書くことになった。正直プログラムとしての複雑さはあんまり変わらないような気がするから、
メッセージングでも良かったかなと思ってる。
資料は「猫でも〜」と「Winsock2 プログラミング」っていう本。
これ以外もいろいろと見たけど、結局は「猫でも〜」を読んで感じをつかんで、
「Winsock2〜」 の方を読んで仕様を作って組むって事になった。
Winsock2 は多分今売ってる日本語の本ではベストだと思う。
>>220 亀レスだけど
プロトコルヘッダーを書き換える方法もある(関連付け)
事前にインストール必要だけどね
SKYPEタイプとかでやっている方法
>>534 猫でもシリーズは鵜呑みにしない方が良いよ
コーティングの一例として理解するなら良いけど
たまに酷いこと書いてるから
PC内部で、パケットフィルタリング等の処理をしているプログラムが存在する場合 それを検出する事は可能ですか?
P2Pの協力型アクションゲーム、例えばモンスターハンターの 竜のような敵へのダメージの通信方法なのですが、 我流でやってるもので、どうもイレギュラーなやり方でやってそうでちょっと心配に。 現在は、竜の同期をとりたいので、ホストが竜の動きをすべて受け持って計算、 クライアントは、竜にダメージを与えた場合、ホストに与えたダメージを通信してやって ホストが、竜のHPを算出するみたいな感じで。 ホスト側の送信 ホストキャラの位置、HP、行動 竜の位置、HP、行動 クライアント側の送信 クライアントキャラの位置、HP、行動、竜に与えたダメージ ほんと我流なので、ここはおかしいとか、こうしたほうが、同期がとりやすいとか ありましたらご指摘ください。
>>541 仲間内だけで遊ぶゲームだったらそれでもOKだと思う。
>>514 みたいなゲームで同期取ろうとすると毎秒60回送受信してるんだよな
同期できるのか?
>>534 イベント方式もあるけどそれだと説明してるところがホントにすくない
めんどくさいけど同期型を通信相手ごとにスレッドでまわすのを作ってるよ
>>541 それだと、クライアント改造されたり
パケットいじられたりしてすごいダメージ申告されたらおしまいだよな?
キャラクタの位置も自己申告?
ワープチートとかできそうじゃね?
CS型はLANとか高速な環境だけ想定した実装は楽だけど
それ以外の遅いノードが入っても大丈夫にするとか
データに欺瞞工作するやつをどうするのかとか考えると結構面倒だよな
操作と乱数表だけ同期するほうが楽だと思うけどなんで自己申告制?
あとボス以外の同期はまったく考えてない?
モンハンみたいにボス以外の同期を最初からあきらめてるゴミゲーは消えてほしい
シリーズ重ねてるのにいまだに直ってないとか信じられない
>>545 クライアントが改造されない(信頼が置ける)場合には、
541 のスタイルは実は意外と良い選択。当たり判定とか厳密に取れるし、
遅れも出ないし。
信頼のおけるクライアントなんぞ、無い。
だからこそ
>>542 が仲間内で、って言ってるんだろ
RMTが成立するような廃人御用達MOなら、いろいろ改造対策の必要があるが、
単にオンプレイ楽しみたいだけなら、やる意味ない
仲間内という前程が根拠も無い話なんだが、どうしてそれを持ち出すのか
550 :
514 :2008/07/18(金) 08:43:17
同人レベルですので、とりあえず仲間内や狭い範囲です。 チート対策等は、次のステップとして、 いまの課題はいかに、同期をとるかを考えていまして。
日本人の多くってゲームを楽しむってことを知らないよなぁ
よぉ韓国人 ゲームやりすぎて死ぬとか、ほんと人生楽しんでるよなー
仲間内の狭い範囲だとしても その仕様だとプレイヤーとか敵が増えるに比例して 通信量も増えるから出来ることが限られる どのくらいのパケット圧縮やら遅延をするのかにもよるが データそのものを自己申告制にするのはできるだけやめるべき LAN内限定とか言うんであれば話は別だが
当たり判定やダメージ計算をサーバーに処理させると、
どうしてもアクション性が落ちて、気持ちよくないゲームになってしまう。
本当にこういう話は、ケースバイケース。
>>553 実際、ネットワークゲームでパケット圧縮って効果あるの?
>>554 サーバーからクライアントに送るデータの方は結構効果あるよ。
逆は殆ど無い。気休め程度。
>>540 PCのネットワーク帯域に影響を与えている可能性のあるフィルタを列挙したいのです。
ワクチンのように特定の動作を行うソフトを列挙すればいい、それだけ ネットワークの範囲外だけどな
>>556 OSをインストールした直後よりも性能が落ちてるか明白なのか?だったら一個ずつソフトを止めてみればいいじゃん。
559 :
514 :2008/07/20(日) 18:30:06
>>553 現在、ホストキャラの座標XYZのfloatで12バイト、行動に2バイトで14バイト
ホストボスの位置も同じく14バイト
でホストは28バイトの送信
クライアントは座標XYZ、行動2バイトで14バイト
ボスに、ダメージいくらあたえたかの2バイトで16バイトの送信です。
自己申告制に変わる方法としてよいのがあれば教えてください。
560 :
541 :2008/07/20(日) 18:30:56
514でなかったです 541です。
>>559 ネトゲ作ったこと無いから適当なんだけど・・・・
ホストでボスキャラと全キャラ位置やダメージを計算して、クライアントにブロードキャストさせたほうが委員でない?
クライアントはホストから落ちてくる情報を補間して表示する。
攻撃コマンドはホストに送ると同時にモーションを開始、ホストからダメージ情報を受け取るとか
完全なP2Pでフレームレートに等しいアクション性が必要でないならホストとゲストに分けてホスト側で全部処理する方が楽だよ、 ゲスト側はキー操作のトリガー条件だけホストに送って、ホスト側で全プレイヤーの位置情報とモーション、衝突判定をする。 FPS系のゲームで個別処理しているのはとりあえず見たこと無い。 ただ多人数でやる場合ホストが落ちたあとに継続させる必要があるといろいろ面倒かもしれないけど。
>>562 遅い攻撃はサーバーで
速い攻撃はクライアントで
っていうのをどこかで見たな。
MMO なんか戦闘自体が単調でつまらないのは、
全部サーバで処理してるからだろうな。
格闘ゲームみたいに完全に近い同期が必要な場合はどうするんだろ 格闘ゲームくらいなら何とかなりそうだが、 東方花映塚にオブジェクト数が増えると、同期とれんだろ
違った、東方緋想天だ 東方花映塚ならボタンとおじゃまぷよさえ同期できりゃいい
FPSなんかじゃ入力予測や補完もしてる位だからなぁ 格ゲーでもEMU方面でそんなの有るしね。 リアルタイム性が求められる物は、 完全同期よりもラグをいかに誤魔化すかの方がいいのかもしれない。
不特定多数相手ならそれしかないだろjk
568 :
デフォルトの名無しさん :2008/07/23(水) 21:17:02
>>568 するってことですか?って聞かれても・・・
最近このスレ自由だけど さすがに相談という
形をとろうな
571 :
デフォルトの名無しさん :2008/07/24(木) 00:26:35
少しスレ違いだとは思いますが、教えていただきたいことが。 猫でもわかるネットワークプログラミングって、スレッドを使った、サーバ、クライアントのサンプルプログラムとかってありますか?。
>>571 目次みたらスレッドを使ってるのはなさそうだった
>>568 そのホームページへのアクセスはどうやってするの?
もし、DDNS とか使ってるんだったら、クライアントはそっちから IP を引けばいい。
ホームページにIPを出力する技術があるんだったら、
ホームページの方から MMO のサーバの IP を拾わせればいい。
DDNS みたいなことをやって、ネームサーバに登録したいって事か?
全くやりたいことが見えない。
>>569 すいません、プログラミングではありませんね。
>>573 なるほど、意味がわかりました。
ありがとうございます。
>>571 ウインドウメッセージをつかった非同期のやつがメイン
イベントのはまったく紹介されてない
ウインドウメッセージつかわない同期型を最初に紹介してるので
それを自前でスレッド型にかえることになるかな
8人くらいまでで遊べるネットゲームを作りたくて
P2P型のネットワークを想定して作り出したんだけど
最初にホスト役をやる奴にゲスト1が接続にいくのはいいんだが
ゲスト2がホストに接続したときゲスト1とゲスト2をどう接続するか迷う
ホストからいま誰がつないでるのかきいてリストを送ってもらって
それを見て参加中のメンバー全員につないでく方法とってるんだけど
もっとエレガントな方法があるんだろうか
DirectPlayとかそこらへんキニシナイでつかってたけど
いざ自分が実装するとけっこうめんどいもんでつね
この板で「データー」にお目にかかれるとは。
出〜た〜
579 :
デフォルトの名無しさん :2008/07/25(金) 16:56:07
スレ違いかもしれませんが、すみません。質問させてください。 Linux(RedHat Enterprise ES R3)のUDPソケットを利用してプログラムを 作ってるんですが、高トラヒック下の場合に、"sendto()"は成功しているが、 同サーバで動作させているtcpdump等のパケットパケットモニタ上では、 該当送信データが無い (対向装置側でtcpdump等で見張っていても、届いていない) といった状況が発生しており、困っています。 この場合、ドコを調査すれば原因の究明が出来るでしょうか?
質問になりますが、クライアントがサーバにうまく接続できない場合 いろいろな原因が考えられると思うのですが、どういった順序、 どんなツールで調べるものなのでしょうか? すいませんがよろしくおねがいします。
>>579 そもそもUDPは信頼性が保証されないプロトコル
バッファが一杯だとか適当な理由で黙って捨てられることもある
届かなくても大丈夫なようにプログラムを作るべし
>>580 ・サーバ上で netstat -an を実行して問題のポートが LISTEN になってるか調べる
・サーバ上で telnet localhost port で接続できるか調べる
・クライアントから telnet serveraddr port で接続できるか調べる
・クライアントがどの関数で失敗してるか調べる
・失敗した関数のエラーコードを調べる
・Windowsファイアウォールとかインターネットセキュリティ的なものをすべて切ってみる
>>582 丁寧にありがとうございます。
試してみます。
584 :
デフォルトの名無しさん :2008/07/25(金) 21:05:38
httpとhttpsが同じにあつかえるライブラリは無いですか?
あるよ
586 :
デフォルトの名無しさん :2008/07/25(金) 21:25:21
うpきぼんぬ
ggrks
格闘ゲームのような完全に挙動が一致するリアルタイムのネットゲームを作っています 現在winsockのTCPブロックしながらデータ転送を行ってるのですが 1回の転送が4バイト、光回線同士で1秒間に10回程度の送受信できているのですが 速度はこんなものしかでないのでしょうか?
589 :
デフォルトの名無しさん :2008/07/30(水) 08:42:42
一回の転送が少なすぎる 一度に8Kバイトとか遅れるだろ
590 :
デフォルトの名無しさん :2008/07/30(水) 09:02:00
UDPとは
UDPはデータが宛先に届いたかどうかをUDPは関知しないため、TCPと異なりデータの到着を保障しません。
そのため、UDPを使った通信を行うプログラムを書く場合には、パケットがネットワークの途中で消えてしまうことも想定しなくてはなりません。このような制約がUDPにはあるため、確実にデータを届けたいアプリケーションではTCPを使うのが一般的です。
このように書くとUDPは使いにくいだけに思えますが、利点もあります。
複数の相手に同時にデータを送信できる(ブロードキャスト、マルチキャスト)
TCPよりもリアルタイム性が高い
http://www.geekpage.jp/programming/ruby-network/udp.php
>>589 入力されたキー情報をやりとりしてるだけなので一回の転送量は大きくならないのですが
格闘ゲームでキー情報をやりとりするって状態がそもそも間違ってるのでしょうか?
592 :
デフォルトの名無しさん :2008/07/30(水) 09:43:44
4バイトを連続して送るなら纏めた方がいいってこと それで足りているんだったら4でいい
593 :
デフォルトの名無しさん :2008/07/31(木) 11:18:14
UNIXのソケットプログラミングと、 Win32のソケットと、 別々に書かないといけないんですか? それとも、なんかライブラリ導入したら、ソース共有できたりします?
594 :
デフォルトの名無しさん :2008/07/31(木) 11:19:31
boost asio
595 :
593 :2008/07/31(木) 11:24:20
サンクス boostですか、ちょっと尻ごみ。C++ Builderにboostが添付されるまで待つかな。
597 :
593 :2008/07/31(木) 12:35:09
ラジャ。binary見つけマスタ。
TCPで sendで100byte投げたら recvで50byteしか飛んでこないとかありますか? recvのバッファサイズは100です
うん もういっかいrecvしたら残りが飛んでくると思う それでも足りなかったらもういっかいrecv というか全部来るまでrecv繰り返せ
>>596 でもVCだとインストールに超時間掛かるよね
やっぱ、boostつらいね。 時代というかコンパイラが追い付いてない。
>>598 普通にアル ↑のほうでも論議されていたが
100がまるごとくることもあるし
25:25:25:25でくることもあるし
50:50でくることもあるし
30:20:10:40でくることもある
だから、データ送信の区切りとなる目安みたいなのを搭載する必然性が生まれる
普通はデータの頭にあと何バイトで終わるか情報をつける
もしくはデータの終端に終端文字をつける
あるいは両方を使う
よくゲームとかで相手との通信速度を知る目安としてPingって出てくるけど あれって、相手にパケットを送信して、それを相手が受信して、 受信しましたメッセージを返してきて、それを受け取るまでにかかった時間という認識でOK?
そのゲーム作った奴に聞け 実装なんて適当なんだよ
どう見ても、604は603質問の意味をわかってない。 まさかpingを知らないとも思えないが 日本語の方が若干不自由なのかもしれない。
このスレを見ててping知らないとか無いだろ
pingコマンドの出力は確かに
>>603 の時間だけど、
pingっていっても ICMP ECHOとは限らないんじゃない?
IRCみたいにPINGとPONGというプロトコルが定義されてるかもしれないし
>よくゲームとかで相手との通信速度を知る目安としてPing は、つまり俗に言う「ping値」とは、pingコマンドを実行して表示される値のことですけど。
>>610 ゲーム自体が用意しているping機能(自動的に相手とのレイテンシを表示してそれをping値として画面に表示してくれる)と、
C:\WINDOWS\system32\ping.exe の両方の意味がある、ってことだろ。
>>603 はどっちを言っているのかわからない
>>604 が言ってるのは前者
>>606-607 は後者しか知らない
どちらにせよ答えは
>>608 で正解
へー、そんなゲームあるのか。知らなかったよ。
つーか、レイテンシを表示する機能があるのはともかく、 それにpingなんて単語を使うのかよ。
セキュリティソフトを入れられてたらPINGできないからゲームなどは自力で計るんだよ
ping値って初めて聞いた ラウンドトリップタイム(RTT)って言えよ
ホームページ然り、ブックマーク然り 正しくない意味でも普及させてしまった物勝ちってか
ほとんどは無知なマスゴミでそ? ハッカーなんていい例だよね。
でも実際のアプリだとUDPのechoでもpingのより時間掛かるんだよね
実際の通信でやっている処理のほうがより正しい時間の計り方だろ
| \ __ / _ (m) _ピコーン |ミ| / `´ \ ('A`) ならicmpで通信すればいいのか… ノヽノヽ くく
だから、ルータやセキュリティで切られてたらダメだろ?いちいちユーザに設定変更しろと言うのか?
>>624 ゲームするために使ってポートつついて UDP echo でええんちゃう?
ポートあかなきゃ、ゲームすら出来ないって話なのでは?
>>624 そうだよ。ネトゲなんて勝手にWell-knownじゃないポート開くのが一般的なんだから、使うポートあけるのは当然。
winsockでUDPを使う場合で質問があります データ受信時で喪失する場合があるとのことですが、 それはまるっきりデータが届かないのでしょうか?それともデータの一部分だけ届くとかってことでしょうか? 例えば sendでABCDEFと一回で転送して、受信の方でABCとかCDEとかだけ届く場合がある それとも届くときはABCDEF全部届く、届かないときは1つも届かないとかでしょうか?
なんでもあり
それでは ABCDEFって何度も転送して、6バイトデータを受信できた場合に それの中身がABCDEFじゃない場合はあるのでしょうか?
届く時も届かない時も基本はパケット単位だからABCだけ届くことはない チェックサムが合ってなければ捨てるからデータが化けてる確率はかなり低い 普通は無視して大丈夫だと思われ
ありがとうございます
UDP自体のチェックサムは、「オプションである」という罠があるけどね。 まー、大抵はレイヤ1でそれなりのチェックがかかってるからそんなに 問題ないけどネ
届かない可能性があるっていう心配だけしてればいいの?
届く順番や一度に送ったバイト数などなんでもあり
>届く順番 これは正しいが >一度に送ったバイト数などなんでもあり UDPはパケット単位でしか扱われない 下位レイヤで切られて一部消失したら全部なかったことになる
100M送ったら0か100なのか?
100M送ったら100M全部届かない限り消失しちゃうんだろう 1Mの受信確率が99%あるとしたら、100M全部成功するのは100回に一回か とかそんな風に解釈したが
誰か黄色い救急車でも呼んでやれ
時にはTCPのことも思い出してあげてください
>>635 パケット単位って128バイトってことでしょうか?
それ未満のデータなら届くか届かないかのどちらかになるってこと?
UDPの話をしているんだ 空気読め
上で議論されてましたね。。。 もう3ヶ月romります 失敬(-3-)ノシ
学校の宿題か。
ねこわか読んだけど、文字列送信する方法は載ってるけど 数値を送信する方法載ってないので、itoaとかatoi使って 数値を文字列に変換して送信して受信側で数値に戻すとかめんどことやってるんだけど 一般的に数値を送るにはどういう手法をとればよいでしょうか?
ファイルと変わらんよ、自分の決めたやり方でやればよい。 バイナリのままやるなら、これもファイルと同じようにエンディアンに気をつけて。
一般的にネットワークバイトオーダ(ビッグエンディアン)で送ります。 まあ自分で作ったアプリ同士なら何でもありなんだけど。
htons, htonl, ntohs 辺りでググれ
アプリベースならトルエンディアンで送っても大差ないような。 bigendianってsparc位しか生き残ってないんじゃなかろうか?(MIPSも組み込みベースじゃLittleばっかりだし)
双方合意してりゃどっちでもいいよ。 いわゆるTCP/IPはbig endianで合意が取れてるってだけ。
big endianのほうが素直だとか美しいとか わけわからん主張する人ってすっかり居なくなったな
今やMACもインテルだもんな
little endianの方が素直な気がする・・・
PCに限って言えばね
ビッグエンディアンの取り得ってダンプリスト見るときに見やすい、ぐらいのものかなって思う。
UDPでデータを受信した際に、相手のIPアドレスを取得するにはどうすればよいでしょうか?
>>649 PowerPCが基本ビッグエンディアンだから、いまどきのゲーム機はぜんぶ
ビッグだと思われる。
>>656 recvfromで受信すれば、第5〜6引数に返ってくる
>>656 recvfromの説明を良く読めば解るよ
>>633 UDPは届かないこと前提だけど今時は素直に届く確立高いから
全部破棄で最初からとかって非効率な実装でも良いよ
もちろんケースバイケースね
それと上にもあるけどUDPの方がTCPより 早いというのは偏った迷信だから気をつけて
「偏った迷信」って何だよ 日本語で頼む
ごめん 迷信じゃなくて信仰 少し前 上司からTCPよりUDPの方が早いからUDP使えと言われた 最近 UDPの質問増えてるけど TCPとUDPの向き不向き考えて選択してるのかな?っと UDPのデータが保証されないって欠点ではなくて 利点なんだけど
なんだその僻みのようなレスは
向き不向きを知らずにUDPを選ぶ奴はいないんじゃない? 少なくとも巷の参考書は基本的にTCPだし UDPを知らなくてもTCP(/IP)は聞いたことがあるってのが普通だろうし
TCPのが速いの?
>>669 おおざっぱに言うと
1. 信頼性が必要な、大量のデータを流す場合、TCPの方が速い
2. 小さなパケットで反応速度を求める場合、UDPの方が速い
3. 再送してる余裕がなくてデータの破棄が許される場合、UDPの方が速い
4.UDPで信頼性を確保する為に上位プロトコルを作ると、大抵TCPの方が速い。 4.をやる奴はバカ。
TFTPはバカってことで
>>672 ある意味TCP実装するだけの資源がないところでしか使われてないのは現実だろ?
下手なものつかまされると、イーサネットフレームレベルからブートストラップ
するんだが、それは別の話だろ?
急にスレのレベルが下がった
skypeだってUDP使ってんだろバカ
>>668 >向き不向きを知らずにUDPを選ぶ奴はいないんじゃない?
基本そうだけど最近 夏休みのせいか
>>669 のようなのが多い
>>675 音声はUDPの方が向いてる。TCPで再送されると
遅延した音声がたまってく
別にホールパンチング用にUDP使ってるわけではない
>>677 向き不向きを知らずにUDPを選んでる人なんて居ないのに
>それと上にもあるけどUDPの方がTCPより
>早いというのは偏った迷信だから気をつけて
みたいなこと言い出す奴がいるから
>TCPのが速いの?
みたいなレスが付く
ふ〜ん
NFSも昔UDPだったけど、いまはなにも言わなければTCPだし。
最近はネットワーク格ゲーですら、TCP/IPでやりとりするぜ 高速回線なら50ms程度の遅れで済む まぁ3〜4フレ遅れるからローカルで動いていたゲームと同じ感触ってわけにはいかないが、 もともとそういう遅れのあるゲームとして実装しておけば(ローカルプレイの時もわざと遅延させる) たいして気にならない そもそも、本当に「UDPにしなきゃスピードが足りなくてどうしてもだめだ!」ってなってから手を出すべきで 最初は安定性が高いTCP/IPで組んでみるべきだと思うよ
他のゲームをやって愕然とするわけだな。
なにその光回線同士以外お断りゲー たしかにそういうのが出てきてるから困る ADSLで満足してるわけだが
もはや、光回線以外を視野にいれた設計をするコストがもったいない アクションゲームをネット対戦したいという段階で、光以外の回線を使っているのが悪いと思う
コストがもったいないとかどんだけ傲慢なんだよとは思うが せめてそういうゲームは光回線以外では遊ぶなと明記してほしい
>>685 いや、あくまで個人制作での話ですよ
結局「遅れてないように見せかける」のはできても、実際に遅らせないようにするのは不可能なわけで
通信タイム差が0.5秒もあるような環境でまともな通信対戦格ゲーができるわけもなく・・・
レースゲームとかならぎりぎりまでがんばるかもしれないけど
外国向けにリリースしないのならいいんじゃね?
バンド幅とレイテンシーがごっちゃになってる時点で無駄な議論だ。
レイテンシで困ることは多々あるが バンド幅で困ることってある? どんなゲーム作ったら困るのか例があったら教えてほしいわ 操作同期系しか作ったことないんでバンド幅で困ることはないな
そもそも
>>681 は初心者用の話だよな・・・
いつのまにはネットワークゲーム論になってるな
とりあえず初心者はTCPの方が良いだろ
環境に左右されるUDPだと繋がらない時の問題把握が難しい
まあ ゲームだと繋がらなくてもムリの一言ですむけど
質問です。 接続している2つのクライアントに、まったく同じデータを流し続けるサーバープログラムを組みました。 クライアントには受信したデータを出力する機能をつけているのですが、 ごくごくまれに、データに「抜け」が発生するようなのです。 どれくらいまれかというと、 サーバーは::sendで8バイトのデータを、毎秒60回2つのクライアントに流し続けて一時間。 それで送ったはずの8バイトが1個抜けてしまうか、抜けないか程度です。 winsockのTCP/IPで通信を行っているのですが、このようなことは、この程度の頻度であることなのでしょうか? 正確さをきすならば、TCP/IP通信であってもデータのCRCチェックなどを行うべきなのでしょうか?
ねえよ
>>691 TCP/IPにそんなことがあってたまるか。回線を疑えよ。
どう考えても回線よりバグの方が農耕だろ
非ブロッキングだったら、sendが渡されたデータ全部を送れない場合がある 戻り値を確認しる
>>691 本当にごくごく稀にそういうウンコ回線なプロバイダがないわけではないが
よほどひどいのでない限りはエラーで切断されるのが普通
>>695 じゃないが普通に処理がブロックされるタイプのも作ってみて
同じ症状がでるか確認してみるといいかもな
送ったデータとの差異なのか 2つのクライアント間での差異なのかもわからん
>>691 他にも書いてる人がいるけど、send, recvの戻り値チェック
再現する最小限のソースを晒せば、おそらくすぐ解決するよ
そんだけじゃ状況がわからなすぎる 例えばマルチスレッドでうんこな組み方してたらどんなことが起きてもおかしくない
>>692-699 ありがとうございます。
やっぱりTCP/IPの信頼性>>>>越えられない壁>>>私のプログラム
ですよね。
アドバイスに従っていろいろやってみます。
char buffer[8];
for(int i = 0; i < 2; ++i)
{
::send(ryaku); // ノンブロッキングモード
}
なので、同じデータを送っているのは確実です。
受け取る側はrecvのブロッキングモードなので、これもまぁ漏れはないかと。
>>695 が一番怪しそうなので、チェックをかけてみます。
何分再現が少ないので、報告は遅くなるかと思います。
701 :
デフォルトの名無しさん :2008/08/15(金) 09:44:17
うは やっぱりSENDの戻値とってね〜 オワットル
技術スレでわざわざ煽る必要はない。オワットルね
>>701 は
毎秒60回*8バイトってことは、480バイト/sか それでsendのバッファがあふれるなんて、ありえるかなぁ・・?
>>703 ループバックでやってもあふれるときはあふれる。
バイト数が問題ではない。
>>702 メモリが確保できたかどうか調べるのとは訳が違う。
>>704 そうなんだ。俺も結構送信に関しては油断してたかも
sendバッファが64KBだっけ?デフォだと。確保されるはずだから、大丈夫だろうって感じで
>>706 send バッファがどれぐらい開いてるかわかるの?
>>707 64KBの送信バッファをあふれたということは、64KB分遅延が発生してるってことじゃん?
ファイル送信系のツール作る時は当然簡単にあふれるから、sendの返り値を気にして作ってたけど
細かいデータをちびっとだけ同期するような、なんつーんだ?同期サーバー?ではあふれないと決め打ちしてた(油断)わーと
>>703 の計算でいうと、64KBの遅延=136秒の遅延だろ?
10秒データが届かないとタイムアウトクローズするように作ってたから、そんな遅延が発生するほどのバッファあふれは気にしたことなかったなー
何にしろ700のバグが治るといいな
>>708 まず、64kb 決め打ちじゃない。
それに、OS側のTCP/IP レイヤの処理が追いついていない可能性とかは無視?
とにかくそういう不確定な要素が多い物なのに、
なぜ、do while をつけるのを嫌がるのかが俺には理解できない。
そこまで条件判断を入れないことにこだわる理由がわからない。
>>710 いや、別にsendの帰り値をしっかり見るべきなのは100%正しいって
そんな責めるように言うなよ
今ぐぐってみたが、TCP/IPの送信バッファのデフォルトサイズは32KBだそうだ
俺の認識だと、送信バッファがあふれる=送信できてないデータが32KBたまってる=相手に32KB届いていない
って認識なんだけど、これってあってる?
32KBの遅延=68秒の遅延で、1分程度相手にデータがまったく届いていない(相手はrecvでデータが受け取れてない)って認識なんだけど
>>711 どのタイミングでデータがクリアされるか標準的な仕様ってあったっけ?
>>712 ああ、送信バッファっててっきり「ちゃんと相手に送れたら、その送れた分クリアされる」と思い込んでたけど
もしかしたら不定期にいっきに消してたりするかもしれないのか!?
>>713 俺が言いたいのは、つまりそういう詳しい仕様とかが良くわからないもの、
デバイスドライバがおかしいかも知れない、ネットワークカードがおかしいかも知れないし、
OSがらみかもしれない、ルータがおかしいかも知れない、中継サーバが原因かも知れない、
というような物は、こうだからこう、と決めつけるのは危険だってこと。
メモリが確保できない、ファイルの保存で書き込みに失敗した、なんて状況だったらOSがガタガタだろうけど、
データが遅れないなんて事は頻繁にあることだから。
>>714 なるほどねー。
いいアドバイスありがとう
epoll( size ); のsizeより多くのfdがEPOLL_CTL_ADDされたら、アウト?
>>711 しったか知識で推測しようとするから、混乱するんだと思うよ。
TCP/IPの送信バッファデフォルトサイズとか、実装依存の
ことまで持ち出してきてしまってるし。
スロースタートとか、ウィンドウスケールとか、それに応じて
送信バッファを広げる可能性もあるし、組み込みなんかだと
8KB固定とかもあるし、そんな議論は無意味なのだよ。
>>717 >実装依存
本来はそうなんだが、それを言っちゃうと、極端な奴だと
「じゃぁ、CPUのエンディアンをチェックする部分からソースを書くのか」
とか、そういう話になりかねない。
実装依存であっていい部分も多少はあるんだけど、
そのさじ加減としてでも send での戻り値をチェックするのは常識、
っていう話なんだよな。
この辺りの加減は経験積むしかないし。
質問です。 UDPとTCPのソケットハンドルを混在して selectに渡しても大丈夫でしょうか?
Unix系のselectはOK RTOS系は自分でポートするスタックならOKとなるように実装する Windowsはしらん その他は 実装依存
>>718 sendの戻り値をチェックするのが常識、という部分は誰も否定していないでしょ。
そんなん当たり前。
なのに、送信バッファのサイズがどうたらとか言い出すから、混乱するって
言ってるのであって。
どうでもいいけど、CPUのエンディアンはどっちでもいいように設定可能に
するのが常識だよね。ネットワーク関連のプログラムは。
やだよそんなのめんどくさい
ネットワークバイトオーダでいいじゃないか
実体はビッグエンディアン
それを蛇足と言うんだ
どう考えてもリトルエンディアンが優れている。 USBも採用している業界のデファクトスタンダード。 ネットワークバイトオーダーを決めた奴は素人。
バカが出たぞー
ビッグエンディアンのほうがMPUにとって素直なんだよね
↑ ビックインディアンはコンピュータからみたら 10進数をコンピュータで扱うぐらい非論理的。 少し考えたら馬鹿でも判る事。 マックもインテルに変えた今、ビッグインディアン信奉者は完全に消滅した。
USB?あのCPUばっかり食う駄目規格か。
>>731 それは制御の仕組みだろ。
データの流し方とは分けたほうが話しがスムーズそうだけど
なんかこのリトルエンディアン信者君て USB とかマックとか、 PC 向けでしかプログラムしか組んだことないみたいね。
ネットワークバイトオーダーは老害だから必要なとこ以外は無視していい
通信する両側で合意が取れてればなんでもいいよ
LSI作ってる身にしてみればビッグエンディアンは勘弁して欲しい。 リトルエンディアンか ARMのAMBAみたいなバイト不変エンディアンが自然だと感じる。 IBMのCoreConnectとPowerPCなんか 最上位ビットがb0で始まって、(32ビット系なら)最下位ビットがb31 なんだぞ。 今は、1個のチップでも内部バス幅の種類は8〜512ビット程度の範囲で たくさん使われてたりするから ビッグエンディアンが入り込むとこんな顔になりがち→(#^ω^)
ソフト屋「CPUのエンディアンどっちでもいいように組むのが常識だよね」 ハード屋「いや、ビッグエンディアンは勘弁^^;」 なに、このかみ合わない議論。 しったかハード屋は遠慮してほしいと思うのだが、どうなのだろう。
かみ合わないのがおかしいと思うおまいがしったかだと思うのだが、どうなのだろう。
まーソフト屋はなんとでも書けるけどハード屋は都合のいい エンディアンはあるかもね・・・・
>>736 > 最上位ビットがb0で始まって、(32ビット系なら)最下位ビットがb31
> なんだぞ。
修行がたらん!!! こんなもん頭抱え込んでるようじゃwW
なんで相談室なのに、
>>717 みたいな相談者をびびらせるような上から目線なレスつけるのかねー
で、selectはTCPとUDPのハンドル混在で動くんですか?
>>741 いや、別に相談者をびびらせてはないだろ。
>>743 (これからくるであろう)相談者って意味で俺はとったが・・
しったかだの、バカだの、オワットルだのレスは委縮させるだけだと思うがねー・・
711自嘲しろ
別に初心者に相談に来てもらったって、俺らが得るものなくね?
得るものないならスレ見なきゃいいだろ
まあ、質問スレだからな ただし、初心者向けとかそういう言葉が入ってないのも事実だな つーかソケット自体が素(ry
初心者が質問するのは全くかまわないが(そうしないとスレが死ぬおそれがある)、 知ったかは勘弁。
5知って10知ったつもりになる事があるのはしょうがない事。 それを指摘されたらまた一歩前進するだけのこと。 知ったかだと貶す方が勘弁。
ネット上で知識の上下のランク付けたい人がいるだけだから。
>>717 のどこが問題なのかさっぱりわからん。
むしろ穏当なほうだろ。
自演乙
RDPのプロトコルの仕組みを学びたいんですが参考になる日本のページってありますでしょうか?
まぁ717は「winsock」の話をしてるのに「実装依存」とか言い出しちゃう、 質問内容も把握してないしったかだからな 問題ありすぎだろ
winsockだったら実装依存もありえなくはないけど・・・まあふつうないけど・・・
いつまで続けるんだよ、これ
夏休みが終わるまで
このスレッドでこんな流れって過去にあった? 初めての気がする もともとネットワーク相談室って膨大な範囲だしね ベテランが新しい案件で初心者として質問する事もあるだろうし ピンポイントで質問してくるだけ まだマシなんじゃない? ネットワークゲームってどうやって作るんですか等が無いだけ
2ちゃんに何期待してんだか・・・ 気に入らないんなら自分で掲示板作れば? これがゆとりかね
うぜーよ、お前
まったくだわ しったかだの初心者くんなだの、誰でも来ていいという2chのルール無視すんなよ 他人馬鹿にして悦に浸りたいなら、誰も来ないローカル掲示板でも作ればいいのにな
2ch初心者かよwww
2chは相手を罵倒しても何してもいい。とか思ってる、2chのルールすら読まないゆとりが発生か・・・ ここ技術板だから、夏はあまり関係ないはずなんだけどな
嫌になったら出て行くだけの話だからねえ わざわざ「嫌になった」と書き込むアホはあまり見ないけど
2chにはローカルルールにもちゃんと書いてあるが、「煽り耐性」が かなり必要だ。煽られて前後不覚になるほど怒ってしまうような 馬鹿は来るな。
そう、おまえは出てゆくべき。
お前もな
オマエモナー
ところで、 RDPのプロトコルの仕組みを学びたいんですが参考になる日本のページってありますでしょうか?!
RDPって何?
Linux 2.6.15 で、setsockopt(2) で TCP_NODELAY を有効にしても、 実際の動作は、相手からの ACK (遅延 ACK) を待ってからパケットを 投げてしまいます。Linux で他 OS のように Nagle を無効にするには TCP_NODELAY だけでは足りないのでしょうか?
>>777 リモートデスクトッププロトコル
windowsを遠隔ログイン・操作するための専用プロトコル
SSL経由でできるらしい
>>778 1.Nagleアルゴリズムは、送信側が複数の小さいデータを1つにまとめて
送信する機能。
2.遅延ACKは受信側が、複数のパケットにたいしてまとめて応答するた
めの機能。
3.TCPって、通常はACKを待たずに相手の受信ウィンドウがあいてりゃパケット
を投げる。
整理して考えてみよう。
ヒント:輻輳制御
781 :
デフォルトの名無しさん :2008/08/20(水) 07:12:44
現在、任意のマシン上で開いている任意のポートからファイル転送を実現し、 ファイルを共有できるソフトウェアを開発しております。 また、ファイルを共有する機能だけでなく、リモートでマシンのデバイスを制御できます。 実現できれば、世界中のPC上のファイルが共有され、いつでも好きなデータを入手でき、 世界中どこからでも、端末を問わず自宅PCへアクセスし、コントロールする事が出来るようになります。 たとえば、携帯電話に自宅PCのコントロール用アプリケーションをインストールし、リモートコントロール できるようになります。
782 :
デフォルトの名無しさん :2008/08/20(水) 07:22:29
783 :
778 :2008/08/20(水) 10:38:36
>>780 遅延 ACK と Nagle の関係は理解しています。
が、通常、Nagle を無効にすれば、ACK を待たずにデータ送信するはずですが、
Linux の場合、TCP_NODELAY を有効にしても、ACK を待ち合わせるような動作
をするので。
あと、3. は、単純にそうとは言えませんよね。
通常 TCP は Nagle を実装しているので、MSS 未満のデータなら、その前の
データに対する ACK が返ってくるのを待ち合わせてから送信します。
MSS 1460 byte のコネクションで、アプリケーションが 10byte ずつデータ
を書き込めば、最初の 10byte は 10byte が 1 パケットで出ていきますが、
その次は、先行する 10byte に対する ACK が来るまで TCP が送信を待ち合わせ
ますよね。
TCP_NODELAY を有効にすれば、相手からの ACK に関係なく、10byte ずつ
データを投げ続けてくれるのですが、Linux の場合、2 〜 3 パケット程
投げた所で、先行するデータに対する ACK が来るのを待ち合わせる動作を
しているのです。その間に、アプリケーションからのデータ送信要求が
TCP の送信バッファに溜まるので、先行するデータに対する ACK を受け取った
後は、MSS サイズでまとめてデータ送信することになります。
もちろん、アプリケーションは、小さいサイズでデータを書き込まないのが
鉄則ですけど、TCP_NODELAY で回避できない理由を知りたいのです。
再送タイマに引っかかってるって話ではないの?
785 :
719 :2008/08/21(木) 01:38:22
Windows XPでも大丈夫でした。 ありがとうございました。
>>783 windowsでもTCP_NODELAY且つバッファー長を0にしても遅延はあるね。
TCPはそういう用途じゃないから、UDPを使えば即時に送信される。
>>783 スロースタートの制御じゃないの?
その辺のカーネルパラメータいじってみて振舞いの違いを見てみるとか。
>>1 のFAQも目を通しておいた方が良い。要は
・TCPではwrite()したものを強制的に送信させる方法は(一般的には)ない
・送信を遅延する理由はいろいろある。Nagleはあくまでその一つ、というだけ
・他の典型的な理由はウィンドウ制御
ってことらしい(スロースタートもウィンドウサイズを制御する)。
あと
> 通常、Nagle を無効にすれば、ACK を待たずにデータ送信するはずですが、
この説明は間違ってない?
788 :
787 :2008/08/22(金) 15:23:27
って、よく見たらすでに
>>780 でヒントが出てるな。
>>787 はそれと同じことを言ってるつもりだよ。
横からすまん。
>>789 の19番は今の話に関係ないと思うが・・・
>>780 服装制御がどう影響してくるのかわからん。
教えてくれ
>>791 TCP で PUSH フラグ立てても ACK が PUSH したセグメントに
同期するわけではないことを言ってるのではあるまいか?
今はしらんが, 昔の Winsock は,
「PUSH したセグメントのACK を期待するような振る舞いをしていた」
記憶がある
793 :
デフォルトの名無しさん :2008/08/24(日) 15:13:58
質問です。 勉強で簡単なクライアントプログラムを作りました。 ところが、hp-uxとmac os xで動きが違って困っています。 #include <stdlib.h> #include <sys/socket.h> #include <sys/types.h> #include <netdb.h> #include <string.h> static int open_connect(char *host); int main(){ FILE *out; int socketfd, nbyte = 0; char buf[5000]; socketfd = open_connect("menu.2ch.net"); out = fdopen(socketfd, "r+"); if(out == NULL){ perror("fdopen(3)"); exit(EXIT_FAILURE); } fprintf(out, "GET /bbsmenu.html HTTP/1.0¥r¥n"); fprintf(out, "Host: menu.2ch.net¥r¥n"); fprintf(out, "User-Agent: Monazilla/1.00¥r¥n"); fprintf(out, "Connection: close¥r¥n"); fprintf(out, "¥r¥n");
794 :
デフォルトの名無しさん :2008/08/24(日) 15:15:08
/*続き*/ if((nbyte = fread(buf, sizeof(char), 5000, out)) == EOF){ perror("fread"); exit(EXIT_FAILURE); } fclose(out); printf("client got: %s¥n", buf); exit(EXIT_SUCCESS); } static int open_connect(char *host){ struct addrinfo hints, *res, *ai; int socketfd; int err; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; if((err = getaddrinfo(host, "http", &hints, &res)) != 0){ fprintf(stderr, "getaddinfo(3):%s¥n", gai_strerror(err)); exit(EXIT_FAILURE); }
795 :
デフォルトの名無しさん :2008/08/24(日) 15:16:26
/*続き*/ for(ai = res; ai; ai = ai->ai_next){ socketfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if(socketfd < 0){ continue; } if(connect(socketfd, res->ai_addr, res->ai_addrlen) < 0){ close(socketfd); continue; } freeaddrinfo(res); return socketfd; } fprintf(stderr, "socket/connetct failed¥n"); freeaddrinfo(res); exit(EXIT_FAILURE); }
FILE*に変換するのは合法なのか
どこからつっこめばいいんだこれ・・・
798 :
デフォルトの名無しさん :2008/08/24(日) 15:22:27
結果はmac os xではちゃんと出力されるのですが、 hp-uxでは、 client got: tes official service names and aliases with # the port number and protocol the services use. # # Some of the services represented below are not supported on HP-UX. # They are provided solely as a reference.# # The form for each entry is. # <official service name> <port number/protocol name> <aliases> # # See the services(4) manual page for more information. # Note: The entries cannot be preceded by a blank space. # tcpmux 1/tcp # TCP port multiplexer (RFC 1078) echo 7/tcp # Echo echo 7/udp # discard 9/tcp sink null # Discard discard 9/udp sink null # systat 11/tcp users # Active Users daytime 13/tcp # Daytime daytime 13/udp # /*長いので略*/ どのへんをなおすと、同じように動いてくれるのでしょうか? ネットワークバイトオーダーの問題ではないと思います。 getaddrinfoの実装の違いでしょうか?
799 :
デフォルトの名無しさん :2008/08/24(日) 15:27:19
>>797 >どこからつっこめばいいんだこれ・・・
ぜんぶつっこんでください、アッー
nbyteの値を確認してみるとか 一番突っ込みたいのはfdopenやめれってことだが
801 :
デフォルトの名無しさん :2008/08/24(日) 16:16:26
>>800 おお、凄い。
read,write使ったら出来ました。
ありがとうございます。
いやぁ、ふつうのLinuxプログラミングという本にfdopen使っていたので、そのまま使ってしまいました。
でも、なんでmacやFreeBSDだと問題なく動いて、hp-uxだと動かなかったんですかね?
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#define MESSAGE "GET /bbsmenu.html HTTP/1.0¥r¥nHost: menu.2ch.net¥r¥nUser-Agent: Monazilla/1.00¥r¥nConnection: close¥r¥n¥r¥n"
static int open_connect(char *host);
int main(){
int socketfd, nbyte = 0;
char buf[5000];
socketfd = open_connect("menu.2ch.net");
if((nbyte = write(socketfd, MESSAGE, strlen(MESSAGE))) == -1){
perror("write");
exit(EXIT_FAILURE);
}
if((nbyte = read(socketfd, buf, sizeof(buf))) == -1){
perror("read");
exit(EXIT_FAILURE);
}
またsendの戻り値無視か
803 :
デフォルトの名無しさん :2008/08/24(日) 17:03:30
>>802 >またsendの戻り値無視か
すいません。
nbyte = write(socketfd, MESSAGE, strlen(MESSAGE)
のnbyteがstrlen(MESSAGE)と等しければ良いんですよね?
804 :
デフォルトの名無しさん :2008/08/24(日) 17:16:00
ん? writeとreadの他に 専用のsendとrecvがあるのか... どっちを使った方が良いのかな? 当然、sendとrecvですよね... でも、どうして自分の持っている本(新the unix super text下, Linuxプログラミング改訂第二版, ふつうのlinuxプログラミング) では使ってないんだろう... 一般的ではないのかな?
>>803 いやちがう。すべて送られるとは限らないのがソケットらしさ。
sendの値がstrlen未満の場合は多々ありますよ。 だから普通は全部送り切れるまでループさせるんだよ。
>>804 Unix 系の OS は write/read は flags 決めうちで send/recv を呼ぶ.
特に, flags 指定する必要がない場合, write/read で無問題
808 :
デフォルトの名無しさん :2008/08/24(日) 22:41:57
>>805 ,806,807
すいません。
いろいろアドバイスいただいたのですが、良くわかりませんでした。
ループさせるとか...具体的なコードが無いと...
とりあえず、今日初めてネットワークプログラミングという物をして
返事が返ってきたので、今日はコレで満足です。
ビッグカメラのポイントが1万円分有るので、こんど、
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTIを買ってこようと思います。
有り難うございました。
それを読むのは
>>1 からのリンクを見てからにしてくれ
こんなか? void recv(socket s, vector<char>& buf) { int rsize = 0; do { int size = recv(s, &buf[rsize], buf.size() - rsize); if (size <= 0) { // エラー返すなり例外投げるなり。 // ==0 の時は別処理かも。マニュアル参照。 } rsize += size; } whlie (buf.size() != rsize); }
EINTERのときにリトライくらいは入れてあげてね
C10Kが流行った頃、負荷試験っぽいことをやったら acceptやselectやpollがEINTRを返してきだして笑った
>>800 fdopen は何がまずいの?
テキスト指向をお手軽に済ませたいときは便利だと思うけど。
まあ、バッファリングとかテキストモードとかは気にしなきゃいけないけどさ。
fdopenを使うと内部でread,writeを使うことになる オープン系ならreadもrecvも大差ないがOS依存といえる (Winsockとかだとどうなるか知らん) glibcだと読み込みにmmapを使うバージョンがあるからさらに厄介 もともと、ファイルストリームと片方向ストリーム用の機能だから過信は禁物 readとwriteの間にキャッシュの同期処理が入るなど見た目より複雑になる 何となく問題が起きそうな事書いているが 動作を理解してない初心者にとって逆に意図した動作になる事が多い でも、実害が起きたら勉強になるから、その時に理解すればいいと思う
リアルタイム性の高いネトゲで、現在はTCPを使って動作をやりとりしています。 ですが回線の遅い環境を考慮し、UDPで行うべきだと指摘されたことがあります。 やりとりするデータはキーデータのため、ストリームとして扱えるTCPは非常に親和性が高かったです。 UDPでやるとしても同じ形式のままで行うつもりのため、自力で「再送処理」や「データの並び替え」を行う必要があります。 そうなるとTCPの再開発に近いものがあり、なんだか無駄に思えます。 そもそもそこまでやって、速度の向上は見込めるのでしょうか? TCPの「確認応答」を待たずに送り続けられるだけ速いのでしょうか?
>>815 UDPはパケット届かなくても良いやって感覚だからね。
>>815 自身が設計上、TCPが良いと判断するなら、TCPを使うべき。
もしプレイヤーの内、誰かが回線ケーブルを引っこ抜いた時にゲーム全体がストップするようなら、
それは設計の問題。
.
>>816 お返事ありがとうございます。
サーバーが時間管理をしているため、誰かがケーブル引っこ抜いても「そのプレイヤーだけ無視して」進めます。
なのでそういう意味での心配はありません。(全員に被害が出るのは、サーバーが動いてるPCが動作不良になったときくらいです)
TCPの仕組みを「3 Minutes Networking」というHPで勉強したところ、
TCPであっても相手のバッファをオーバーしない範囲では、確認応答を待たずにガンガン送信を行うように理解しました。
となると、「バッファの限界値に達しない」「送信ミスが起きない」という前提ならば、TCPはUDPと同等の速さと考えてよいのでしょうか?
「そんな前提ありえねー」というのはありますが、ストリーミング的に使いたい以上「送信ミスが起きた」らUDPでも再送処理が必須になり、スピードは生かせません。
UDPがTCPより優れるためには、やはり「途中でパケットが紛失しても、無視して進める」タイプ限定なのでしょうかね?
CS型で接続された1つのリンクに不具合が出ても それを切断して何事もなかったかのように継続できるんだろ? むりしてUDPに最適化する必要ないと思うけどね ぶっちゃけ気分の問題くらいの変化しかないと思う サーバーの回線が太いなら データロスト時の再送信とか 多重送信されたときの破棄とか 受信順の考慮とかがめんどくさいなら 無理してやる必要ない 低速で低能なノードお断りでいいんじゃねーの?
なるほど。 一応アクションゲームなので、技術的に可能ならばなるべく速いものをリリースしたいなと思ったのですが ストリーミング的な使い方をする限りはほっとんど差はでないようですね。 さすがに今からUDPに最適化したシステムに作り替えるのはつらいですし、TCPでいってみます。 どうもありがとうございました。 このスレにはたびたびお世話になっています。いつもありがとうございます。<ALL
>>818 実際思うんだけど、そんなに低速低能なノードでネットゲーできるのかねぇ?
UDP TCP 以前の問題のような気がする。
>>820 古いカウンターストライクは電話回線対応(動作CPUもMHz世代)だったぜ?
ネットワークゲームを作ってるんだけど、UDPが一秒間で60個送られてくる状況で pcap_next_ex使ってこれをキャプチャーしてるんだ。 しかしどうやっても(pcap_next_ex以外を全てコメントアウトしても) 秒間50個くらいまでしかキャプチャーできなくて、 結局どんどん残りがバッファに溜まって相手の動きが遅延再生されてしまう。 高速化についてお知恵を貸して頂けませんか。
30個に減らせばいいじゃない
カウンターストライクとかFPSってどうやってるんだろうね 現在の自分の向いている方向、座標、HP、アニメーション番号、アニメーション再生フレーム数。 まぁ32バイトもあれば「自分の情報」は送れそうだ。 問題は「弾を発射した」情報。 これを相手が受信ミスすると、弾が発射されてないことになってしまう。 一瞬で着弾するから、受信ミスで当たらなかったとしても「あれ?まぁ当たらなかったのか」で攻撃側が納得しちゃうのかな? くらう側の自己申告式だよね?ヒット処理って。 チートで無敵モードとか簡単に作れそうだな・・・。
何度目だよこの話題
何度目なの? あと過去ログどこ見ればその話題が乗ってるの? 825のレスに何の意味があるの?
何度目だよ
826のレスに何の意味があるの?
過去ログのどこ見ればいいの?って質問なんだから、意味あるだろう
で、何度目なの?
このスレか前だかでやったよね 何度目か数えてる奴いる?
>>823 減らせないから困っていたんだ・・・
なんとか頑張ってみるよ
>>824 むしろ、クライアントはサーバ機にキー入力情報を送るだけで良い希ガス。
弾の発射や当たり判定はサーバ側でやるといいんじゃね。
この手のスレは質問厨と教え厨だけいればいいよ 質問がループしたって違う人が参加してれば何かかわるかもしれんし 何度だろうと全然かまわんだろう
>>833 キー入力だと、少なくともサーバー→クライアントへは正確性が保障される必要があるでしょ
そうなると再送処理や並べ替え処理が必要になり、なんのためにUDP使ってるのって話になる
今確認したが、少なくとも、前スレ、前前スレに
>>824 のような話題は無かった
もちろん毎スレUDPの話題自体はちょびちょびあったが
>>835 >キー入力だと、少なくともサーバー→クライアントへは正確性が保障される必要があるでしょ
なんで?
ユーザからのキー入力をすべてサーバ側で解決する。
通信方式をTCPにするかUDPにするかは要件次第。
クライアントには結果を送りつけて表示させる。
ここの実装はコマ落ちしてもいいならUDP。
ネットゲームの種類がわからないから一概には言えないけど、これで問題あるの?
printf( "connect == 0x%x\n", connect( fd, (const sockaddr*)&skad_in, sizeof( skad_in ) ) ); getsockopt( fd, SOL_SOCKET, SO_SNDBUF, &i, sizeof( i ) ); printf( "SO_SNDBUF == 0x%x\n", i ); で、常に0x0が帰ってくるんだけど、何か間違ってる?
getsockoptの戻り値はチェックしてる?
>>837 ああ、833はクラ>サバだけキー入力で済まそうって言ってるのか
読み違えた。すまん
でも結局サバからクラへは、UDPで「状況」を逐一送る必要があるのかー・・・
・抜けの間の補完処理(ワープとか起きにくいように)
・キャラ以外の「状態」を持つオブジェクトの変化についても逐一送るのか?
ってのが気になるな。
FPSでドラム缶を撃って吹っ飛ばすことができるが「ドラム缶が吹っ飛ばされた」というデータをクラが受信ミスった場合、ドラム缶の状態が矛盾しちゃうよね?
だからといって逐一ドラム缶(たくさんあるだろうし、窓ガラスとか、机とかたくさんあるよね)の状態をサバがクラに送信するのは変だし
ゲーム中NICのケーブル引っこ抜いたりすると動いてる物が あさっての方向に飛んでいくようなオンラインゲームでは、 移動ベクトルの予測である程度動かしてるから、パケットが こなかったら予測地点の方向に移動し続ける。 パケットが届いて位置が間違っていたらまき戻ったり修正が入る。 プレイヤーは気にせずそのオブジェクトの移動予測地点を 狙って撃てば実際は違っていても当たり判定が通る可能性がある。
>>841 ドラム缶が吹っ飛ぶとき「こういう速度で、こっち方向に吹っ飛んだ」という情報が1度だけくるのか(これを受信しそこねると矛盾がひどい)
ドラム缶が吹っ飛んでいく過程で「今こういう速度で、こっち方向に飛んでいる」という情報が何度もくるのか(いちいち全オブジェクト、何度も飛ばしてたら情報多すぎない?)
841が例にあげたゲームだと、後者っぽいねー
うまく
・変化しているオブジェクトだけ情報を送る
・UDPの1パケの容量制限(MTU)にひっかからないように、たくさんのオブジェクトが変化している場合は、かわりばんこに一部のオブジェクトの情報だけ飛ばすなどして負荷分散
してるかな。
キー情報を送りあうTCPネトゲしか作ったことがない身としては、すげーと思うわ
>>832 pcap_setbuffを使うとお手軽に遅延は無くなる。
でもロストは増える。
>>832 ごめん、色々勘違いしてた
mintocopyでWinpcapマニュアル内を探してみて
>>842 移動予測でデータ間引いてるわけだから量は多くないはず。
オブジェクトの衝突判定のような優先度の高い情報だけは
ハンドシェイクでやってるんじゃないかと。
多分2PCで観察するとドラム缶の軌跡なんかは
かなりいい加減に見えるんじゃないかな。
>>845 なるほどねー。
こんな感じかな。
弾とかがビュンビュン飛び交うゲームだと、下記でいう「アクティブなオブジェクト」が多くなりすぎてきついかも?
あと、キー情報と違ってサーバーにゲームの進行(当たり判定など)をまかせるので、サーバー重そうだね。
その代りクライアントが「ビュアーに徹する」ことができれば、サーバープログラムだけ更新すればゲームバランスとか調整できていいかも?
■毎フレーム飛ばす
キャラの位置情報、アニメーション情報、HPなど
■ドラム缶など、重要度の低いもの(非アクティブなオブジェクト)
仮にドラム缶が120個フィールド上にあるとする。
1フレームに1つのドラム缶の「位置、動き」情報を送る。
通信状況が悪くても、最悪でも2秒に1回「そのドラム缶の状態を更新する」チャンスがある。
■すっとばされたドラム缶など(アクティブなオブジェクト)
アクティブな状態(動いている状態)のドラム缶は120個未満であろう。
120フレに一回よりは短い頻度で、状態更新情報を送ってやる。
本当にたくさんのドラム缶が一斉に吹っ飛んだ場合などは、うまく動的に更新頻度を減らし、UDPパケの送信上限にひっかからないようにする
アクティブなオブジェクトだろうがなんだろうが 操作同期するだけならまったく問題ないんだが FPSだと 途中から参加 できるんだよな あれの同期ってどうやってんだろう めんどくさそう
>>847 操作同期ってのが「キー入力情報を送りあう」という意味なら、それじゃUDPの強みがないねって話になったでしょ
>>846 キャラの情報にしたって、クライアントが別のクライアントの情報を受け取るのは毎フレームである必要はないよな。
参考になるなー。
話が膨らまないな
何度もこの話題を繰り返してるという、自称スレ古参さんとかがもっと意見を出してくれるのを期待してたんだが
ほんとに
>>846 こんなつくりであってるのかね?
そんなことをいちいち人に聞くなよ・・・ 試せば判るだろ あーいらつく
uIP 1.0 使おうと思ってソース眺めてるんですが、 デバイスドライバの実装をどこに書けばいいのかわかりません。 「実際のデバイスへのアクセスはここに書け」みたいなところ見当たらないし。 知っている方いませんか。
そんなことをいちいち人に聞くなよ・・・ 試せば判るだろ あーいらつく
牛乳〜に相談だ〜♪
…完全に病んでる
どんなping値のときも絶対あきらめない
そーよ、それが、可憐な乙女の(セキュリティ)ポリシー
サーバ、クライアントともに linux で動いているシステムで 普段は一瞬で connect が終わるシステムで、あるとき connect がいつまでたっても(50分以上)返ってこないことがありました。 Linux の場合、長くても4分程度でエラーが返ってくると思ってたんですが、 connect が50分も返ってこない状況って何が考えられるでしょうか
途中で経路が切れた 例えばLANケーブルが抜けたり、PPPが切れたり
ファイヤウォールとかNATルータとかが間にあったりする?
connect出来ないことと、connectのタイムアウトが遅すぎることのどっちを問題視しているのかが分からん。
>>860 LANケーブルが抜けたときは 4分程度で ETIMEDOUT が返ってきました
>>861 あったりします
connect 側では SYN を送って ACKSYN が返ってこないのを監視していると
思ってましたが、状況は中継装置で変わるもんでしょうか
>>862 タイムアウトが遅すぎるのを問題視してます
数分で返ってこない場合があるのなら自前でタイムアウト処理する必要があるので
cat /proc/sys/net/ipv4/tcp_keepalive_time cat /proc/sys/net/ipv4/tcp_keepalive_intvl cat /proc/sys/net/ipv4/tcp_syn_retries cat /proc/sys/net/ipv4/tcp_retries1 cat /proc/sys/net/ipv4/tcp_retries2
>>864 サーバ・クライアントとも以下の値ですた
tcp_keepalive_time 7200
tcp_keepalive_intvl 75
tcp_syn_retries 5
tcp_retries1 3
tcp_retries2 15
socket 生成時、SO_KEEPALIVE は有効にしてません
connect が返る前の段階では establish になってないので keepalive は
関係ないと思ってたんですが違うんでしょうか
syn_retries が 5 なので大体長くて4分程度でタイムアウトになることを見込んでました
connect(2) によると syn_cookies で応答が遅くなる場合があるって書いてありましたが、
理屈がよくわかってないのと、当該時刻にサーバーで syn flood を検出した形跡はありません。
* netstat * packet capture
>>865 通常, 4分程度でタイムアウトになるのは ARP が帰ってこない場合
NAT box が syn/ack 返せば話が変わる
>>859 connectが成功してるのに成功してないと勘違いしてるだけじゃねーの。
TCPの再送タイムアウトなんて数分なんだから。
いったんconnectが成功し、パケットのやりとりが皆無ならTCPの
接続は無限にタイムアウトしない。
みなさんありがとうございます
>>866 2年以上連続稼動してきたシステムで一度だけ発生した現象であり
今のところ症状が再現してないので、その方法だと追求は難しそうです。
>>867 なるほど、しかし SYN/ACK 返ってきても connect が返らないケースって
あるんでしょうか?申し遅れましたが linux のカーネルは 2.4.31-0vl1.8smp です。
>>868 少なくとも connect の次の行にあるログ出力の形跡が残ってないことは確かで、
ログの機能はその前後行き続けていることから connect が返っていないと断定しています。
おっしゃるとおり、一度 ESTABLISHされた接続は keep_alive とか設定しなければ
勝手にタイムアウトすることはないですよね
>>869 ログ出力がバグっている可能性も忘れないように。
ログは、絶対出力される!と、断定できるならいいが。
絶対というのは、プログラム上他のスレッドが同時に
ログ出力しても論理的に大丈夫なはず、と言い切れるか
どうかということね。
>>870 その部分は非常に高い確率で信用しています
論理的にはログ出力は mutex で排他処理してますし、
それが2年以上問題なく動き続けてきた実績があるので
どれくらいの頻度で再現すんの?
最終的に、connect(2)は50分後にエラーで帰って来たんだよね? その時のエラー番号は?
>>873 50分経っても返ってきてないんです
運用上の問題があって kill されてしまってます
>>874 connectに渡してる相手側のIPアドレスやポート番号は絶対に間違ってない。
tcp_syn_retries 5
connect(2)から戻らない、50分後にプロセスをkill
カーネルバグってんじゃない?
>>875 ありがとうございます。
やはりおかしいですね。カーネルソースを追って確認してみます。
カーネルの中は読んでませんが、 connectをコールするとSYNフラグがついたIPパケットが送信される。 SYN/ACKフラグのついたIPパケットが受信出来なければ、最大5回まで リトライ。リトライオーバーでタイムアウトしエラーリターン。 SYNパケットがドライバや、途中の回線状態(含むHW)でロストしたとしても、 上記処理は正常にエラーリターンしそう。 戻りのSYN/ACKパケットがドライバや、途中の回線状態(含むHW)でロストしたとしても、 やっぱり上記処理は正常にエラーリターンしそう。 最後のACKパケットがドライバや、途中の回線状態(含むHW)でロストしたとしても、 相手側が困るだけで、自分のコールしているconnect(2)からはリターンしそう。 smpカーネル使ってるみたいなので、connect(2)そのもののロジックよりも、 smp周りのデッドロックを想定した方が良いかも。
>>876 netstat で見るとどうなってるよ, コネクションの状態?
# つか, 現象起きないのか?
>>878 2年稼動してきて1度きり、再現してません
>>877 smp のデッドロックですか
kill する際、統括スレッドがシグナルを受け取ってから各スレッドに対して
pthread_cancel を実行するんですが、connect のところで詰まっていたスレッドは
正常にキャンセルできています。pthread_cancel(3) によると connect は
キャンセルポイントになっているようなのでこれ自体は正常な挙動だと思うのですが、
デッドロックがあったとして、cancel point となるもんでしょうか。
というか、カーネルのバージョンはどないやの?
882 :
デフォルトの名無しさん :2008/09/02(火) 22:54:00
javaで簡単なソケットプログラム(サーバー)を書いてみたんですが、 クライアントからの入力を全部読み込んでから結果を返却するのはどうすればいいですか? while ((inputLine = in.readLine()) != null) { ※inはBufferedReader これだと全部読み込んだ後フリーズします。 クライアントでcloseすれば抜けますが、それだとoutまでcloseしちゃうんで。。。
自分でプロトコル作れ。最初の行で送信データサイズ送るとか。 256 バイトごとにぶった切って最初の 1 バイトにブロックサイズ、 残りの 0〜255 バイトでデータ部、0 バイトのデータ部が来たら 終了とか。EOF にならなくても終わりを検知できる方法を考えれ。
クライアントでshutdown(send)すればいいんじゃね?
shutdown てそれ以上のパケット送出を行わなくするものだから相手側で 切断つうか EOF 検知できないんじゃないの? 大昔にピア無応答時の緊急 処置でしか使った事ねぇけど。
ハーフクローズで、発行した側の送信FINが行くでしょ 相手はrecvが0を返す事で判る
888 :
883 :2008/09/04(木) 23:47:38
>>884 とりあえずそうしてあります。
ちょっと納得いかないところもありますが。。。
>>885 〜887
ハーフクローズなんて初めて聞いたのでしらべました。
終了時のルールがあるんですね。
これがベストなんでしょうが、
JAVA-VB(Winsockコントロール)間でどう実装するのか分かりませんでした。
とりあえず何が問題なのか分かった気がするので、もうちょっと調べてみます。
ありがとうございました。
このヤロウ、プロトコル作るのがベストにきまってるだろ なぜほとんどの通信ソフトがプロトコル作ってるのか考えろ
890 :
883 :2008/09/05(金) 00:23:11
クライアントがJAVAならシャットダウンありますね。 Socket#shutdownOutput これで試したらうまくいきました! でもクライアントはVB6なんです。。。orz
無視か!クソ!氏ねボケが!
892 :
デフォルトの名無しさん :2008/09/05(金) 00:32:49
883みたいな奴がいると教えるだけ無駄だと痛感するよね。
>883はHTTPやFTPがどうやってデータのやりとりをしてるのか知らない子 そもそもプロトコルの意味を理解していないのかもね
894 :
883 :2008/09/05(金) 01:06:58
>>889 無視じゃなくてリロードしてなかったんですよ。
出来ればアプリ層にプロトコル実装したくなくて、
readLineをオーバーライドして対応させようかと思ったけど、
それもパフォーマンスの面で不安だったりして。。。
>>892 いや、自分にとっては有益です。
少なくともフリーズしてる理由が分かりました。
無駄に思われる必要はないと思いますよ。
>>893 ヤバイぐらいわからないから勉強してるんですよ。
あんまいじめないでください。
怒られてるのに上から目線
896 :
デフォルトの名無しさん :2008/09/05(金) 01:12:18
叱られている理由もわかってないんでしょう。
ていうかおまいらが低脳すぎ
君の意見を聞こうか 話したまえ
聞いてるほうが上から目線
目線は後から判断する まずは意見を聞こうか 話せ
都合の悪いことは後回し、と。
判断がつかないことは後回しだ 君の意見を出してもらおう
厨臭い奴にいつまでも食いついてたりこんなヌルい引っ張りに一々付いてくる奴は莫迦ってことだ。 2ch は初めてか? 力抜けよ。
自己否定か よく考えてから書き込みしろよ
自分が厨臭いという自覚はあったのか。 そのまま社会に出て迷惑かけないでねw
マイクロソフト共有ネットワークを使って プログラム上からネットワーク上のファイルを読むことは可能でしょうか。 fopen使ってのファイル読み込みは失敗したので(使い方が違う?)。
>>906 C言語でも使って直にアドレス書いてるのでは?どう書いてる?
908 :
906 :2008/09/06(土) 13:03:11
>>907 fopen("192.168.0.1\\test\\aa.txt" ,. "r");←共有されているフォルダ。
今は環境がないので試せません。
もしかすると↓にしないといけなかったのかもと今思いました。
fopen("\\\\192.168.0.01\\test\\aa.txt" , "r" );
アクセス権限とかも問題なのかも??
サンプルコードが適当な奴にろくな奴はいない。
>>908 >もしかすると↓にしないといけなかったのかもと今思いました。
>fopen("\\\\192.168.0.01\\test\\aa.txt" , "r" );
是。
>アクセス権限とかも問題なのかも??
是。
CとBASICではどちらが簡単ですか?初心者ですいません。
912 :
デフォルトの名無しさん :2008/09/08(月) 11:39:05
C
C言語じゃないかな ネットワーク系のプログラムぐぐった時に出てくるのがC言語だし
open "com:n81xn" as #1
>>914 なつかしすww
現役で使ってる会社あるんだろうなーw
916 :
デフォルトの名無しさん :2008/09/11(木) 23:46:48
質問です linuxでは、recv関数の第四引数のflagに 0を指定することが多いと思いますが、 0を指定したときと、フラグ(MSG_WAITALL)を 指定した時とで、なにが違うんでしょうか? ていうか0の指定ってのは何を意味するんでしょうか? 0を指定した場合、指定サイズまで取得できないけれど MSG_WAITALLを指定したら指定サイズまで取れたって事があったので、 manとか調べたんですが載ってなかったので ご存知の方は教えてください
受信オプション recvの動作を指定できる ググればそれなりに出てくるけどな
>>916 間違いなくmanに載ってるので調べなおせ
919 :
916 :2008/09/12(金) 05:42:34
何も指定しないのだから、すべてのオプションがオフ
>>919 ヒント1:10進数で1,2,4,8を2進数にしてみると?
ヒント2:ビットと判定
↑はただの馬鹿
924 :
変な質問 :2008/09/16(火) 16:26:53
winsock2.hについてなんですが、 #if !defined(WIN32) && !defined(_WIN64) #include <pshpack4.h> #endif // (略 #if !defined(WIN32) && !defined(_WIN64) #include <poppack.h> #endif となっていて、WIN32が未定義でwinsock2.hを読み込むと、最初のpshpack4.hは 読み込まれますが、途中のOle2.hでWIN32が定義されてしまい、最後のpoppack.hが 読み込まれません。 ということは、winsock2.hを読み込む前にWIN32が定義されてなければならない という認識でよいのでしょうか?
925 :
924 :2008/09/16(火) 16:36:46
新しめのSDKでは_NEED_POPPACKを定義して、ちゃんとpoppack.hが読み込まれるようになってますね
926 :
デフォルトの名無しさん :2008/09/27(土) 10:04:20
xpでDeviceIoControlを使ってデフォルトゲートウェイ を取得する方法を教えてください。 ipconfigを実行するとIO_CTL_TCP_QUERYINFORMATION_EXが 投げられているのがTDImonで確認できたのですが、 具体的な引数の指定等を教えてください。
関数の使い方を1から10まで教えろってか?
サンプルコード探しています VBまたはC#希望ですがなければ他の言語でも構いません @httpリクエストのヘッダ、メッセージを送信する前に確認して 保存したり、リファラやクッキーなど訂正箇所があれば書換えたりしたいです Ahttpからhttpsのページへリダイレクトするときに自動でリダイレクトするか ヘッダ、メッセージを確認してからリダイレクトするかオプションがあれば嬉しいです httpレスポンスはヘッダ、メッセージともに確認保存するサンプルは山のようにあるのですが httpリクエストヘッダ、メッセージを確認、訂正、保存するサンプルは見当たりません 自分がどのようなリクエストを送信しているのか確認しながら勉強したいです どなたか詳しい方お願いいたします
山のようにあるサンプルに訂正する機能を追加すればいいんじゃないの?
tcpdumpとかでIEが吐き出してるリクエストを解析しなさい ただの文字列処理
>>931 さん
ヒントありがとうございます
tcpdump調べてみました
当方OSがWindowsなのでWinDumpというツールがWindows環境でTCPDumpできるようです
参考になりましたありがとうございます
数時間も待てないなんて、どれだけゆとり(ry
WireSharkとか
>>934 あれって出てきた文字列をコピ&ペーストできるんですか?
その位やってみろよw
>>936 できない
何で解答にできないこと答えてるの
やってみれば分かるんだから聞くな、という回答だろ。アホか?
最初からそう書けボケ くだらん解答しか出来ないなら消えろカス
逆切れはよくない お前は素直に愚かさを恥じろ
ごめんなさい httpリクエストを確認(保存、加工)しながら送信できるサンプルコード教えてください お願いします><
942 :
934 :2008/09/28(日) 14:59:39
できるよ。キャプったHTTPリクエスト→右クリック→Follow TCP StreamでStream Contentを 表示して必要に応じて選択→右クリック→Copyとすればいい。
943 :
934 :2008/09/28(日) 15:00:30
ごめん、リロードしてなかったわ。必要なのはプロキシじゃね?
すいません 後出しジャンケンのようで申し訳ないですが プロクシでは駄目なんです 一応httpリクエスト書き換えツール持ってるんですけど 諸事情で自分にあったツール作成を目指すことになりました どなたかhttpリクエストを確認、保存、加工、送信(その後レスポンス受信) サンプルコードお願いします ちょっと難しすぎて困ってます><
まだ情報を隠してるな こんな奴につきあってたら時間の無駄になる
その持ってるツールはソース手に入らんの?
わからないなら黙っててください><
何度もすいませんIEエンジンを利用するのも駄目なんです 自分の送信しようとしているhttpリクエストのヘッダ及びメッセージを確認、加工、保存、送信したいです できればショートカットキーを使ってマクロ組めるようにしたいです ちょっと難しいですか? どなたか詳しい方サンプルコードお願いします
うるせえ消えろ
確認、加工、保存、送信全部やり方わからないって事?
所要がありどうしてもすぐに出かけなければいけません また夜に来ます よろしくお願いします
>>951 そうです
ソースまるごとください^^;
それでは行ってきます
こりゃまた強烈なのが来たな
>>950 ソケットに関するスレだろ
こんなんことくらいで何???
あなたこそ消えたほうがいいよ
あなたには無理。できない。そういってもらえればあきらめもつくでしょ?
早い話が作ってくれって事じゃないの?
作っても難癖つけられて却下されるんだろ?わかります
出先からです
>>960 完全にこちらの要件を満たしてるものを希望します
それ以外はいりません
確認、加工、保存、送信です
たったこれだけです
やれる人だけ返事ください><
すいません、このスレの住人の実力では解決不能です。
963 :
デフォルトの名無しさん :2008/09/28(日) 17:02:17
>>961 金だすならやるよ?
最低500万からだけど
うわっ
また偽者出没!
>>961 は私じゃないです
>>963 以前テラネットというツール試してみたんだけど
IPで接続する仕様なのかな
接続したいサーバは分散型なのでIPでの接続は拒否されました
>>964 私の言ったとおりの物であれば2年前ならキャッシュで購入してたな
今は貧乏どん底
明日にでも首くくろうかって状態^^;
今も某大手本屋さんで見てきたんだけど
リクエストの確認自体殆ど情報が無い
なぜかレスポンスヘッダの参考画面はどの本にも
もういいよってくらい載せてあるのにね
ましてや変更や多重起動で
クライアント@で通信
クライアントAで続き
クライアントBで完了
これを自動でやるほうほうなんて全く無い
唯一クライアントヘッダの参考画面を掲載していた
ハッキング全なんとかって本は2冊とも既に所有しているけど
肝心なところができない
しかもソースはC言語orz
どなたか
クライアントヘッダメッセージを確認、加工、保存のサンプルお願いします
サーバのことばかりでクライアントのことは詳しい解説ってないですね
以前、他スレでメチャクチャでかい口叩いて人のこと糞ボロに言う人は
サーバを理解してない奴はカスみたいなこと言ってたけど
サーバを理解してクライアントの操作は簡単ならなぜサンプルがないんだ?
サーバ作っただけでエライのか?
>>961 は私じゃないけど
その通りです
ノーガキはいりません
解答できる方だけ解答よろしく
>>965 テラネットなんてしらねぇよ
telnetでもつかえって言ってんだよクズ
>>967 だからお前みたいな役にも立たないアドバイスには
期待もしてないので解答者やめろ
答えるなカス
>>967 みたいなのは頭おかしいのか?
出来もしないのにしゃしゃり出てくるのは病気か?
病院池
>>965 簡単に言うと、デバッグ用の確認の機能は開発初期段階に手早く作って破棄されるものだから、
わざわざサンプルとして公開する人も少ないだろうにjk
>>970 自分が不思議なのは「完璧」「パーフェクト」「完全」「超」
とんでもない良本のようなタイトルがいっぱいあるのに
リクエストヘッダ、メッセージの確認サンプルは金床さんの本以外にない
完全とか完璧とかという言葉使わないで欲しいよ
全然完璧じゃないのに
「この1冊ですべてわかる」ってどの本にも書いてある
それなのにレスポンスヘッダの参考画面は掲載していても
リクエストヘッダの確認方法さえも書いていない
日本の解説者は嘘つきばかりで見てて情けない
嘘つくくらいなら本だすな
出す以上はタイトルどおりに全てを羅網してほしいもんだ
とにかく嘘つき解説本ばかり
「クライアントは簡単!」って書いてある本もあった
んじゃリクエストヘッダの確認や加工くらい書けよ
嘘つきのビッグマウスばかりだ
できないなら解説者やめろ
メールだしても返事来たのは2人だけ
1人はヘンテコなメールよこすな
もう1人は古旗先生だ
古旗先生以外はみんな嘘つき
このスレのテンプレに記載されている本も殆ど持ってるか立ち読みしたね サーバ作る人から見れば良本なのだろうけど 目的があってクライアントツール作りたい人間からすれば 何の役にも立たないウンコ本値段だけは高いが全然役に立たない サーバの解説すれば売れるだろうからって計算だけで作成された 中身の無いうすっぺらい内容ばかり クライアント、リクエストヘッダの確認は 解説本を読む以前の問題なのか? その割にはどこのスレやどこの言語サイトで聞いても誰も答えれない サーバ作ってる連中がアホみたいな能書きたれて終わり リクエストヘッダ確認加工のサンプルお願いします
ここに書き込む暇あるなら自分で書けよ
自分が送信しようとしているリクエストを取得できれば後は簡単だろ
>>973 それが出来ればこんなところで解答者を求めたりしません><
役にも立たないアドバイスはいりません
解答者やめろカス
>>974 そのサンプルお願いします
みんなそこまでは言うんですけど
湯ばかりでサンプルないんですよ
>>973 あなたと違って書けないから相談してるんだよ
んであんたは書けるの???
また口先だけなら解答やめてください
はっきし言ってじゃまです
977 :
デフォルトの名無しさん :2008/09/28(日) 20:43:50
ホントこのスレは難癖つけるのクズだけで 役に立つ回答する人はほとんどいないんですね。 期待して損しました。 二度ときません。
なんかよくわからんけど 自分の考え方がわかっているような偽者さん出現してるwww
この感じチャイナだな
解説本を読んで、自分で工夫して目的を達成しようと努力している人の助力にしかなれない。
くだらないことでばっかりスレが伸びるな
次スレでも続けるつもりならトリつけてね。
>>980 その解説本なんだけど
はじめの1歩がわかんない
どーやったらリクエストヘッダを確認できるのか?
全くわかんないので工夫のしようもないってのが現状
あなたリクエストヘッダの確認できますか?
理屈ではなくサンプルください
>>983 まずできてるとこまでのソースを晒してくれ
>>981 くだらなくはないですよ
日本にプログラムの解説本が何千冊とあるでしょうが
リクエストヘッダの確認は解説されていません
サンプルの域を超えていることに気づきましょう。 なにやりたいのか正直わかんないけど
>>984 その手にはのりませんよ
あなた解答しなくていいです
988 :
デフォルトの名無しさん :2008/09/28(日) 20:51:44
>>976 取得した後はネットワークプログラミングとは関係ないだろ。送信以外。
ワロタ
どなたかhttpリクエストのヘッダとメッセージの確認と加工をするサンプルコードお願いします 理屈はいいです 「こうすればできる」とか屁理屈の解答はいりませんのでよろしく
>>988 えっ
>>988 さまはヘッダ確認できるんですか
是非サンプルおねがいします
解説本に騙され続けてフラフラですー
リクエストヘッダを確認、加工を解説している本またはサイトの紹介でもいいです いくら探してもみあたりません よろしくお願いします
993 :
デフォルトの名無しさん :2008/09/28(日) 20:57:49
なんで屁理屈しか言えないカスばっかりなんですか マトモな人はいないの?
>>981 自分の送信するリクエストを取得する方なんか法知らなんからヘッダ確認なんてできん
取得さえできればあとは多分できるけど
サンプルってのはAPIの解説の補助でしかない。それ以上は自分で考えて作るしかない。
もう一度
>>962 を読んで、諦めてお帰りください
次スレよろしく
998 :
デフォルトの名無しさん :2008/09/28(日) 21:01:59
屁理屈だけの奴は出てくるなって言っただろうが
リクエストヘッダ確認ができる人以外は書きこまないでください ウザいです
>>994 >>995 なにそれ
リクエストヘッダは確認できないんですか?
自分がどのようなリファラやクッキー、その他を送信しているのか確認して
訂正したり保存したりしたいです
取得ってわかんないです
どこから取得するの?
Windows???
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。