ネットワークプログラ ..
116:デフォルトの名無しさん
07/09/13 10:33:33
>>111
Windowsはどうなのか知らないが、アドレスをソケットにバインドする際、アドレス構造体を
各インタフェースの関連アドレスとバイナリ比較する実装があるらしい(sin_zeroが0であることを
前提としている)。
プロトコルスタックの内部処理で何か使われているかもしれないし、sockaddr_in全体を最初に0で
初期化して使えば問題ないんじゃないのかなあ。
まあ、>>115の言っている「肝心な所」が何なのか、ちょっと気になるけどね。
俺も役立たずかもしれないな〜。つーか、教えてくれたって良いじゃない。
117:デフォルトの名無しさん
07/09/13 10:42:18
やっぱりそうですね。
そんなわけで0にしようと思いましたが失敗しています。
8バイトほど0を入れたいのですが実行時エラーです。
大文字なのが原因かもしれません。
SOCKADDR_IN sa;
memcpy(sa.sin_zero, 0, sizeof(sa.sin_zero));
118:デフォルトの名無しさん
07/09/13 10:57:01
>>117
memcpyはないだろう
119:デフォルトの名無しさん
07/09/13 11:22:54
FARとか付いたりしてるからmemcopy()が使えないってことかな?
120:デフォルトの名無しさん
07/09/13 11:30:16
memcpyがどういう関数か調べろよー
ってか、forループで書けば上手くいくはずだから、
memcpyを使うこと自体が間違いって気づきそうなものだけどな
121:デフォルトの名無しさん
07/09/13 11:32:55
memsetだろうなw
122:デフォルトの名無しさん
07/09/13 11:34:48
>>116みたいな懸念があるなら、
(そういうのは狂っていると思うが)
sockaddr_in全体を0 fillしとかないと駄目だろ。
123:デフォルトの名無しさん
07/09/13 11:34:50
memsetだ。オマイラえらいなー。
124:デフォルトの名無しさん
07/09/13 12:05:37
PF_INETって古すぎる情報?Linuxのこと?
URLリンク(72.14.235.104)
125:デフォルトの名無しさん
07/09/13 13:01:47
socketを作る時のtype指定に使うのがPF_*。
sockaddrはAF_*の方。
126:デフォルトの名無しさん
07/09/13 13:11:47
>>125
でもさ、「なんかもうそのへんどうでもいいよ」って
socket関連のAPIの仕様書に書いてあるんだよね
127:デフォルトの名無しさん
07/09/13 14:12:34
どうでもいいってことはAとPを間違って書いても値が同じになるような
値が定義されているってことかな?
128:デフォルトの名無しさん
07/09/13 14:20:09
>>127
間違えそうなところはちゃんと同じ値になってる。
129:デフォルトの名無しさん
07/09/13 14:32:54
それならよし
130:デフォルトの名無しさん
07/09/15 00:02:24
オンラインの格闘ゲームを作りたいのですが、ローカルで通信のテストを
してみたところ、1秒間に40バイトのデータを17回程度しか
やりとりが出来ません。
pingだと1ms程度でるので、もっと通信の頻度が高くても良いと思うの
ですが、大体こんな程度なのでしょうか?
通信にはDirectPlayを使っています。転送処理の行はこんな感じです。
(WinSockだと早くなったりするのでしょうか?)
HRESULT hr = Get_DPlay()->SendTo( this->dpnid, &dpnbuffer,
1,
60000,//タイムアウトまでの時間
NULL,NULL,DPNSEND_SYNC );
131:デフォルトの名無しさん
07/09/15 00:24:28
nagleかな
132:デフォルトの名無しさん
07/09/15 01:29:28
なんとか解決できたみたいです。
作成したスレッドにてSendTo関数を実行していたのですが、スレッドの
優先度をあげてみたところ、1秒間に240回程度の速度が出るように
なりました。
アドバイスありがとうございました。
133:デフォルトの名無しさん
07/09/15 14:23:37
TCPだと、sendしてもすぐには送信されずに
まとめて送れるモノが無いかどうか少し待つ
実装が多いよね。優先度低いと町が長くなる
134:デフォルトの名無しさん
07/09/17 02:34:38
bsdのzero_copyって
なんでlinuxにないの?
つーかこれじゃ何もできねーよw
135:デフォルトの名無しさん
07/09/17 08:54:45
> 何もできねー
ほう
136:デフォルトの名無しさん
07/09/17 09:08:43
RDMA
137:デフォルトの名無しさん
07/09/17 11:06:58
RDMAなんていらねーよw
マシン2台間での関係でそんなでかい
もん使うなんてあほだ
zero_copyあればいいのに
Linuxは糞だな
138:デフォルトの名無しさん
07/09/17 12:34:28
条件小出し方式ですな
139:デフォルトの名無しさん
07/09/17 13:08:01
はいはい。愚痴はいいからさっさと作れよ
納期過ぎてんだから。
140:デフォルトの名無しさん
07/09/17 13:15:54
boostにネットワークライブラリってありますか?
141:デフォルトの名無しさん
07/09/17 15:55:05
なぁなぁ頼むよ
zero-copyする方法教えてくれよ
142:デフォルトの名無しさん
07/09/17 16:44:05
>>140
1.35よりboost::asioというのが使えるようになったらしいです。
143:デフォルトの名無しさん
07/09/17 16:49:42
お前ら粘着するぞゴラ
アボーンできねぇから迷惑きわまりねぇぞ
速く教えろよコラ
144:デフォルトの名無しさん
07/09/17 16:52:20
>>142
ありがとうございます
早速試してみます
145:デフォルトの名無しさん
07/09/17 17:19:00
URLリンク(ml.tietew.jp)
146:デフォルトの名無しさん
07/09/17 22:58:11
>>143
こういうノリ久々にみた。個人的に好き。
やっぱり2chはおまいみたいなのがいないとつまらんよね、まぢで。
147:デフォルトの名無しさん
07/09/17 23:36:40
なにをするために、zerocopyにしたいの?
148:デフォルトの名無しさん
07/09/22 01:32:33
いなくなっちゃったね。
zerocopyくん。
149:デフォルトの名無しさん
07/09/22 11:00:41
linux板でもみたけど、
スレリンク(linux板:820番)
150:マルチポストですみません
07/09/22 18:32:04
以下コピペ
現在、Windowsソケットプログラム(winsock1.1)により、P2Pでの非同期のTCP通信プログラムを組んでます。
そこで、クライアントからサーバーへの同時接続のチェックをするために以下のような処理を行っています。
#関係ありそうな情報のみ載せます。足りなければご質問下さい。
OSはWindowsXP HomeEditionです。
なお、OSによる同時接続制限はBiotというツールにより20000というふうに設定しております。
・クライアント
1.ソケット3000個用意
2.for文ループ処理によりソケット数分Connectを実行
・サーバー
1.listenの同時接続最大数は20000に設定
毎回Connect実行時、大体2000回目辺りからエラーが出てきます。
その後、イベントが返って来た時のエラーチェックでも、WSAECONNREFUSED(10061)で「サーバーにより接続が拒否された。」というエラーが検出されます。
結局、接続成功は500〜700回ぐらいでした。
この現象に対する対処法や解決法はないでしょうか?
現状では、全てのConnect要求を成功できるようにしたいと思っております。
子プロセスを作成するような方法は時間が無いので考えておりません。
9/18にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。
以上、よろしくお願い致します。
URLリンク(oshiete1.goo.ne.jp)
こんな状態です。どなたかわかる方はいませんでしょうか?
151:デフォルトの名無しさん
07/09/22 20:11:59
サーバ側の accept を回す処理が追いつかなくてバックログがあふれたとか?
listen をいくら大きくしても、あれただのヒントだった気がするが・・・
152:150
07/09/22 20:15:40
>>151
って事は、いくらOSのほうを対応しても、listenではじかれてしまうんですか。
SOMAXCONNを指定すれば対応できたりしますかね?
153:デフォルトの名無しさん
07/09/22 20:29:08
そのくらい、すぐ試してみれば?
あとは、余計な処理を一切省いたacceptだけのループでなら接続できるのかどうかを実験してみるとか・・・例えば
while(true){
accept(fd);
}
みたいな。 あるいは、accept するスレッドを複数立ち上げてみるとか。
それで無理なら無理っぽいな。
OS 変更も検討してみるべきかもね。
154:150
07/09/22 21:24:40
>>153
はい。ちょい試してきます。
155:150
07/09/22 22:30:36
>>153
SOMAXCONNを指定したら、逆に成功確率はかなり減りました。170回くらいでした。
ところで、サーバーの動作は非同期通信なので、ループ処理は無理でした。
あと、スレッドは立て方がわかりませんのでなんとも・・・。
forkはUNIXだし、その前に使えないし・・・。
無知ですみません;
156:デフォルトの名無しさん
07/09/22 23:05:25
非同期なら、accept完了がわかった時点ですぐ閉じてみたら?
スレッドは、beginthreadex。
157:デフォルトの名無しさん
07/09/22 23:06:23
非同期って WSAAsyncSelect のやつかな
シングルスレッドサーバだと他のソケットを read したり write したり
データを処理したり色々構ってやってる間は当然 accept を呼べないから、
処理に時間がかかってるようなら、やっぱりその間に接続要求がたまりすぎて溢れるんじゃないかと
158:デフォルトの名無しさん
07/09/23 00:09:17
Winsock1.1+WSAAsyncSelectでハイパフォーマンスなサーバを書こうとするのも
アレだが
XP Home Editionというのも終わってるだろ。
何が悲しくてクライアント用のOSで1000のオーダーの同時接続数をさばかにゃ
ならんのだ。
せめて2003サーバに汁。
ハードもそれなりにおごれや。
で、使うべきはIOCPな。
WSAAccept()をポストし続けるスレッドも専用で回せ。
159:150
07/09/25 02:08:20
>>156
とりあえず、やってみます。beginthreadexは調べておきます。
>>157
その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、
listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。
listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて
わからない状態です。
>>158
サーバーはまぁ、色々と事情が…;
でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは
OS以外のことだと思うんです。
私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして
使用した際に何か違いってあるんでしょうか?
160:デフォルトの名無しさん
07/09/25 02:15:11
>>159
そう思うなら、Linux入れて同じハードでほぼ等価の
コード作ってためせ
たぶんおきねーからw
161:デフォルトの名無しさん
07/09/25 03:29:59
>>159
XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。
1,環境が良く分からない。サーバーはマルチプロセッサマシンなの?
2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?
162:デフォルトの名無しさん
07/09/25 06:32:30
>>159
最小限のソース晒してくれ
時間の無駄だ
163:デフォルトの名無しさん
07/09/26 09:14:56
無線LANに接続しているPCの数を取得するにはどうすればよいのでしょう?
164:デフォルトの名無しさん
07/09/26 10:12:09
>>150
acceptの処理時間とか無関係。
サーバのOSでTIME_WAITでポートが枯渇してるだけ。
TIME_WAITについて深くしりたけりゃぐぐれ。
めんどくさけりゃSO_REUSEADDR。
165:デフォルトの名無しさん
07/09/26 10:15:56
>>163
a. 無線LANのWebからステータスを得る
b. SNMP,MIBでぐぐーる
166:デフォルトの名無しさん
07/09/26 11:33:20
サーバ側のポートが枯渇するの?
サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
167:デフォルトの名無しさん
07/09/26 11:43:38
ちゃんとした通信手順を踏めば即座にポートを解放してくれる
行儀の悪い通信をすると TIME_OUT まで待ってから解放される
TCP/IP の仕様だから Linux でも Windows でも同じコードなら
やっぱり通信数に制限が出るような気がする
168:デフォルトの名無しさん
07/09/26 11:53:21
>>164
> ポートが枯渇してるだけ。
馬鹿丸出し。
169:デフォルトの名無しさん
07/09/26 11:59:52
SO_REUSEADDRは再びbindするときの話だっけ。
>>150とは関係なさそうだな。
170:デフォルトの名無しさん
07/09/26 13:16:22
acceptを終了するにはどうしたらいいの?
acceptで待機中の時に別スレッドからsocketcloseを呼び出したら
WSAEINTR (10004)
? 意味 : 関数呼び出しに割り込みがありました。
? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。
が呼ばれるんだけど、acceptの終了方法はこれであってるの?
winsocket2.2
171:デフォルトの名無しさん
07/09/26 13:36:14
>>170
WinsockならそれでOKのはず
172:デフォルトの名無しさん
07/09/26 14:01:34
>>171
そうなんだ
ありがとう〜
173:デフォルトの名無しさん
07/09/26 15:53:48
>>166
>サーバ側のポートが枯渇するの?
>サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
その通り、枯渇するのはクライアント側のポートだった。
↓あたり。
URLリンク(www.softlab.ece.ntua.gr)
URLリンク(mikilab.doshisha.ac.jp)
URLリンク(d.hatena.ne.jp)
ま、結論としてはSO_REUSEADDR。
174:デフォルトの名無しさん
07/09/26 16:42:19
ということはconnect内部のbindで失敗するとWSAECONNREFUSEDが返ってきちゃうのか。
原因に気づき辛そうで厄介だなあ。
175:デフォルトの名無しさん
07/09/26 20:06:08
>>173
クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
176:デフォルトの名無しさん
07/09/27 00:13:10
おまえら, なんかトラブったときに TCP のステートダイアグラム
見ないでプログラム修正とかしてるのか?
177:150
07/09/27 10:53:38
一向に解決しなかったけど、今の状態で妥協する形になりました。
助言くれたかたサンクスです。
>>176
TCP のステートダイアグラム
とは?
178:デフォルトの名無しさん
07/09/27 11:12:53
URLリンク(www5d.biglobe.ne.jp)
Figure 6. TCP Connection State Diagram
179:デフォルトの名無しさん
07/09/28 00:06:29
URLリンク(tools.ietf.org)
か、あるいは簡略化されているが↓のも見やすいよ
URLリンク(www.atmarkit.co.jp)
180:デフォルトの名無しさん
07/09/28 08:29:23
>>179
> 簡略化されているが
あかんやん
181:デフォルトの名無しさん
07/09/30 07:42:09
複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを
オープンしたいのですが、方法はありますか?
Windows XP SP2
182:デフォルトの名無しさん
07/09/30 08:21:40
bind
183:デフォルトの名無しさん
07/09/30 10:03:51
すいませんclient側の話なんです。
bindってサーバ側ですよね。
NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
を指定して通信させたいのです。
184:デフォルトの名無しさん
07/09/30 10:07:03
特定のNICのIPアドレスを使ってconnectしたいという事ですね。
185:デフォルトの名無しさん
07/09/30 10:40:39
>NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
>を指定して通信させたいのです。
それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は
全部bind。
186:デフォルトの名無しさん
07/09/30 10:41:32
>>183は思い込み激しす
187:デフォルトの名無しさん
07/09/30 10:47:51
初学者は誰だって勘違いすることがある。
めげずにがんばれ。
188:デフォルトの名無しさん
07/09/30 10:52:24
才能内から真だ
ほうがいいと思うけどね
こんなのもしマジでプロジェクトに
混じってたらすげーこえーしw
189:デフォルトの名無しさん
07/09/30 10:59:37
>>188
あんたの部下は死にまくりだな
190:デフォルトの名無しさん
07/09/30 11:24:52
bindできました!
191:デフォルトの名無しさん
07/09/30 16:05:22
ム板でプロジェクトうんぬん云ってるDQNはマ板に逝け
192:デフォルトの名無しさん
07/09/30 18:36:43
>>188
お前の部下になりたくない。
193:デフォルトの名無しさん
07/10/01 02:24:15
>>1のFAQが404のためweb archiveのキャッシュのアドレスを張り。
リンク先を開くときはエンコード種類としてISO-2022-JPを選択する。
URLリンク(web.archive.org)
URLリンク(web.archive.org)
194:デフォルトの名無しさん
07/10/01 23:26:27
質問があるのですが、友達の家から私の家まで通信実験を行いたいと思っています。
家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。
どういった方法があるのでしょうか。質問よろしくお願いします。
195:デフォルトの名無しさん
07/10/01 23:41:12
お使いのプロバイダに訊け
196:デフォルトの名無しさん
07/10/02 00:12:02
使ってるプロバイダとかあなたの家や友達の家のネットワーク構成によるけれど、
自宅までグローバルIPが割り当てられてる可能性は高いと思う
家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう
たぶんルータを挟んでるんじゃないかね
ルータにはグローバルIPが割り当てられてるかもしれんよ
ルータの設定画面かなんかで確認してみ
197:デフォルトの名無しさん
07/10/02 00:32:22
>>195-196
意地悪だなぁ。ちゃんと質問してやれよ。
198:デフォルトの名無しさん
07/10/02 00:35:47
>>194
板違い
199:デフォルトの名無しさん
07/10/02 00:39:06
>>194
実験ならば どこかのCGIを読むようにするのが一番楽だよ
ちなみにどんな実験? 速度の検証とか?
接続確認のテストならばテストになってないが??
200:デフォルトの名無しさん
07/10/02 00:46:01
ちょいと教えて
接続するクライアントソケットは
データーの種類によって分けた方が良い?
たとえば データーと制御データーがあった場合
1) ポートも分ける
2) ポートは同一だけどソケットを別にする
(受信・送信バッファを個別に取られる事を期待)
3) ポートもソケットも同一で2つのデーターをプロトコルで分ける
(ソケット別にしても内部的には同じ信号で扱われるから 1,2は
効果なし)
201:デフォルトの名無しさん
07/10/02 00:51:31
あと関連して もう1つごめん
2つのデーターは
A,Bの2つのデーターが有った場合
1)大きなデーターAをそのまま送ると Bのデーターは
Aが処理されるので MTUを参考に分割してBのデーターを
混ぜて送る
2)極端な例で無い限りオーバーヘッドが大きくなるので
気にしない
これはケースバイケースですが考え方としては?
202:デフォルトの名無しさん
07/10/02 00:53:47
ごめん タイプミス
1)大きなデーターAをそのまま送ると Bのデーターは
Aが処理されるので MTUを参考に分割してBのデーターを
混ぜて送る
↓
1)・・ Bのデーターは Aが処理されるまで待たされるので・・
203:デフォルトの名無しさん
07/10/02 00:54:04
理学部ktkr
まず目的を書け。
それと質問を推敲しろ。
204:200
07/10/02 01:15:38
ごめん分りにくかったね
通信の効率化をしたいわけなんだけど
早い話
内容の違うデーターを そのまま送受信するか
ある程度切って送るかです
たしか内部的には以下の処理を行っているはずですので
なにも考えずに送っても ある程度は効率化しているはずですが
みなさんはどうしてます?
■小さいデーターは優先されて送信する(ルーター依存?)
■送信データーはMTU値に切断され送信される
205:デフォルトの名無しさん
07/10/02 01:23:15
実際に効率上の問題に直面してから考えればいいと思われ
206:デフォルトの名無しさん
07/10/02 01:26:30
>>204
> ■小さいデーターは優先されて送信する(ルーター依存?)
どこの星の話ですか?
207:デフォルトの名無しさん
07/10/02 01:27:30
まずはタイミングの門をくぐって
セキュリティ地獄に逝くのじゃ。
208:デフォルトの名無しさん
07/10/02 01:27:18
>>204
0x20以上で構成してSTXとETXではさむ。
209:200
07/10/02 01:36:26
>>205まあ実際はそうなんだけど・・・・
正直 通信よりもアプリの見直しの方が効果あるだろうし
ちょっと例を書いてみます
データーA
WM_MOUSEMOVEからのデーターを送信する
8Byte程度のデーターを1秒間に100個ほど送る
(内部的に遅延されるので実際は2K程度)
リアルタイム性重視
データーB
1秒間に1度画面をキャプチャーして送る
1027 X 768 X 3バイト
この場合はどうする?
当然 差分を送るとか根本的な事は無しで
1)Socketを分ける・分けない ← 私的には意味無いと思ってる
2)データーをMTU毎(または適当なサイズ)に切って
A,Bを混ぜて送信
210:200
07/10/02 01:39:03
>>206どこかで読んだ事あるんだけど
どこの星の話かは忘れた
Yahoo,OCNとかだと IPフォンのパケットは優先されてる
らしいから それと勘違いかな?
211:デフォルトの名無しさん
07/10/02 01:59:17
>>193
復活してるみたい。
212:デフォルトの名無しさん
07/10/02 02:16:57
>>210
そりゃQoSだな。
213:デフォルトの名無しさん
07/10/02 09:20:09
>>209
なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない
そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い
ところで、それなんてスパイウェア?
214:デフォルトの名無しさん
07/10/02 10:34:05
新手のwinny用黴菌つくってんのかも
215:デフォルトの名無しさん
07/10/02 11:05:45
劣化VNC
216:200
07/10/02 12:02:31
>>213
だからあくまでも例だって・・・・
そもそも通信効率以前の問題だし
劣化 VNC画面・マウスの送る方向違うし
>>212 にあるような仕組みを自前で実装してるのか
聞きたかった
217:デフォルトの名無しさん
07/10/02 12:13:16
>>216 失せろ厨房
218:デフォルトの名無しさん
07/10/02 12:50:02
>>216
やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。
後は、多重化を自前でやるかTCP/IPスタックにやらせるか。
>1)Socketを分ける・分けない ← 私的には意味無いと思ってる
意味無くない。
>2)データーをMTU毎(または適当なサイズ)に切って
> A,Bを混ぜて送信
この程度でMTUなんか無関係。
小賢しいこと考える前に手を動かせ。
他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。
219:デフォルトの名無しさん
07/10/02 13:21:23
VNCやRDPを調べればいい。
220:デフォルトの名無しさん
07/10/02 23:30:42
>>216
簡単に高速かする方法あるよ?
FPGAで作ればいいんだよw
221:デフォルトの名無しさん
07/10/03 00:26:23
鯖よりボードの方が高いw
222:デフォルトの名無しさん
07/10/03 03:58:44
> (内部的に遅延されるので実際は2K程度)
よくわからんけど Nagle を止めれば済む話?
223:デフォルトの名無しさん
07/10/03 12:18:04
その手の通信ってトンネリンングさせるかも知らんし、
生パケットがどう飛ぶかなんて議論は意味ない気がする。
画面データはアイドル状態待ってから飛ばせばいいし、
移動系メッセージなら100命令飛ばすんじゃなくて
1命令にまとめる事でも考えた方が。
pcAnywhereは反応重かったな。
224:デフォルトの名無しさん
07/10/03 19:44:50
ネットワークプログラミング初学者です。
サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、
通信実験のデバッグを簡単に行える方法ないですか?
今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。
といった面倒なデバッグ方法です。><
よろしくお願いします。
225:デフォルトの名無しさん
07/10/03 19:47:49
両方ともメインPCで動かす
226:デフォルトの名無しさん
07/10/03 21:23:41
VMware/VirtualPC/Paralles/VirtualBoxで仮想PCを用意する。
227:デフォルトの名無しさん
07/10/03 21:32:58
ネットワーク上繋がってるPCなのにUSBメモリでコピーって意味わからん
228:デフォルトの名無しさん
07/10/04 13:46:58
ネットワークの共有も知らんでネットワークプログラミングとか大丈夫?
229:デフォルトの名無しさん
07/10/04 16:55:35
C#.NETでストリーミングデータの受信のプログラムを
作成しているのですが、Socket.Selectが思った通りに動作していません…
ストリーミングのデータ形式は
ヘッダ2バイト
サイズ2バイト
以下データ
このような形式なのですが、受信をしていくうちに、サーバー側の
送信に追いついてしまい、サイズ2バイトで指定されたデータが
読めない状態になってます
Socket.Select( SocketList. null, null, 100 );
でリードできることは確認しているのですが、
sock.Receiveでデータの部分が数バイトしか読めない状態です
ソケットはブロッキングで別スレッドで読み込みをしています
PerlやWinsockのSelectとは動作が違うのでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします
230:デフォルトの名無しさん
07/10/04 17:05:16
>>229
selectはあくまで「データがあるかどうか」を調べるだけ。
何バイトあるかなんて知らん。
・データがあれば読み込んでローカルのバッファに溜める
・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始
を独立に行えばいい。
複数データが一度にreadできてしまうこともちゃんと考えとけよ。
231:デフォルトの名無しさん
07/10/04 17:12:55
>>229
ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。
232:デフォルトの名無しさん
07/10/04 20:39:37
>>230 >>231
ありがとうございました。そのように実装したいと思います
233:デフォルトの名無しさん
07/10/04 23:26:47
すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、
TELNETを使用しHTTPの勉強をしております
Yahooファイナンスから企業の情報を集めたいと思っています。
URLリンク(charge.quote.yahoo.co.jp) の情報を見たいとき
telnet charge.quote.yahoo.co.jp 80
Trying 124.83.147.185...
Connected to charge.quote.yahoo.co.jp.
Escape character is '^]'.
GET /q?s=1301&d=t
The document has moved <A HREF="URLリンク(quote.yahoo.co.jp)
<P>Additionally, a 302 Found
error was encountered while trying to use an ErrorDocument to handle the request.
となってしまい情報を見ることができないでいます
302なので/q?s=1301&d=t ←ここではないほかのURLに情報がありそうなのですが
URLリンク(charge.quote.yahoo.co.jp) の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか
234:デフォルトの名無しさん
07/10/04 23:41:13
>>233
URLリンク(quote.yahoo.co.jp)
レスポンスに書いてるじゃん。
このドキュメントはURLリンク(quote)〜〜にうつってますよ、って。
235:デフォルトの名無しさん
07/10/05 00:07:57
>>234
ありがとうございます
恥ずかしい、、、、、申し訳ないです
236:デフォルトの名無しさん
07/10/05 01:19:53
てゆーかさ、GETをHTTP/0.9でやってるから
レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。
237:デフォルトの名無しさん
07/10/05 23:31:07
FORMのPOSTをGETでアクセスできない事があるんですが?
238:デフォルトの名無しさん
07/10/06 00:15:33
そうですか。
239:デフォルトの名無しさん
07/10/06 02:43:09
URLリンク(www.premiumtv.12gbfree.com)
240:デフォルトの名無しさん
07/10/07 00:22:02
ノンブロックなソケットディスクリプタでサーバにコネクトするときに
そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?
241:240
07/10/07 00:23:57
ミーがユーズしてるOSはLinuxです
242:デフォルトの名無しさん
07/10/07 00:24:10
たしかselectで書き込み可能が帰ってきたらコネクト完了
243:240
07/10/07 00:27:21
>>242
ハリーなアンサー サンキューです。
バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。
244:デフォルトの名無しさん
07/10/07 06:18:17
getpeername(2)がENOTCONを返さなくなった時がcomplete
245:デフォルトの名無しさん
07/10/07 06:46:13
write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって
非同期モードですか?
環境はWindows 2000 XPです。
246:デフォルトの名無しさん
07/10/07 06:52:08
というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。
「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。
247:デフォルトの名無しさん
07/10/07 07:20:42
>>246
接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。
248:デフォルトの名無しさん
07/10/07 08:49:42
納得いきました。
ありがとうございます。
249:デフォルトの名無しさん
07/10/07 16:39:49
lingerがよくわからないんだけど
今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。
そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする
と言うのであってるんですかね?
250:デフォルトの名無しさん
07/10/07 17:43:11
タイムアウトが起きると送信放棄。shutdownのabortが起きる。
その他はまあそういうこと。
MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure
251:デフォルトの名無しさん
07/10/12 16:12:26
日本信号の改札機はなぜ起動しなかったのでしょうか?
252:デフォルトの名無しさん
07/10/12 17:48:09
スレ違いだったらすみません。
DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。
ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。
RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。
動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。
253:デフォルトの名無しさん
07/10/12 18:15:36
動画ファイルの種類に寄る。
動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。
254:デフォルトの名無しさん
07/10/13 14:05:15
>>252
ファイル出力が完了しなくても再生をはじめれば?
255:デフォルトの名無しさん
07/10/14 22:58:38
YahooファイナンスってKeep-Alive使えないんですかね
毎回接続し直すの面倒なんですけど…
256:デフォルトの名無しさん
07/10/15 06:32:25
ぇ
257:デフォルトの名無しさん
07/10/19 09:02:36
TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。
非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。
ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ
ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、
while(ファイル読み込みが終わるまで){
send()
}
だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m
258:デフォルトの名無しさん
07/10/19 09:23:05
>>257
WOULDBLOCKならあとで続きを送信する
259:デフォルトの名無しさん
07/10/20 00:07:00
>>257
sendも非同期ですべてやればOK。
自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在
何バイト送ったのか全部管理しる。
260:デフォルトの名無しさん
07/10/20 00:09:54
Linuxネットワークプログラミングを勉強したいのですけど、このページの下で紹介されている本でいいのでしょうか。
URLリンク(www.geekpage.jp)
もっといい本があったら紹介していただけないでしょうか
261:デフォルトの名無しさん
07/10/20 04:31:18
>>258-259
えっと、同期ならこんな感じの送信です。
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
send(sock, sendbuf, read_byte, 0);
memset(sendbuf, NULL, sizeof(sendbuf));
}
WOULDBLOCKなら後で続きを送信するというのはこういう事でしょうか?
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
while( WSAGetLastError()==WOULDBLOCK ){
send(sock, sendbuf, read_byte, 0);
}
}
memset(sendbuf, NULL, sizeof(sendbuf));
}
あまり非同期っぽい書き方じゃないですが・・・。>>259さんのはちょっと理解が出来ないです。
send待ちとはどういう状況の事を言うのでしょうか?
262:デフォルトの名無しさん
07/10/20 05:32:52
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます
言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。
263:デフォルトの名無しさん
07/10/20 08:34:53
>>261
同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。
264:デフォルトの名無しさん
07/10/20 08:47:52
>>263
てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか?
// 送信可能フラグをたてる
case FD_WRITE:
send_flag = TRUE;
return 0;
// ファイル送信スレッド
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
send_flag = FALSE;
if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
while( WSAGetLastError()==WOULDBLOCK ){
while( send_flag == FALSE ) Sleep(100);
send(sock, sendbuf, read_byte, 0);
}
}
memset(sendbuf, NULL, sizeof(sendbuf));
}
こんな感じでいいのかな・・・?
265:デフォルトの名無しさん
07/10/20 08:59:55
>>264
何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。
WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
URLリンク(www.amazon.co.jp)
猫でもわかるネットワークプログラミング 第2版
URLリンク(www.amazon.co.jp)
266:デフォルトの名無しさん
07/10/20 09:03:16
>>264
それじゃ、下のwhileループ群が同期になってしまうよー
慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。
>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。
267:デフォルトの名無しさん
07/10/20 09:47:26
e1000の改造について詳しいドキュメントちょうだい
268:デフォルトの名無しさん
07/10/20 09:56:35
>>265
ん〜書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。
>>266
色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。
FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
キューを実装するということは、こういう感じで実装するということですかね・・・
while( fread(buf) ){
push(buf);
}
PostMessage(,,FD_WRITE,);
FD_WRITE:
if( キューにメッセージがあれば ){
sendbuf = pup();
send(sock, sendbuf, sizeof(sendbuf), 0);
}
return 0;
269:デフォルトの名無しさん
07/10/20 09:57:20
pushとかpopとかこれじゃスタックっぽいですね。
脳内でキューに変換してくださいm(_ _)m
270:デフォルトの名無しさん
07/10/20 10:04:25
>>268
FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。
サンプルもネットに転がってるはずだから調べよう。
271:260
07/10/20 10:15:22
>>262
情報ありがとうございました。探してみます
272:デフォルトの名無しさん
07/10/20 13:36:48
>>262
横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。
273:デフォルトの名無しさん
07/10/20 13:57:44
>>268
>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。
ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。
あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。
274:デフォルトの名無しさん
07/10/20 14:52:02
なぜそんなに面倒なんですか
バカみたいですね
275:デフォルトの名無しさん
07/10/20 15:04:36
なぜって、非同期だからさ
バカみたいだろ?
おとなしく同期ソケット使っとけ
276:デフォルトの名無しさん
07/10/20 15:29:06
>>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。
277:デフォルトの名無しさん
07/10/20 17:12:58
サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?
278:デフォルトの名無しさん
07/10/20 18:08:48
すいません。
初心者のくだらない質問を受けてください。
javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?
つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?
それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?
またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?
何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。
279:デフォルトの名無しさん
07/10/20 18:13:07
>>278
WebProg板へいってこい
280:デフォルトの名無しさん
07/10/20 18:30:30
>>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい
281:デフォルトの名無しさん
07/10/20 18:50:18
>>280
ありがとうございました。
そういうことでしたか。
282:デフォルトの名無しさん
07/10/21 22:56:16
サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。
この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?
283:デフォルトの名無しさん
07/10/22 01:01:25
信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな
データが改ざんされてないか調べるならハッシュ関数つかうけどな
284:デフォルトの名無しさん
07/10/23 10:49:11
winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど
int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど
複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの?
例えば10レコードのデータを送信する時など
ループで10回実行するか、1回だけ実行するかで効率が変わるのかな?
OSが勝手に送信バッファをいい具合に設定してくれる?
言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く
285:デフォルトの名無しさん
07/10/23 11:34:53
>>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。
そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。
286:デフォルトの名無しさん
07/10/23 20:54:22
0バイトのデータをsendする方法はありますか?
287:デフォルトの名無しさん
07/10/23 22:32:07
0バイトのデータをsendすることに何の意味が?
288:デフォルトの名無しさん
07/10/23 22:32:57
ping代わり?
289:デフォルトの名無しさん
07/10/23 23:16:08
connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認
したいの・・・
290:デフォルトの名無しさん
07/10/24 02:31:33
0byte送って確認するのか。
斬新なアイディアだ。
291:デフォルトの名無しさん
07/10/24 03:19:40
いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。
292:デフォルトの名無しさん
07/10/24 03:51:28
>>289
connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?
>>290
tcp keepalive
293:デフォルトの名無しさん
07/10/24 05:02:20
>>292
write可能であっても成功したとは限らないの・・・
294:デフォルトの名無しさん
07/10/24 08:58:35
>>293
connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?
295:デフォルトの名無しさん
07/10/24 09:48:51
そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?
296:デフォルトの名無しさん
07/10/24 09:52:08
そんなことは聞く前にソケットFAQ読め。
297:292
07/10/24 10:14:48
>>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。
298:デフォルトの名無しさん
07/10/24 10:59:21
FAQくらい理解してから、人にアドバイスしよう。
URLリンク(www.kt.rim.or.jp)
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?
299:デフォルトの名無しさん
07/10/24 11:05:01
>>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。
300:デフォルトの名無しさん
07/10/25 00:56:29
サーバー用のソケットは
socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません
listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます
listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?
301:デフォルトの名無しさん
07/10/25 06:54:40
ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4335日前に更新/263 KB
担当:undef