2 :
デフォルトの名無しさん:04/01/08 20:11
3 :
デフォルトの名無しさん:04/01/08 20:12
4 :
デフォルトの名無しさん:04/01/08 20:13
乙。フフフフフっ。
いやー。まだ笑える。俺のつぼにはまったよ。
>>1 (;゚Д゚)ノ '\0'終端忘れてますよ乙!
略してネトプ
9 :
デフォルトの名無しさん:04/01/08 23:56
ちょっとしたファイル転送が出来るチャットプログラムを組もうと思ってるんですが
TCPよりUDPのほうが高速に転送出来ると聞きました。
自前でのエラー処理を含めてもUDPが優位になるほど高速なのでしょうか?
熱湯プレイ
11 :
デフォルトの名無しさん:04/01/09 00:41
便乗して質問させてください。
UDPの信頼性が保障されてないと言うのは
化けたパケットの破棄だと聞きましたが
それは、間違ったデータは破棄されるので送られない と言う事なのでしょうか?
>>11 化けるより、パケット自体が届かない、フラグメント化した断片が届かない、とかの方が多いかも。
完全なUDPパケットに組み立てられない場合、アプリケーションには届かず、消えてしまう。
>>9 おとなしく、TCPにしておいた方がいいと思います。
チャットプログラム程度で、TCPプロトコルスタックがやっているような
輻輳・再送制御を自前やるって、つらくないですか?
逆に、その辺を手抜きすると、間違いなくTCPより、遅くなる(or信頼性がなくなる)ような。
(たとえば、ftp(TCP)とtftp(UDP)とどちらが速いと思ってます?)
届く順序とか届いたり届かなかったりとかだからねー
オレはそれでもいい、音声や動画など多少データ欠けてもヨシって
ときしかUDPは使わないなあ。
ヘッダと連番はつけるけど。
暇があるんならまずはTCP版をきっちり作って
次にUDP版に移植するのに七転八倒してみるのがいいかもね。
なるほど・・・
UDPをそこまでして使うメリットは少ないんですね。
17 :
デフォルトの名無しさん:04/01/09 20:25
FAQ嫁
20 :
デフォルトの名無しさん:04/01/09 23:26
うちは2000人規模のチャットサーバーやってるけど
ユーザーのIPの問い合わせに対して返すだけのシステムだからUDP使ってる。
DNSもUDPだしね。
こういう用途だとUDPでも良いんじゃないかな。
質問があります。
メーラをつくり始めているのですが、SMTPサーバとの接続がうまくいきません。
Etherealにてパケットを覗いてみたのですがTCPのコネクションが確立した後の
サーバの応答(220 ***.smtp.server.name.com)に[TCP Zerowindow] [TCP Dup ACK 44#1]
という応答を行っていて、ここで通信が終わっているようです。
この[TCP Zerowindow]はどういう場合に送られるのでしょうか?
>> 22
過去スレにありましたね
申し訳ないです↓
勉強が足りませんね…
前スレはあのまま放置か?
25 :
デフォルトの名無しさん:04/01/11 15:17
だいたい1万くらいのコネクション数があるサーバーのプログラムなんですが
これくらいの数だと、コネクション毎にスレッド起こすようなプログラムだとまずいんですかね?
処理内容は、クライアントからの要請でデータを返す、データ参照するようなサーバーなのですが・・・
26 :
デフォルトの名無しさん:04/01/11 15:23
>>25 サーバーマシンとOSの性能にもよるが、それらが許した上で
要求した性能が出せるならまずくないんじゃない?(笑)
pcapやtcpdumpのプログラムソースはどこで入手できますか?
勉強のために読みたいと思っています。よろしくお願いします。
探せ
29 :
デフォルトの名無しさん:04/01/11 16:19
接続者からのコマンドを受信して、
printfで表示するプログラムなんですが
void command(SOCKET msgsocket)
{
char command_buf[5];
char buf_temp[1024];
SOCKADDR from;
int fromlen;
while(1)
{
memset(buf_temp,0,sizeof(buf_temp));
fromlen = sizeof(from);
recvfrom(msgsocket, buf_temp, BUF_LEN,0, &from, &fromlen);
//コマンド取り出し。
command_buf[0] = buf_temp[0];
command_buf[1] = buf_temp[1];
command_buf[2] = buf_temp[2];
command_buf[3] = buf_temp[3];
command_buf[4] = '\0';
printf(command_buf);
}
}
何故か、何も表示されません。
勿論接続は成功しています。
なぜでしょうか?
>>25 Javaだと1000ぐらいでアボーンした
>>25 ネットワーク以前にスレッド1万も作るのは効率悪杉。
OSにはそれぞれ最適化されたハイパフォーマンスなAPIがあるからそれを使うことを検討してみたら?
>>25 ソケットをそれだけ持ってていいのかは知らんけど
数が膨れることがわかってればselectでシングルスレッドですよ
うひょ
selectで一万はしんどいだろ。
なるほど・・・
やはり、スレッドを1万も起こすのは効率悪いですよね。
Selectしかないのでしょうか?
一応ターゲットにしているOSは、Windows2000Serverなのです。
何か良いAPI等はないでしょうか?
あと、プログラムはコンソールアプリとして製作しています。
WSA系の非同期API使え。
サーバの内容にもよるけど一台でこなせなかった場合に備えて
複数台のマシンでの負荷分散も考慮しとけ。
38 :
デフォルトの名無しさん:04/01/11 17:39
>>29 送信元からの文字コードはあってる?
間違ってると。・・・・
あ、化けるだけか・・・
う〜ん、なんでだろ?
>>37 なるほど
色々調べて見ます。
運悪く初めて何となく買った参考書がUNIX系だったもので、WSA系ってあんまり知らないんですよね(汗
>>34 いや、10を超えたらもうあとはいっしょだよ。難易度的に
>>40 いや、数千を超えたらもうあとはがた落ちだよ。パフォーマンス的に
>>29 recvfrom の戻り値は確認してんの ?
>>42 う〜ん、どうやら常に-1のようです・・・
何故失敗するんでしょうか?
errnoミロ
>>41 まーそりゃしょうがないよ
1サーバ2,300あたりまでに制限してあとは負荷分散するくらいだろ
ていうかあの書き方だったらアクセス数が多いけど作業量少なそうだから
1万とかでもなんとかなるだろ
フロントエンドとバックエンドを分けるのが理想かなあ
あとはキャッシュかな
Linuxのカーネルから経路情報を取得するプログラムを作るために
UNIXネットワークプログラミングや、zebraを調べているのですが
rt_msghdrの定義が見つかりません。
Linuxには、そもそもないのでしょうか?
もしないなら、どのように経路情報を取得するのか教えてください。
よろしくお願いします。
>>25 1万コネクションともなると、スレッド以前にロードバランシングを
考えたほうがよさそうな気がするのだが。
サーバ1台で処理するとなるとPCサーバではきついっしょ。
>>43 そげなことがあんた以外にわかるわけなかと。
とっとと、
>>44 の指示にしたごーたほうがよかと。
どうもです。
errono見てみます。
WSAGetLastError() で調べると。
10038というエラーでした。
52 :
デフォルトの名無しさん:04/01/11 18:35
>>51 ソケット以外のものに対して操作を実行しようとしました。
>>51 10038 WSAENOTSOCK 無効なソケットに操作を行っています。
なめとんか ?
どうもありがとうございます。
何故か、スレッド起こして、ソケット内容を渡す後と前とで番号が変わってました(汗
何かミスったかな・・・
何はともあれどうもありがとうございました。
56 :
デフォルトの名無しさん:04/01/11 18:47
質問です。
ホームページのネットワークプログラムを動かしたいのですが
Apacheというホームページのプログラムがあると聞いたのですが
Bpacheと言うのを電気屋で見たのですが。
どちらが良いのでしょうか?
環境は
OS:Pentium4
CPU:WindowsMe
HDD:256MB
です。
よろしくお願いします。
AやBなどと言わず、若いんだからCまで頑張れ。
>>56 突っ込みどころ満載だが…
まぁ、初心者のようなので良い事を教えてやろう。
Cpacheってのが良いよ。
あと、多分そんな環境は壊れてるから
買ったPCメーカーに返品したほうが良いよ。
CPUのソケットにOS挿して、HDDにCPU突っ込んで、IDEにメモリ挿したら
普通壊れるからさ
>>55 て言うか、API の戻り値はちゃんと確認した方がいいよ。
特にネットワークだと、相手の問題でエラーになることもあるからね。
>>56 HDD:256MB はありえるけどな。
ネタでも板違い
62 :
デフォルトの名無しさん:04/01/11 19:11
WSAENOTSOCK
(10038)
ソケット以外に対してソケット操作が行われた
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.
63 :
デフォルトの名無しさん:04/01/11 20:43
質問です。
IRC等は、ポート0同士でデータ転送が出来てますが
あれは、Winsock等を使って実装する事は可能なのでしょうか?
方法があれば教えていただけるとありがたいです。
>>63 IRCじゃなくてIRQでしょ。
そういえば、WinMXもポート0同士での通信に対応してたな
IEのコンポーネント使ってるって聞いた事あるけど、そんなので可能なのかな?
鯖経由してるんじゃないの?
MSNメッセは、ポート0同士の場合、鯖経由だが(だから遅ぇ
IRQは、違うだろ
普通の速度でてるし・・・
鯖は経由してるがデータそのものは経由してない ってのが正しい。
WinSockの機能としては無理
ポート0同士の接続は無理でしょ。
>>63の言うIRCでのデータ転送ってのがDCC-SENDのことなら記憶違いじゃないか? 不可能。
>>64の言うやつも記憶違いでは。無理っしょ
ポート0って事はSoftEitherみたいな仕組みか?
つまり、鯖をハブに見立てて ってやつ
でも、それデバドラ組まないと駄目だと思う。
やはり無理ですか・・・
う〜ん、鯖経由ですか・・・
どうもありがとうございました。
SoftEtherでも、HUBがlistenしているわけで
それって中央鯖経由するのと変わらない。
IRQ?
○ICQ
×IRQ
IRQって言ったら・・・・
アレだろw
ICQか。マジでわからなかった。
74 :
デフォルトの名無しさん:04/01/12 01:08
UDPで、サーバープログラムを作ってるのですが
ローカルから、telnetで設定ポートへ接続を行おうとしたんですが
接続できません。
UDPはtelnetで接続出来ないのでしょうか?
>UDPはtelnetで接続出来ないのでしょうか?
そのとおり。
UDPには接続という概念はありません。
どうもありがとうございます。
勉強になりました。
UDPは投げっぱなしジャーマンスープレックス
すみません、1つ疑問なんですが
確かDNSって、UDPでしたよね?
でも、何故かDNSはtelnetで接続出来るんですが・・・
ああいうのは何故なんでしょうか?
>>78 nameserver 42/tcp name #Host Name Server
nameserver 42/udp name #Host Name Server
なるほど・・・
TCPも動いてたんですね。
どうもです。「
RTCやDirectPlayを使わずにボイスチャットのソフトを作りたいのですが
音声データをリアルタイムで相手に配信するにはどのようにすればいいのでしょうか?
回線状態によって、100%相手に届かなくてもいいので、UDPが望ましいのですが・・・
>>81 音声のミキシングを行って
WindowsMediaフォーマットSDK で音声をエンコード
あとは、普通に転送でOKだと思う。
ネットワークプログラミング、略してネワプ
>>83 それ、自分で面白いと思って書いたのか?
書き込みした後の気持ちってどんな感じ?
今、どんな心境?
ネプ投げって今もうやってないの?
UDPでプログラムを組んでます。
sendto()で文字列を送信したいのですが
ソケットまでは取得できてる状態で
sendto(msgsocket,buf,1024,0,aaa,sizeof(aaa));
こんな感じでいいのでしょうか?
相手先のアドレスの指定は、どの形式でしょうか?
struct hostent *server_ent;
char ip_str[] = "localhost";
server_ent = gethostbyname(ip_str);
sendto(msgsocket,buf,1024,0,server_ent->h_addr,server_ent->h_length);
う〜ん、こんな感じだと思ってやったけど、出来ない。
どうすれば良いんでしょうか?
もうさっぱりわからないです。
>>88 sendto()のあて先指定は、IPアドレスじゃなくて sockaddr(IPならsockaddr_in)へのポインタだよ。
>>88 こんな感じで書け。
struct hostent *hp;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(ポート番号);
if (!(hp = gethostbyname(相手ホスト名)))
エラー処理;
bcopy(hp->h_addr, &addr.sin_addr.s_addr, hp->h_length);
if (sendto(s, buf, sizeof(buf), 0,
(struct sockaddr *)&addr, sizeof(addr)) < 0)
エラー処理;
gethostbyname() の結果得られる hostent 構造体の h_addr に
IP address が入ってる (正確には h_addr は配列なので、h_addr
としてアクセスすれば、bcopy の第一引数にそのまま使える) から
それを sockaddr_in 構造体の sin_addr.s_addr にコピー。
アドレスの長さは hostent 構造体の h_length に入ってるから
それを使え。
sockaddr_in 構造体は 0 クリアしてから、sin_family, sin_port,
sin_addr を設定しとけ。sin_port は送信したい宛先ポート番号な。
つーか、スレの先頭の参考書ぐらい嫁。
こんな基本的な質問する奴っていったい何見て勉強してるんだ?
ひたすらネットを漂流して不正確なコードの断片に惑わされているんだろうか。
>>89 >>90 サンクスです。
無事出来ました。
>>91 家にある参考資料はTCPだけだったり、UNIX用で別の方法で実装されてたりで
ひたすら断片をつなぎ合わせて言ってる感じです。
>>92 どのプラットフォームでやってるのか知らんが、
マニュアルは読まないのか?
94 :
デフォルトの名無しさん:04/01/14 17:27
他で聞いたらこっちに誘導されたんですが、
あるパケットがPC1から出発してPC2に届くまでにかかった時間をミリセカンドの単位で測りたいんですがどうすればよいでしょうか?
それは、時間を計るための特別なパケットなのか?
>>94 双方の時刻をちゃんと同期させておいて、双方で
ethereal でも使ってトレース取れば?
>95
いえ、音声パケットです。
PC1で発した声がPC2で再生されるまでの時間を測りたいのです。
パケットが発射された時間をパケットフォーマットに含めないと
受信側には判りようがない気がするわけだが。
>96
初めて知りましたethereal
出来ればかかった時間のみをファイルに1列で出力したいのですができませんか?
>>94 安易に ping じゃだめなのかな?
そうでなければ NTP の RFC を読んでみれ。
転送遅延の計り方と計算方法が出ている…筈。
>98
そうですよね、、言われてみてもっともです。
なにかしら方法はないものですかね?
受信側には、受信した時刻がある。
送信側には、送信した時刻がある。
じゃあ、あとはパケットにuniqなidでも振っておいて、
id:到着時刻とid:送信時刻をつき合わせたらええやん。
>>99 う〜ん、双方のデータ見て、手で計算すれば? 程度のコメント
だったんだけど...。
双方の ethereal のデータをテキスト化して付き合わせ、
かかった時間を計算するようなスクリプトを書くのは
難しくないと思うけどね。
データ取る、計算する、という手順だから、既存ツールで
一発、ってワケには行かないよ。その辺は自分でささっと
作るベシ。ここはマ板だし、できるでしょ。
libcap 形式にしておいて、tcpdump に喰わせてパケット内容
の一部も表示させて、それをキーに、双方のデータを付き合わせる
ようにすれば、楽だと思うよ。実際に
>>99 が期待している音声
データとやらにそのまま適用できるアイデアなのかは知らないけ
どね。
あ、俺が
>>103 で言いたかったことは、
要は
>>102 ってことです。
>>102 の言うようなパケットを計測データ
として使えば、計算するスクリプトを書く
のも楽だ、っつーことで。
>100
pingとは別に値を取りたかったので。
>102
>103
どうもです、Eterealは使ったこと無いのですがとりあえずやってみます。
ありがとうございました!
TTYってなに?
TeleTYpe
108 :
デフォルトの名無しさん:04/01/14 22:09
Winsockで1つのソケットを複数のスレッドで共有して使うと何かマズーな事が起きますか?
ない。
ライブラリレベルではスレッドセーフだ。
MSの保証はないが。
スレッドを使うのは厨だ。漢なら(ry
>>92 UNIXでsendto()する場合も、90と基本的に等価になる筈だが。
あ、俺受信スレッドでselect()->recv()回しつつ、メインスレッドでsend()
とか何も考えず普通に使ってたな。
>>113 前にも書いたと思うけど、全てのプラットフォームで、
アプリケーションレベルの排他を無しにそれをやって
破綻しないことが保証されているわけではない。
SVR 系の libsocket + sockmod というダサい実装を引き
ずっている商用 UNIX だとダメ。つっても、商用 UNIX で
イマドキ、そんなダサい実装を引きずってるのは少ない
けどね。
ただし、そういう実装でも read() と write() を競合
させるのは大丈夫。recv() と send() だとダメ。
ポータビリティを考えるなら、ちゃんと、アプリケーション
レベルで排他制御をしなさいってこった。
今は winsock の場合での話だと思うのだが。
116 :
デフォルトの名無しさん:04/01/15 18:27
今UDPでプログラムを組んでるのですが
len = recvfrom(msgsocket, buf_temp, BUF_LEN,0, &from, &fromlen);//データ受信
if (len=-1)
{
printf("エラーです。No : %d",WSAGetLastError() );//受信ミスの時エラーを吐く
}
}
こんな感じでエラー処理をして、いざテストしてみると
エラーナンバー0とか言い出すんです。
何故でしょうか?
なんでだろ?
(len=-1)
>>116 コンパイラの警告レベルを上げると幸せになるかも
すみません。。。。。
お恥ずかしいおはなしで・・・・(汗
==ですね。。。
気づかなかった(恥
どうもありがとうございました。。。
ワロタ
122 :
デフォルトの名無しさん:04/01/15 23:01
>>114 >ただし、そういう実装でも read() と write() を競合
>させるのは大丈夫。recv() と send() だとダメ。
なんで?
123 :
デフォルトの名無しさん:04/01/16 00:19
質問です。
Winsockでプログラムを組んでるのですが
Unicodeで送信する場合どうすれば良いのでしょうか?
また、Winsockは特に指定の無い場合はどのコードが使われるのでしょうか?
家にある文献には文字コードの事がまったく書かれてないのです。。。
WINSOCKの「送信」という概念において、載るのは「データ」である。
文字列・コードセット・エンコーディングの規定は主にプロトコルで行われる。
UNICODEで送りたければ勝手に送るがいいさ。
>>125 はニセモノ。俺が本物。
>>122 > なんで?
SVR 系の実装だと、send() や recv() がライブラリだからさ。
ソース読めば理由はわかる。
SVR系のソースってSolaris?
# 他のは見ようがないしなぁ…
# つかSolarisのソースって今も見れるんだっけか?
>>127 Solaris は 2.5.1 で sockmod を捨てた (sockfs にした)
から、昔の SVR のダサい実装じゃない。
>>126 SVR ソースなんか持ってねーよ。
lib のがスレッドセーフじゃないのけ?
132 :
デフォルトの名無しさん:04/01/18 23:28
wininetでsocks経由でHTTP鯖からhtmlをGETするにはいかが致せばよろしいのでしょうか?
wininetでは無理ですか?
単にPROXY経由なら簡単なのだが…
〜でしょうか
〜ですか
〜だが
>>132 HTTPポートに接続してGETリクエストを発行してください。
>>132 SOCKS Version4とか5の事か?
IEにsocksプロキシの設定項目があるんだからできるでしょ
138 :
デフォルトの名無しさん:04/01/19 13:06
ネットの勉強1週間目の初学者です。
SMTP、POP3、FTP、HTTPってDNSサーバをつかってデータを移動させているのではないのですか?
DNSサーバがなくてもいいのですか?
また逆に、データの移動だけならメールとして展開できなくても、
DNSサーバがあればパケットを受け取るだけは受け取れるんでしょうか?
IP-TCP-DNSーSMTPなのか
IP-TCP-SMTPなのか
教えてください。
一週間かけてIPとDNSについてまるで知らないってのは・・・
いきなり「メールの送受信の仕方」を覚えようとしたんだろうなあ
>>137 IEでできるかどうかではなく、wininetでやる方法を知りたいのです。
>>138 DNSとかTCP/IPを色々勘違いしていると思われる。
DNSはホスト名とIPアドレスのマッピング(それと電子メールのルーティング情報の
提供)をするときに使われる。
gethostbyname、gethostbyaddrおよびresolverに関して調べてみると良い。
まぁ、その前に知るべきことが山ほどあるように思うけど。
>>138 >SMTP、POP3、FTP、HTTPってDNSサーバをつかってデータを移動させているのではないのですか?
はい
>DNSサーバがなくてもいいのですか?
はい
>また逆に、データの移動だけならメールとして展開できなくても、
>DNSサーバがあればパケットを受け取るだけは受け取れるんでしょうか?
いいえ
>IP-TCP-DNSーSMTPなのか
>IP-TCP-SMTPなのか
IP-TCP-SMTP
他に質問は?
というかもともと
>>138の質問がプログラミングの質問でもないような
みんな
>>138 に釣られた分けでありますが・・・
>>150 手が込んでいるな。
DNSの質問で、SMTP、POP3、FTP、HTTPを同列にしながら
あえて個別にSMTPを聞いてくるあたり…。
このスレ、いつからC言語のスレみたいにネタスレになったの?
>>139>>141-142>>149-151 皆さんレスありがとうございます。
>>141 これから調べてみます。
>>142 霧が晴れました。
>>149 概念がどうも書籍の文章から連想できなかったもので設計までたどり着けなかったもですから。
>>150-151 釣りやネタではありません。本物の初学者の挙動のサンプルにでもしてください。
>>151 それら(DNS、SMTP、POP3、FTP、HTTP)は同列(アプリケーション層)なのに、という意味ですか?
SMTPは例にしただけで全部書くのもくどいかなと思ったものでそうなりました。失礼しました。
>>152 ありがとうございます。行ってみます。
>>153 ネタではありません。
無知ゆえの質問にてお許しください。
>>154 ネットワークを使って具体的に何をやりたいのか質問すれば?
このスレは最近、閑古鳥が鳴いているのでネットワーク閑人が
答えてくれるでしょう。
>>155 次スレでは、「名無しさん204.204.204.204」だな。
>>154 どの本を読んでそういう考えに至ったのか興味あるが…。
プログラミングをはじめる前に、まともなTCP/IPの本を読んだり
実際にNetworkを構築したりして、TCP/IPのお勉強をした方が良い。
何をやっているかわからないものをプログラミングすることは
絶対にできませんから。まだ設計云々のレベルじゃない。
>それら(DNS、SMTP、POP3、FTP、HTTP)は同列(アプリケーション層)なのに、という意味ですか?
SMTPが特別なのは
>>141に答えが書いてあるのが読めないのかな?
MXが関係するわけだが…。
いまどきパソコン好きな女の子だって、こんな馬鹿な
質問しないよ。いい加減、放置しろよ。
DND ってなんだ。逝ってくる
この業界じゃ,Drag aNd Drop だな。
>>156>>158>>159 レスありがとうございます。
>>156 まずは至極単純なプロキシサーバを作ろうと思っています。
(WAN)モデムとルータ(LAN)の間にかませる「入出全データの丸投げ状態の物」を想像しています。
>>158 ごめんなさい
>>141からは、IP-TCP-DNSーSMTPを連想します…。
(っていうかIP-TCP-DNSーIP-TCP-SMTP?また馬鹿なこと言ってたらすみません)
でも、
>>144-148のやり取りが理解できたかも。
>>159 背筋が凍ります。知らない町(冬の北海道)で一人ぼっちにされたような気になります。
そんなこと言わないでください。
参考文献(購入順)
基礎からわかるTCP/IPネットワーク実験プログラミングLinux/FreeBSD対応
TCP/IPの絵本
UNIXネットワークプログラミング第2版Vol.1
C言語によるTCP/IPセキュリティプログラミング
全てわかったあとに恥かしくなるような疑問なんでしょうが、いまは大真面目です。
>>163 >(WAN)モデムとルータ(LAN)の間にかませる「入出全データの丸投げ状態の物」を想像しています。
WAN - |モデム - RS232C| - |RS232C - PC - ETHER| - |ETHER - ルータ| - LAN
こんな感じか?
しかし、そんだけ参考文献を読んでおいてあの質問は寒い・・・
>>163 ひょっとしたら、全銀協TCP/IP手順をやりたいわけ?
>>163 >(っていうかIP-TCP-DNSーIP-TCP-SMTP?また馬鹿なこと言ってたらすみません)
>でも、
>>144-148のやり取りが理解できたかも。
♂なら氏ね!
つーか相手すんなよ。
全レスしようとするからうざくてたまらん。
\ ∩─ー、 ====
\/ ● 、_ `ヽ ======
/ \( ● ● |つ
| X_入__ノ ミ そんな餌で俺様がクマ――!
、 (_/ ノ /⌒l
/\___ノ゙_/ / =====
〈 __ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザザ
(´⌒; (´⌒;;
マスタリングTCP/IPを100遍読め!
171 :
デフォルトの名無しさん:04/01/19 22:34
>>143 FTPには用はない、
なんでVBのページなんか
googleがVBのページに見えるとは凄いな
174 :
デフォルトの名無しさん:04/01/20 00:52
>>172 オマイは指示されたところから先へ進むことができない能無しの脳無しだな
Ω\ζ°)チーン
175 :
デフォルトの名無しさん:04/01/20 01:31
>>173 つまりこういうことですか?
通常は
InternetOpen
InternetOpenUrl
InternetReadFile
InternetCloseHandle
InternetCloseHandle
だけでhtmlをもらって来れるわけですが、SOCKS経由の場合は
InternetOpen
InternetConnect
HttpOpenRequest
HttpSendRequest
HttpQueryInfo
InternetReadFile
InternetCloseHandle
InternetCloseHandle
InternetCloseHandle
となるわけですか
そう考えるとInternetOpenUrlってのは
InternetConnect、HttpOpenRequest、HttpSendRequest、HttpQueryInfo をまとめて面倒みてくれる便利な関数なんだなぁ
Winsockを使ったパケットキャプチャ作って疑問に思ったんですが。
Winsockってイーサネットフレームのデータって取れないんですか?
MACアドレスとtypeの値が欲しいんだけどうまくいかず。
typeが拾えないとしたら、パケットフィルタ作るときにどうやってIPv4とIPv6を区別するんだろう?
VersionはIPv4もIPv6もパケの最初4bitだからそこで処理分岐させるのかなぁ
winpcapにしとけ。
179 :
デフォルトの名無しさん:04/01/20 21:30
WSAGetLastError と getsockopt SO_ERROR の違いは以下の認識で宜しいでつか?
WSAGetLastError
・同じスレッドの最後のエラーコードを取得
・エラーはクリアしない
getsockopt SO_ERROR
・同じソケットの最後のエラーコードを取得(スレッドは関係なし)
・エラーをクリアする
select の exceptfds 等のエラーコードは WSAGetLastError では拾えないので
ソケットに接続した後は getsockopt SO_ERROR でエラーを取得した方が幸せになれる。
180 :
デフォルトの名無しさん:04/01/20 21:34
>>183 でつ ← 10秒以上見つめるとスヌーピーに見えます
どなたかDelphiのTServerSocketコンポーネントに類似のC++ライブラリ知りませんか?
Delphiで書いたプログラムをLinux/gcc(C++)に移植したいんですが。
真面目に答えてくださいよぉ〜。
>>184 を ← 10秒以上見つめると水たまりに足を突っ込めます。
Linux環境でCによる簡単なサーバを書きかえる必要が出たんだけれど、
IPv6にも必ず対応させるようにと言われましたが、経験が無くてよくわかりません。
IPv4とIPv6の両者に対応させる場合にはどのような点に気をつければいいんでしょうか。
たとえばJavaなら、意識せずにかいても自動的にAPIとカーネルによってIPv6の対応を
すませてもらえるとおもいます(Java1.4、場合によってはLinux2.4が必要)。
Cの場合は、たとえば既存のこのような部分は要修正である、など
どのような点に気を付ければいいのかご教授頂けますか?
よろしくお願いします。
190 :
デフォルトの名無しさん:04/01/21 04:28
191 :
デフォルトの名無しさん:04/01/21 05:26
どうしてこのスレの住人は性格が悪いのですか?
>>185 commonc++
socket++
よさげな方をどうぞ
>>189 まず、socket(2) 実行時のアドレスファミリ (第一引数)
は AF_INET6 を指定しておくこと。Linux は良く知らない
けど、通常はこれで、IPv4, IPv6 コンパチなソケットが
生成される。KAME カーネルなんかだと、そのあとで
IPV6_V6ONLY オプションを有効にしてやると、IPv6 しか
受け付けなくなるけど。
bind(2) するときも、sockaddr_in6 構造体を用意して
bind(2) しておくこと。bind(2) 時のアドレスの指定
方法なんかは、
>>190 が紹介している本を嫁。
accept(2) 時に第二引数をちゃんと指定 (NULL にしない)
するんなら、やっぱり、sockaddr_in6 構造体分のサイズ
を用意しておくこと。
(続く)
(続き)
>>190 が紹介している本を持ってるけど、C でのソケット
プログラミングの知識がすでにあるなら、
>>190 の本を
読めば、IPv6, IPv4 両方 OK なサーバプログラムなんて、
すぐ作れるよ。ちょっとイマイチな所 (著者の考え方が
偏り気味) もあるし、半分以上が Appendix (内容は RFC
と Internet-Draft) だったりする変わった本だけど、
現時点で IPv6 にフォーカスする (日本語限定) のであ
れば、Stevens 読むより、イイと思う。
イメージ沸かないなら、FreeBSD の inetd のソースを
読んでみるのも参考になっていいぞ。
問題は、
>>189 がターゲットとしている Linux のカーネル
が、どこまでマトモに IPv6 を実装しているか、だけどな。
長文、スマソ。
> まず、socket(2) 実行時のアドレスファミリ (第一引数)は AF_INET6 を指定しておくこと。
場当り的対処だな。美しくない上に将来のことなかまったく考えてない汚いやり方だ。
addrinfo 使えばアドレスファミリに関する操作はかなり抽象化できる。
こんな実装依存の方法を使う必要ないよ。
> イメージ沸かないなら、FreeBSD の inetd のソースを
> 読んでみるのも参考になっていいぞ。
>
> 問題は、
>>189 がターゲットとしている Linux のカーネル
> が、どこまでマトモに IPv6 を実装しているか、だけどな。
Linux の v6 スタックが未だ実用に耐えないとでも?(´,_ゝ`)プッ
>>193 > AF_INET6 を指定しておくこと。
> sockaddr_in6 構造体を用意してbind(2) しておくこと。
> sockaddr_in6 構造体分のサイズを用意しておくこと。
この部分はまずい。
AFやPFに依存しないコードを書いた方が良い。
それは簡単にできる。
もちろんFTPの様にIPアドレス、ポート番号を直接扱うプロトコルだと、
その部分「だけ」は明確に書かざるを得ないけどね。
> 偏り気味
藁
>>196 > 場当り的対処だな。
ハァ? AF_INET6 指定で socket(2) をコールせずに IPv6 が
使えるとでも?
> Linux の v6 スタックが未だ実用に耐えないとでも?
だーかーらー、『
>>189 がターゲットとしている』とわざわざ
書いてるだろ? どのバージョンのカーネルを使うかわかんねー
じゃん。最新の (2.6 だっけ?) はちゃんと実装されてるらしい
ね。けど、プログラミングに関する部分って、まだまだ、RFC
になっていなくて、実装による違いが出る部分も多いから、
注意が必要だよね。
ああ、
>>196 の言っている『addrinfo』って
getaddrinfo() のことか。なら納得。
それなら、bind(2) の説明のところを引用すべき
だったね。socket(2) の所を引用しているから、
はぁ? とオモタ。
> なら納得。
要するに、返ってきた構造体の
getaddrinfo(3): ai_family, ai_socktype, ai_protocol, ai_addrlen
gethostbyname(3): h_addrtype, h_length
を使え、自分でマクロ定数を書くのは必要最小限に。
最低限: URLの// →AF_INET, AF_INET6に限定など。
>>200 うん。そーだね。そういう作りが望ましい。
そーゆー話が、
>>190 の本に書いてあるんで、やっぱ、
参考書としてはいいんでないかい?
なるほど、getaddrinfoを使えば仮想的に扱えるんですね。
将来的にまた新しいIPが出てきても問題ない、と。
・・・こういう理解でいいのかな?とりあえずはgetaddrinfoを基本として
そのほか紹介されたAPIも調べつつ、本も読みつつ、やってみたいと思います。
>>179 select exceptfds は、getsockopt SO_ERROR でエラーを取得。
それ以外は、WSAGetLastError でエラーを取得するべし。
また、エラーメッセージはFormatMessageで取得するあるよろし。
204 :
デフォルトの名無しさん:04/01/22 15:16
おしえてください
HTTPにてサーバーを読みに行くと
ノートンインターネットセキュリティにつかまります.
回避したいのですがノートンから認証とればOKですか
また、つかまるのはHTTPだけですか?
おねがいします。
>>204 どの辺がネットワークプログラミングと関係あるのかと
小一時間。
httpsで通信すればオッケーですヨ。
Port0で通信ってどういうこと?
検索してもWinny関連しかヒットしない(´・ω・`)ショボーン
P2P用語で、Proxyの中に居るなどで、こちら側がたとえlistenしても、
向こうからはconnectできない状態にあるってこと。つまり、
こっちからconnectするしかない。
210 :
デフォルトの名無しさん:04/01/23 16:15
う〜む
何とか通信速度を犠牲にせずにポート0通信をやる方法ないかな・・・
鯖を介して通信するとポート0通信は可能だけど、それだと通信速度が落ちるし・・・
何か良い方法は無いものか・・・
通信速度は関係ないんだけど。
全てがポート0になると、どことも接続できなくて困るだけ。
>>209 どうしてそれを「port0」通信って呼ぶのかな?
ポート番号0じゃなくて、ローカルのポートを一つも(ゼロ個)事前割当てしないって事?
>>210 Port0同士で接続する方法が見つかれば大発見
>>213 あるだろ。
rfc3489とか、UDP hole punching あたりで検索してみろ。
>>209 サンクス。P2P用語だったのね・・・
Port0で通信するなんてWinnyってTCPパケットレベルでいじってたのか。う〜ん。
216 :
デフォルトの名無しさん:04/01/23 18:05
>>214 へぇ、、そういうのあるんだ・・・
でも個人で実装できるレベルのものなの?
Winsock使えます ってレベルじゃ無理じゃないかな?
ソースが公開されてるとかなら何とかなりそうだけど・・・
>>215 > Port0で通信するなんてWinnyってTCPパケットレベルでいじってたのか。う〜ん。
なんか勘違いしてないか?(w
>>216 routerとかfirewallがsupportしてないと…
218 :
デフォルトの名無しさん:04/01/23 18:21
>>217 RFC3489ってSTUNの事だよね?
確か、STUNはルーター非依存じゃなかったっけ?
相性問題でウマく行かない事が多いとか聞いたけど
>212
これは予想やけど、P2Pアプリで、listenポートを入力する欄があって、
そこが0だとconnectしかしない(listenしない)モードになるような
インターフェース設計のが有ったからではないかと。
STUNってSTUNサーバなきゃだめじゃん、
完全ポイントツーポイントでport0同士ってわけじゃなく
サーバ介してポートをあけるような
振る舞いをさせるもの、ルータに。
ルータ非依存じゃなく、たまたま
多くのNATルータで動いてしまう。
UDP hole punching と STUNの違いは?
【指令】winsock日本語ドキュメントへのポインタを示しなさい。
提出期限は、本日0時とする。
以上。
氏ね
ぬるぽいんた
本日0時はとっくに過ぎてますよ
( ・∀・)⊃─[]ガッ
[ ] (・∀・ )←
>>224
あと4分ですよ?
>225を百回嫁低脳
>225を百回嫁低脳
>225を百回嫁低脳
>>228 知らないことは知らないと素直に言う勇気
「知らないことは知らない」
そんな事言って情報引き出そうとしてもだめー
とっととお帰り。
じゃぁ帰るからお礼になんかください
233 :
デフォルトの名無しさん:04/01/24 07:53
Windows 2000+VC6.0で WEBサーバにアクセスするプログラムを書いて
ベンキョしたいと思っているのですが、なにかよい書籍はないでしょうか。
以下2点が検索されたのですがは古くないでしょうか?
・WinSock2.0プログラミング(1998)
・Win32ネットワークプログラミング(1998)
rfc2616
236 :
デフォルトの名無しさん:04/01/24 09:17
初めまして。
小生ただいま、クライアントJavaアプリを作成しています。
下記HPに必要事項をクエリとして投げて(POSTして)みたのですが、
次の画面(Submitボタンを押した後の画面)に遷移しません。
遷移後の画面からhtmlソースを取得することが目的です。
http://www.ncbi.nlm.nih.gov/BLAST/Blast.cgi htmlソースを見ると、JavaScriptを使用して送信?を行っているようです。
試しに、ブラウザのURL欄にSubmitボタンのアクション"javascript:document.forms[0].submit();"
を代入して移動すると、Submitボタンを押した後の画面に遷移しました。
GoogleやYahooのような検索エンジンで試してみると正しく次の画面に遷移します。
POSTの処理は、きちんと行われているようです。
JavaScriptが介入してくると、ブラウザの起動は必須なのかなと思い、
アプレットやswt3.0のBrowserClass使って簡単なブラウザを作ってみたりしたのですが、
どちらもいまいち上手く行きませんでした。(特にBrowserクラスは出たばっかりみたいで…)
JavaクライアントアプリケーションでJavaScriptを実行する方法等教えて頂けないでしょうか。
ご教授の程、よろしくお願い申し上げます。
237 :
デフォルトの名無しさん:04/01/24 09:18
//以下ソースです。長文スミマセン
import java.io.*;
import java.net.*;
public class SubmitButtonTest {
public static void main(String[] args) throws IOException {
URL url = new URL("
http://www.ncbi.nlm.nih.gov/BLAST/Blast.cgi?");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
String postdata = "ALIGNMENTS=0&ALIGNMENT_VIEW=Pairwise&" +
"AUTO_FORMAT=Semiauto&CLIENT=web&DATABASE=swissprot&DESCRIPTIONS=50&" +
"ENTREZ_QUERY=Mus+musculus+[ORGN]+OR+Homo+Sapiens+[ORGN]+OR+Rattus+norvegicus+[ORGN]&" +
"ENTREZ_QUERY=All+organisms&EXPECT=1&FILTER=L&FORMAT_BLOCK_ON_RESPAGE=None&" +
"FORMAT_ENTREZ_QUERY=All+organisms&FORMAT_OBJECT=Alignment&FORMAT_TYPE=HTML&" +
"GAPCOSTS=11+1&GENETIC_CODE=1&GET_SEQUENCE=on&LAYOUT=TwoWindows&" +
"MATRIX_NAME=BLOSUM62&NCBI_GI=on&PAGE=Translations&PROGRAM=blastx&QUERY=BG076932&" +
"SERVICE=plain&SET_DEFAULTS.x=22&SET_DEFAULTS.y=12&SHOW_LINKOUT=on&SHOW_OVERVIEW=on&" +
"UNGAPPED_ALIGNMENT=no&WORD_SIZE=3&END_OF_HTTPGET=Yes";
//ストリームを取得してデータをセット
con.setDoOutput(true);
//URL 要求のメソッドをPOSTに設定します。
con.setRequestMethod("POST");
//送信
con.connect();
//応答をすべて標準出力へ
BufferedReader breader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = breader.readLine()) != null){
System.out.println (line);
}
con.disconnect();
}
}
ネットワークプログラミング相談室って次第にレベルが落ちているな。
>>238 レベルもなにも・・・
ネットワークプログラミング限定での話しになると、このレベルしか話しようがないだろ・・・
それ以上のレベルになると個人レベルでの実装は不可能な話になるし
いや、過去スレと比べての話だよ。
質問。
STUNもそうだけどさ
つまり内部からルーターにある指令を送って特定のポートを随時開放するって事だよね?
って事は、どういうパケットを送ってるの?STUNは
何か調べたけど、有料なSDKとかしかないし・・・
おまけに英語は読めないし(実は日本語すら読み書きはかなり辛い、、当方台湾人故。。。)
先に英語を読めるようになったほうがいいと思うがどうか。
>>242 今は日本に居るので、日本語を覚えるのが急務だったもので…
中1の時に引っ越したのでこっちで英語の勉強をするような余裕がなかったです。(高校では騙し騙しその場しのぎで単位取ってたし
無事大学は入れたもののその後どうしようかと・・・(汗
やはり先に英語の勉強した方が良いですかね。
一応技術関係の話は日本で覚えたので日本語の方がわかりやすかったりします。
技術英語なんて英語力と言うより気合と専門用語のボキャブラ勝負だ。
コンピュータ用語なんてほとんど元は英語だから、知ってる単語だけ
拾って読んでも意味は通じる。
>>245 英 語 は と も か く と 言 い な が ら、 英 語 の ペ ー ジ の
リ ン ク を 張 る ア ナ タ っ て 素 敵。
Cのプログラムは読めるんじゃねえの?
> って事は、どういうパケットを送ってるの?STUNは
は分かるよ。
簡単にいえば、NAT下で、TCPのConnect要求を出すと、
(コネクションパケットの)DstIP:DstPort から Routerへきた
パケットについて、SrcIPへ転送するような設定がされるわけだな。
これがUDPの場合、Connectionが云々できないわけで、NATルータとしても、
「外に出したUDPのDstPortについては、無条件でSrcIPに転送する」という
バータリーな対応に成るわけ。何故、DstIPを無視するかは知らない。
だから、特別なルータ指令パケットというものはない。
だから、初期の穴開け時だけサーバを介すれば、二者間で直接通信ができると。
こんな理解でいいのかな?
249 :
デフォルトの名無しさん:04/01/24 22:49
C++の入門本などに載っている問題を載せたら問いてくれますか?
解答例のない本を買ってしまって・・・独学で勉強してるんですが
全く分からなくて困っています。
スレ違いです。
まぁまぁ、そう言わずに・・・
厨がよってきたぞ
ヾ(≧▽≦)ノギャハゥ
ぅけるぅ
256 :
デフォルトの名無しさん:04/01/25 11:56
質問。
Winsockでファイルの転送をする場合
sendだと文字しか遅れませんよね?
ファイルを文字列へエンコードしてから転送すれば良いのでしょうか?
257 :
デフォルトの名無しさん:04/01/25 12:10
データ問い合わせ型プログラムでUDPを使おうと思ってるのですが
<サーバー(Port1000)>--------<クライアント(Port0)>
と言う感じで、クライアント側がNATでポート0の場合
クライアントからサーバーへのデータ問い合わせは可能だと思いますが
それに対してデータを返す時、コネクション型ではないため返信不能になるのでしょうか?
DNSの仕組みだといけてるっぽいですが・・・
NetBios名をつかった通信はできるのでしょうか。
プロトコルはNetBeuiのみで、です。
>>256 > sendだと文字しか遅れませんよね?
よくわからんが、socketはバイナリしか扱えないよ。
>>257 ポート0ってどこのローカル用語?
>>259 ポートが開いてないって言う意味でしょ。
一般ユーザーが良く使う言葉
使用例)
ポート0同士では接続出来ない。
っていうか、数レス前にポート0通信って話が出てるジャン
STUNやらの話題で・・
ほんと意味不明な命名だな。
じゃあ
>>257の Port1000 ってのは一体何なんだ?
ポート番号1000なのか、それともまたわけわからん意味でもあるのか?
友達同士の雑談じゃねえんだからまともな用語を使えよ。
なんでそんなに突っかかる必要があるんだ…
Port0って用語は
>>257が定義したわけじゃないだろ
不正確な表現で混乱するのはよくないな。
>>264 に賛成。
↓Port0と同じ意味のまともな用語
やらないか?
>>256 > sendだと文字しか遅れませんよね?
バイナリだと (* 遅れない *) とでも思ってんのか ? (藁
>>258 名前付きパイプとかメールスロットを使え。
Port0 ごときで、何騒いでいるんだろう...。
知らなきゃ (or 気に入らなきゃ) 無視すればいいだけなのにねぇ...。
もはやPort0は市民権を得た、標準の用語だよ。
時代に後れた人たちは厄介だねえ・・・
あの〜
ポートの事でお騒がせしてしまったようですが
どうなのでしょうか?
ちなみにサーバー側のポート1000は何でも良いのですが
とりあえず開いていてNATを越える事が出来る状況という事で
クライアント側のポート0はNATで遮られてるという意味で・・・
他のポート使えば?
>>273 そういうセリフは、そのキーワードがRFCに載ってから言ってくれよ。
別にここ 2ch だしー。
draftくらいで許してやれ
port0ってWinny用語じゃないの?
>>275 データグラムにおいてもサーバー側がポート開いていれば問題ない
ストリームと一緒
ポートの話はUnix板か犬糞板でやってくれ。
お前ら下らん論議するなよ
話題ズレまくり
>>275 DNSが何故結果を返せてるか考えてみ
必ずしもコネクションしなければ返せないわけではない。
まぁ、bindのソースでも見てみる事をお勧めする。
284 :
デフォルトの名無しさん:04/01/25 16:33
質問です。
今組んでるプログラムで、1つのアプリケーションの中で
DirectPlayとWinSockのTCP&UDPを使いたいんですけど
ポートを共用する事は可能でしょうか?
TCPの接続はな、双方のIPアドレス、ポート番号の四つ組で識別する。
だから、TCPに限って言えば、一つのポート番号をどれだけの接続で利用しても問題ない。
でなければ、複数のクライアントを同時に相手できないでしょ。
>>257,
>>275 普通のルータならNAT越えの時に記憶するので、UDPのアンサーはクライアントに
戻ってくるよ。
"port0"とかいう奇怪な用語で問題になっとるのは、
UDPにしてもTCPにしても外からコミュニケーションが始まるときのことじゃろ。
パケットいじって Port を 0 にしてUDPパケット送ったらどうなるの?
>>291 こんな感じじゃない?
送信元IP,送信元ポート,送信元ポート(ルータ),送信先IP,送信先ポート,プロトコル,TTL
ついでに、TCPのプロトコルスタックでソケットを識別するために使う情報は
自分のIP,自分のポート,相手のIP,相手のポート
だと思う。
ルータのNATとは別物だけど、FTPを通す為とかでセッション管理もしてるだろうし、
やってる訳では無いのでよく分かりません。
UDPで、外→内へのパケットの場合、NATは、実は外側IPのチェックはしていないって話はないですか?
本来してるけど、利便性のためにあえて許可したって感じでしょ。
Linux(2.2まで)のNATだと標準で許可してなかったよね。
>291
UDPも4つ。
動作中のルータの変換テーブル表示させれば判る。
タイムアウトがあるからコネクションレスのUDPでも変換エントリはちゃんと消える。
タイムアウトが短かすぎるとDNSの名前解決も失敗することがあるよ。
>294
上の通り、NAT/IPマスカレードの動作としてはそうだな。
相手とかフラグとかチェックするのはフィルタの仕事だと思うぞ。
外側というのがルータのWAN側アドレスのことなら、
自分宛のパケットじゃなければ無視すると思う。
ふつう届かんし。
パケットフィルタについて質問なんですが。
IPアドレスのマッチングってどのように行っているのでしょうか?
パケットの格納用構造体作成
memcpy(&構造体メンバ名, p, 4); で指定した構造体メンバへIPアドレスのデータを書き込み
↑ p /*pointer*/
ユーザーの指定したIPアドレスを関数を使って32bitバイナリデータに変換
「構造体メンバに格納した値」 == ユーザー入力したIPアドレスを変換したもの
↑のような流れでやっいるのかと思い、実際組んでみたら動かず・・・。
作ってみたヤツ↓
struct {
struct in_addr ip_src; //SourceIP
struct in_addr ip_dst; //DestIP
/*他のパケットの項目については省略*/
}IPv4;
struct ufilter{
unsigned char uip_src[16];
unsigned char uip_dst[16];
/*他の項目は省略*/
}UFILTER;
if(IPv4.ip_src == inet_addr(UFILTER.uip_src))
{ //一致した場合の処理}
structへの不正とメッセージが表記され、無理やり動かすと、パケットデータが入ってないという感じのメッセージがでます。
構造体の中にある構造体へのアクセスの仕方が良くないのでしょうか?(ip_srcのアドレスがキチント取得できてない?)
プログラム始めたばかりなので、至らぬ所多々あると思いますが、よろしくお願いします。
*windows2k、VC6.0でやっています。
*Winpcapは、何やってるか良くわからないので使用していません
すいません自己解決しました。
(´・ω・`)メンバの指定の仕方がダメポだったみたいです。
お騒がせしました。
>>294 そりゃ、外/内っていうより、
どちらのIPアドレスを変換する応用/運用なのかによるんじゃない?
プライベートIPアドレスを内側で運用していてってケースが一番多いから、
内側の話ばかりになるんだけども。
VPN + NATの時は双方向変換ありえるよね。
300 :
デフォルトの名無しさん:04/01/27 13:56
300
guest guest
微妙に凄いホスト名キター
DIONの那覇市か
凄いホスト名だなw
覚えられやすいホスト名ってのは個人的に精神衛生上あまり好きじゃない
ただ自分のhostname確認したいから書いただけなんだけどな…
ま、固定じゃないから近いうちに変わるだろう
guest guest
308 :
デフォルトの名無しさん:04/01/29 21:21
ここで釣りしても良いですか?
餌が悪いと魚から叩かれます。
310 :
デフォルトの名無しさん:04/01/29 23:06
VC++ 6.0 Win2000です。
LAN上のPC1(win 2000)からPC2(win 2000)をシャットダウンさせたいと思っています。
まずPC2にログインしなきゃいけないようなのですが、ログインできてないのです。
↓これで何が足りないのでしょうか。
NETRESOURCE NetRes;
NetRes.dwType = RESOURCETYPE_DISK;
NetRes.lpRemoteName = "\\PC2\IPC$";
DWORD ret = WNetAddConnection2( &NetRes, "ユーザ名", "パスワード", CONNECT_UPDATE_PROFILE );
retには1231のint値がはいっているようなのです。
WNetAddConnection2の返り値もよくわからない…
>>310 > NetRes.lpRemoteName = "\\PC2\IPC$";
デバッガでこの行の次の行で止めて、NetRes.lpRemoteName の指す先にあんたの思ってる文字列が入っているか確認した方がいいと思うよ。
> WNetAddConnection2の返り値もよくわからない…
MSDN も見ないのか ?
If the function fails, the return value is a system error code, such as one of the following values.
312 :
デフォルトの名無しさん:04/01/29 23:34
あ、NetRes.lpRemoteName = "\\\\PC2\\IPC$";
にしてました。 ↑の間違い。
返り値については、MSDNみてます。でも1231がどのエラーコードかわからない。。。
switch( ret )
{
case ERROR_SESSION_CREDENTIAL_CONFLICT :
printf("A");
break;
case ERROR_ACCESS_DENIED :
printf("B")
break;
…
でretがどれかみようとしてるんだけど、どれにも該当してない。。。
retからどのエラーかってわからないし。
>>312 C:\>net helpmsg 1231
ネットワークに到達できません。ネットワークのトラブルシューティングについては、
Windows ヘルプを参照してください。
314 :
デフォルトの名無しさん:04/01/30 00:34
ヾ(≧▽≦)ノギャハゥ
何人かつれて喜んでいるようだ。
MSDNは、わざとわからないように書いてあると思います。
お前ごときがいくらがんばっても無駄ってことだと思います。
320 :
デフォルトの名無しさん:04/01/31 00:15
また昔の記事を……
322 :
デフォルトの名無しさん:04/01/31 01:15
質問です。
サーバー&クライアント型のアプリの場合
待ち受けになる側のサーバーは必ずいずれかのポートを開放してる必要があるのでしょうか?
接続する側のクライアントがポートを開放してる場合でも駄目なのでしょうか?
よろしくお願いします。
その通りですヨ。
>>322 ソケットのレベルではサーバ、クライアントで別のコードを書けますが、
TCP/UDPのレベルでは、両者は対称です。どちらが先にSYNを送るかの違い。
Firewallは、先に送った方をクライアントと見做して処理を行いますので、
逆(サーバ側のみ)なら可能ですが、あなたの言っているのは無理です。
>>322 Port0を使えば問題ない
それはwinnyやwinmxで実証済み
それはサーバーとは言わない。
>>325 ヒソ(´Д)ヒソ(´Д`)ヒソ(Д`)ヒソ
328 :
デフォルトの名無しさん:04/01/31 14:24
>>325 ( ゚д゚)ポカーン
。 。
/ / ポーン!
( Д )
なんでそう思うんだろう。
俺もそういうのはサーバーとは言わないと思うが。
俺も
⊂⌒~⊃。Д。)⊃ po-to0 po-to0 po-to0
338 :
デフォルトの名無しさん:04/01/31 19:01
不特定多数が参加するMMO(というわりには規模がちいさいけど、イメージ的にはそれ)を作っています
マルチスレッドを使おうと思ったのですが、色々訳あって現在はシングル+非同期winsockでやっております
そこで質問なのですが、winsockでconnectを同期せず(connectで止まらず)に行うには
AASyncを使うしかないのでしょうか
recv, sendはソケットのオプション変更で非同期にできたのですが…
プレイヤーがログインしたとき、データベースサーバーにコネクションを張らせたいのです
マルチスレッドにするしかないでしょうか?
非同期ソケットとノンブロックソケットがごちゃごちゃになってませんか。
とりあえずconnectする前にノンブロック設定しておけば、止まることはないけど。
ところでさ、データベースへのコネクションって大抵あらかじめ何本かキープしておいて
それをリクエスト毎に使いまわしたりしないの?
その仕組みだとゲームサーバとデータベースが、同数のコネクション管理しなきゃいけなくなりそうだけど。
がんばってるなぁ・・・
俺なら迷わずDirectPlayだ(駄目だなw
ユーザの処理をさばくのと
DBアクセスをするのは
別スレ群にしたほうがええと思うズラ
342 :
デフォルトの名無しさん:04/01/31 19:26
GetLastError() と WSAGetLastError() と同じ内容を返すけど
WSAGetLastError() は使わなくっても良いですか?
WSA関連の後はWSAGetLastErrorにしたほうがええと思う
いつ何が起こるかわからんし
>>343 同意。現状同じ値を返してるってだけだからね。
つーかヘルプに書いてあるんだから、勝手に GetLastError() でいいやと思う神経が信じられん。
世の中には結果オーライというコトバもある。・・・時と場合に夜けどね。
世の中には出鱈目って言葉もあるけど、出鱈目にプログラミングしていい訳ではない。
バグがあるとき、出鱈目な部分があると、そこが原因なのかと
疑わなくてはならなくなる。最初からきちんとやっておけと言いたい。
HTTP で,keep-alive って事で待機させているソケットがあります。
前回使ってからかなり時間が経ってるものの,とりあえず connect すると
errno が EISCONN でした。
しかしリクエストを送っても,何もレスポンスが返ってきませんでした。
こんな場合,本当にまだ接続が続いているかどうかを調べるには
select で読み出し可能であるかどうかを調べるのが最適解でしょうか?
リクエストを送る前にも関らず読み出し可能ならば,
それは接続が切られてる事を表し,recv の結果は 0 のはずだって事で。
あー,つーかすんません。いきなり質問撤回。
すぐに使い回すかどうかが明らかでないのに
Keep-Alive なんかするな,ていうのがファイナルアンサーですね。
あー,でも HTTP プロクシを作ってる場合だとやっぱり悩みそうな。。。
でも今は HTTP プロクシ作ってるわけじゃないので,やっぱしいいス。スマソコ。
>>350 ところでなんでkeep-alive?
persistentじゃないの?
>>349 あのなあ、どんな時でも、
> しかしリクエストを送っても,何もレスポンスが返ってきませんでした。
を想定して対応する必要がある。これがネットワークプログラミングなわけ。
「簡単に」「必ず」返事が返ってくるかどうか調べる方法があると思うな。
返事はYES, NOに加えて、⊥(bottom)があり得るのがネットワークなのだ。
とお兄さんは言いました。
353 :
デフォルトの名無しさん:04/02/01 14:10
VC++でCAsyncSocketを使って、MSNメッセンジャーのように
メッセージをやり取りするソフトを作っています。
とりあえずメッセージ送信を、クライアント側からサーバ側へ
"MSG 送信文字列の長さ 送信先ID\r\n送信文字列"
という形式で送り、サーバ側から送信先クライアントへ
"MSG 送信元ID 送信文字列の長さ\r\n送信文字列"
というテキスト形式で送ることにしています。
受信部分は、まずOnReceive()でReceiveにMSG_PEEKフラグをつけて
256文字ほど一旦読み込み、\r\nを文字列検索してそこまでの長さを調べ、
再度\r\nまでをMSG_PEEKなしで読み込んでいます。
その後、読み込んだサイズ情報を元に、再度Receive文で
送信文字列部分を読み込む、という方法です。
しかしこの方法でテストをしているとと、メッセージをいくつかやりとりしているうちに、
急に何をsend()してもサーバに届かなくなってしまいます。
また、そうなるとサーバからのsend()も認識しなくなってしまいます。
上記のメッセージ送信以外の通信(たとえばオンライン・離席中の切替命令)
は何回繰り返してもこのような現象が起こらないため、おそらくこの
メッセージ送受信処理に問題があると思うのですが、どうにも原因がわかりません。
この現象が起こるのは本当にランダムで、同じ文字列を3回ぐらい
送信しただけで起こることもあれば、20回くらいまで耐えることもあり、
全く見当もつきません。
何が悪いのでしょうか・・・?
MSG_PEEKは止めとけ、という話がどっかに有った気がする。
えー、Winsock の MSG_PEEK はまともに動かないって書いてる分け? 酷いな・・・
>>358 いや、はっきりそう書いてないのがこれまた酷い。
マイクロソフトの技術情報はエクスキューズが含まれているので要注意。
>これは、Unix BSD ソケットとの互換性を持つ Winsock 1.1 から残っている機能です
Winsock2でも残ってるってことだろ。
>>353 > 何が悪いのでしょうか・・・?
Winsockです(藁
>>361 調べずに書きますが、(どうせ金輪際使わない機能なので俺は調べる気なし)
Winsock 2 for XPでは、直ってたんじゃないかなあ?
どのプラットフォームならOKか、MSDNに書いてあるよ。> 使いたい人
Winsock2 、つか、ネットワーク廻りの MSDN を日本語にしてくれ >M$
Winsock逝ってよし!
よって、Windowsでわsocketつかうな。
以上。
>>364 ↓こんな体たらくでもやはり日本語がいいか…
> なお、この資料は英語版の翻訳であり、日本語環境での確認は行っておりません。
通信の基本は紙コップと糸だ
mingwだろ(w
peek辺りはワナが一杯だぞ。
SO_RCVTIMEO and SO_SNDTIMEO
When using the recv function, if no data arrives during the period
specified in SO_RCVTIMEO, the recv function completes. In Windows
versions prior to Windows 2000, any data received subsequently
fails with WSAETIMEDOUT. In Windows 2000 and later, if no data
arrives within the period specified in SO_RCVTIMEO the recv
function returns WSAETIMEDOUT, and if data is received, recv
returns SUCCESS.
If a send or receive operation times out on a socket, the socket
state is indeterminate, and should not be used; TCP sockets in
this state have a potential for data loss, since the operation
could be canceled at the same moment the operation was to be
completed.
"使うべきではない"て。作ったんお前らやろ。
>>369 MinGWはBSDスケット入ってないだろ。Cygwinにしとけ
>>369 mingwのソケットってWinsockを使ってないのけ?
>>369 罠 罠 罠に落ちそう♪
誘惑の peek 私をさそう♪
mingwはwinsockを直に使うやろ
cygwinも結局winsockを使うから
どっちも同じだよ
TCP/IPスタックが腐ってんじゃなくて、
WinsockのAPI設計が腐ってるんだから大丈夫じゃねえ? > cygwin
>>374 cygwinがどうなってるか、ちょっとでいいから調べてみよう。
Mozsock.dllを使うと言うのはどうだろう?
Mozockだ。。。
>>376 水溜りを避けて肥溜めにはまるようなもんだ。
>369
「BSD Socketに機能があるから互換性のために実装しとくけど、
使うのはやめとけ」って話ではないの?
だからお前ら全員Mozock.dllをWinsock.dllにリネームしてシステムに放り込めって!!
幸せになれるぞ!!
今時mozock.dllなんて持ってるヤツ居るのか?
今時winsock.dllなんて使ってるソフトあるのか?
もう伝書鳩でいいよ。ちゃんとRFCになっているし…。
ping ぐらいしか通らないみたいだけどな。
>>379 全然違うぞ。Winsockの方でアホ仕様に。
> the socket state is indeterminate
> TCP sockets in this state have a potential for data loss
有り得ない。
> since the operation could be canceled at the same moment the operation was to be completed.
こんなレベル低い実装は。
385 :
デフォルトの名無しさん:04/02/02 21:21
すいません。以前LAN上のリモートPCをシャットダウンさせたいで
投稿した者(310)ですがまだ解決しておらず、助けをお願いします。(VC++6.0 Windows2000)
borlandの↓ホームページのTIPSを参考にしてconsole用のプログラムにしようとしています。
ttp://www.borland.co.jp/tips/cbuilder/cb013/ntshut2.html シャットダウンさせたいリモートPCにWNetAddConnection2で
ログインするところまでできました。
その後、
@OpenProcessTokenでプロセストークンを取得
ALookupPrivilegeValueでシャットダウン権限の LUID を取得
BAdjustTokenPrivilegesでシャットダウン権限を与えて
CInitiateSystemShutdownでリモートのPCをシャットダウンとやると、
システムエラー5の「アクセスが拒否されました」
になってしまいます。アクセス権限がないのかなと思ったのですが
シャットダウンさせたいPCには ユーザ名/パスワード admin/admin
がいるし、WNetAddConnection2ではadmin adminでログインしています。
何が原因なのかわかりません。なにかアドバイスお願いします。
ログインできたんだったらネットワーク関係ないんじゃねーの?
問題切り分けてから出直してこい。
387 :
デフォルトの名無しさん:04/02/03 11:08
こんにちは
WINSOCKで、送信バッファをクリアー(ゼロ)にする方法を教えてください。
よろしく、
フラッシュじゃなくてクリア?
無理っぽい気がするけど
その前に設計が変じゃね?
送信バッファのクリアって意味わかんね
どこまで相手に届いたかを無視してぶった切るってこと?
むちゃくちゃだな。
あれのことじゃねーの。nagleの無効化。
nagle の無効化だったら TCP_NODELAY だ。
nagleの無効化って何か意味あんの?
細切れにしたパケットをたくさん、しかも遅延少なく送りたい場合、
しかも、そのコネクションで相手からの応答が少ない場合は有効
それならデータグラムで良いじゃん と思うんだが・・・
telnet/UDP。なんと恐ろしい思想か。
>>387は特にTCPと指定しているわけではないが、
UDPだと送信バッファをクリアー出来るのか?
UDPに送信バッファなんて概念あったっけ?
Diablo2なんかのネトゲーだとUDP使いまくりだよ
ラグいっぱいの悪寒w
破棄パケットだらけじゃないの?
400ゲットするよ
>>392 nagle の無効化は、telnetd のように 1 byte ずつ、すぐに送信
しなければならない (エコーバック) 場合に必要。
telnet クライアント側は、エコーバックされる 1 byte に ACK
が相乗り (piggy back) してくるので、Nagle に影響されずに、
すぐに、次の入力を 1 byte 単位で送信できる。
>>394 順序が保証されない。
>>399 リアルタイム性を求められるので、破棄されても OK。
むしろ、再送される方が困る。マルチキャストは UDP しかないでしょ?
inet_addrの戻り値の型がLinuxと違うような気がするんだが…Winsock
uint32_t相当で同じだよ。
IPv6対応にするには、inet_ptonを。
こんにちは。質問させてください。
TCP 接続において、たとえば送信側で
> send( socket, "ABCDEFGH", 8, 0);
とした場合に、受信側で
> recv( socket, buffer, 4, 0);
> (略)
> recv( socket, buffer, 4, 0);
と二回に分けて "ABCD" と "EFGH" に分けて取得できるのは、
TCP の規格 でしょうか?それとも環境依存なんですか?
ご教授願います。
マニュアル読め、ボケが。
>>405 そのような最低限の基礎が理解できてないのに開発するのは大変だよ。
なんかちゃんとした資料読もうね。「UNIXネットワークプログラミング」とか。
TCPの規格とか環境依存とか以前の話ってことだよ。
>>405 TCPはバーチャル・サーキット/バイトストリームです。
あなたが直感的に欲しているのは、SOCK_SEQPACKET(未実装)。
>>405 > と二回に分けて "ABCD" と "EFGH" に分けて取得できるのは、
二回で済むとは限らん。
そういう半端なレスは無意味だろ
これを半端としか取れないとは...。
データの切れ目が分からないのは結構面倒くさい。
データをテキストにして区切り文字つけるとか、先頭にレングス付ける
とかで対応してるけど、毎回セッション張りなおすのもあれだし、
UDP使わずに、他に良い方法とか無いですよね。
>>413 無い。
つーか、そういう処理 (=データの切れ目を解釈して、一塊のデータを送受信) をするルーチン書くのってそんなに面倒か ?
httpなどがどうやってるか考えたことないんだろうかね
質問です。
ビデオチャットを作ろうと思うのですが
別に一部の損失くらいはかまわないので、出来るだけ高速にしたいのでUDPにしようと思います。
そこで、良いサンプルとかありませんでしょうか?
質問に対する回答
「探せばあるかもしれません」
レスありがとうございます。
例が抽象的過ぎたようですね。何がしたかったのかというと、
送信側
> char data[10];
> strcpy( data+1, "ABCDEFG" );
> data[0] = strlen( data+1 );
> send( socket, data, data[0]+1, 0 );
受信側
> char buffer[10];
> recv( socket, buffer, 1, 0 );
> recv( socket, buffer, buffer[0], 0 );
このように、データの頭にデータ長を入れたかったんです。それで、
内部的にバッファリングされるのは規格で決まってるのか、自前でいったん
バッファリングするべきなのか。ということが疑問になり、質問した次第です。
バッファリングは必要なんでしょうか?
>>418 sendは一度に何バイト書き込めるか分からないし、
recvは一度に何バイト読み込めるか分からない。
考慮すべきはインタフェースとしてのsend/recvの挙動であって、
内部的な動作を考える必要はないのでは?
先頭にバイト数を書くというのはいいやり方だと思うよ!
>>418 自前のアプリ・ライブラリレベルでバッファリングは必要。
そこから4バイト一まとまりで取れたらよこせというAPI経由でパケットを取得する。
>>421 自前のバッファリングなんて必要ないよ。
(
>>419が言うようにバイト数書いてあればとりわけ)
fdopenして、fread, fwrite使えばいい。
ハァ ?
すいません。。どなたか助けてください。
・やろうとしていること
IPv6で通信するサーバ・クライアントを作っています。
サーバ側は上手くできたようで、
telnetで確認したところ、ちゃんと通信できました。
んで、クライアント側を作っているのですが、
どうしても、サーバにコネクションが張れません。
おそらく、getaddrinfo の使い方が間違っているんだと思うんですが、
どうも、いまいち分からなくて・・・。。
どなたか、ヒントでも良いので教えてください。
--------------------------------------------------
・サーバ&クライアントプログラムを動かしているマシンの環境
--------------------------------------------------
OS: NetBSD(1.6.1)
IPv6 Address: fe80::20c:29ff:fe07:955e%pcn0
(つづく)
--------------------------------------------------
・プログラム本文(connectを張るとこまで)
--------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#define PORT 10000
main(int argc, char *argv[])
{
struct sockaddr_in6 addr;
struct hostent *hp;
struct addrinfo hints;
struct addrinfo *res;
int fd;
int len;
char buf[1024];
if (argc != 2){
printf("Usage: iclient SERVER_NAME\n");
exit(1);
}
(つづく)
宿題は宿題スレで。
memset( &hints, 0, sizeof(hints) );
hints.ai_family = AF_INET6;
hints.ai_flags = AI_CANONNAME;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(argv[1], NULL, &hints, &res);
if ( (fd = socket(AF_INET6, SOCK_STREAM, 0)) < 0 ) {
perror( "Failed to create socket" );
exit(1);
}
printf( "Initiated connection to host: %s, port: %d\n",
res->ai_canonname,
htons(((struct sockaddr_in6 *)res->ai_addr)->sin6_port)
);
if ( connect(fd, res->ai_addr, res->ai_addrlen) < 0 )
{
perror( "Failed to connect to server" );
exit(1);
}
close(fd);
}
(つづく)
>>426 え、こっちじゃ不味いですか?
では、宿題スレにいくことにします。
別にいいけど。
>>429 あ、では、張り直すのも大変なので、
こちらで質問させていただきます。。
(つづき)
--------------------------------------------------
・プログラムの説明
--------------------------------------------------
# ./client fe80::20c:29ff:fe07:955e%pcn0
と、サーバのIPv6アドレスを指定すると、コネクションを張ろうとする。
以上で、終わりです。
よろしくお願いします。
追加で、実行時のエラー表示です。。
# ./client fe80::20c:29ff:fe07:955e%pcn0
Initiated connection to host: (null), port: 0
Failed to connect to server: Can't assign requested address
printf( "Initiated connection to host: %s, port: %d\n",
res->ai_canonname,
htons(((struct sockaddr_in6 *)res->ai_addr)->sin6_port)
);
ネットワークバイトオーダーに変換したものを表示させるの?
それにgetaddrinfoの第二引数がNULLでしかもその後にポート番号を設定していないような・・・
>>426 connect をする前に、どこへコネクトしようとしているかを確認しているのですが、
これでは、ポート番号は出ないでしょうか?
と言いつつ、今のままだと、↓が反映されるはずないですね・・・。
#define PORT 10000
うーん、普通にIPv4でならクライアントの作り方がわかるんですが、
getaddrinfo を使ったときの、作り方が分かっていないんだと思います。。
>>434 そのPORTマクロがどこにも使われていないYO!
438 :
デフォルトの名無しさん:04/02/08 12:47
んじゃageときまっせ
439 :
デフォルトの名無しさん:04/02/08 18:55
440 :
デフォルトの名無しさん:04/02/09 11:01
Windowsのアプリについてですが、
ルータなんかでポートを塞がれてて動作しない場合、
そのポートが何番かを調べる方法はありますか?
ルータのログをみる
>>441 なるほど。それで絶対分かりますね。
アプリとかツールレベルの対処もあれば安心なんですが、どうですか?
UPnPにそんなメソッドがあったかもしれない。
状況がわからんのだが
塞がれててこないものを検出するのは無理では?
>>444 来ないものでなくて、
自PCから外に繋ぎに行こうとするポート一覧が知りたいでつ。
プログラミング関係ないだろ。他でやれ。
// WinTCPで検索しろ。
// Windumpの間違いでした…
ヲイヲイ、ネットワークプログラミングの初歩は、パケットを眺めることでわ。
449 :
デフォルトの名無しさん:04/02/09 13:51
450 :
デフォルトの名無しさん:04/02/10 02:29
前スレがおちた(T_T)
451 :
デフォルトの名無しさん:04/02/10 17:27
今Windows2000のクライアントとLinux 2.4.22-1のサーバーで
単純なTCPのサーバー・クライアントソフトを書いてるんですが、
負荷テストをしてると、突然connectが失敗するようになります。
特に複数のクライアントからコネクションを大量に張った時に起こるので
サーバー側でEtherealでモニターしてみたところ、
[TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0
のようなDup ACKというメッセージ以降はパケットのやりとりが全くなくなることがわかりました。
アプリケーションを強制終了するとそれまでつないでた分のRSTが大量に流れます。
各コネクションは12回、64バイトのパケットを往復させており、
他のコネクションはAckが769で切断されています。
で、質問なんですが、
・Dup Ackというのは再送を要求するためのリクエストではないのか?
なんでここでとまるのか?
・パケットのやりとりがとまらないようにするにはどうすればいいのか?
どなたかわかるかたがおられましたらご教授お願いします。
すみません、失敗しているのはconnectではなく、recvでした。
WSAGetLastErrorの値はWSAECONNRESETでした。
>>451 etherealの'TCP Dup ACK'ってのは、
etherealが同じシーケンス番号のACKを発見したという事。
その例で言うとAck = 65のパケットが直前にあるんじゃないの?
返事しろやゴルァ、って言ってるのにwin側が返事しないから何度も(Dup)投げてんだろ。
win2000側が受けとれてないか、送信できてないんだな。
単にwin側がさばききれずに負荷で死んでんじゃネーノ?
アプリケーション終了させたら繋がってたTCPにRST飛びかうのは当たり前。
あ、linux側が落としてる可能性もあるな。
serverとclientで同時にpacket dumpしといて、
変になった所のデータつきあわせればわかるだろ。
サーバー側はJavaで書いてるんですが、なんか色々調べた感じでは、
java.nioで新しく入ったSelectorクラスを生成すると、
たまにブロックすることがあり、ブロックする時にこの現象が起こるようです。
いつも950前後のコネクションで止まっていたので、
試しにサーバー側のプロセスのディスクリプタ数の上限を上げてみたら
3000コネクションはつながるようになりました。
Javaの実装でSelectorで止まるとソケットを切断するとかあるんでしょうか?
>>453 ありました。
そっちのほうはただのACKでした。
>>454 >返事しろやゴルァ、って言ってるのにwin側が返事しないから何度も(Dup)投げてんだろ。
ACKに対して返事ってなくないですか?
ちなみにDUPACKのパケットと同じAck番号のパケットはWindows側にはとどいていました。
457 :
デフォルトの名無しさん:04/02/10 22:01
>422読んで思ったんだけど
バッチ処理的にブロッキングされてもいいようなアプリ以外で
TCPで送受信用リングバッファ使わないで通信してる人って多いの?
>>457 俺はリングバッファ必須みたいな言い方の方が違和感あるけどね。
必要に応じて、使い分ければいいんじゃないの?
>>456 Ackとデータ送信は兼用できるだろ。
Ackといっしょに送ったデータの返事がこないから何度も送っている。
>>456 試してみたところ、getSoLingerの値は-1(無効)でした。
知らなかったんで、調べてみたんですが、
> SO_LINGER は,データが送信されるか,デバイスの時間切れ (約 8 分) が発生するまで,
> close の内部ソケット削除の部分を実行しないことを指定します。
とありました。
linger-on-closeって明示的にcloseした後の動作を指定する
オプションじゃないんですか?
>>460 けどサーバー側はデータ送信は一度も送っていないんです。
切断されたコネクションでのやりとりは、
C > S SYN (seq=0, ack=0, len=0)
S > C SYN,ACK (seq=0, ack=1, len=0)
C > S ACK (seq=1, ack=1, len=0)
C > S Data+Ack (seq=1, ack=1, len=64)
S > C ACK (seq=1, ack=65, len=0)
C > S RST+ACK(seq=1, ack=65, len=0)
で終わりです。
既に存在しないconnectionにTCP segmentが来た時、
linger-on-closeで、タイムアウトが起きた時、
これがRSTの典型的な利用ケースなんだけどね。
>>451 > [TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0
>>461 > C > S RST+ACK(seq=1, ack=65, len=0)
逆向きなんですが…どっちなんですか?
UNIXのソケットでwinsockの非同期みたいな事をするにはどうしたらいいでせうか;;
シングルスレッドで…
poll使ったdispatcher自分で書け。
>>463 FIOASYNC
シグナルに明るくないならオススメしない
>>462 >既に存在しないconnectionにTCP segmentが来た時、
>linger-on-closeで、タイムアウトが起きた時、
>これがRSTの典型的な利用ケースなんだけどね。
両側とも明示的に切断は行っていないんですが、
何かしらの理由で切断されている、ということなんでしょうかね。
>
>>451 >> [TCP Dup ACK xxxx#y] server > client [RST,ACK] Seq = 1 Ack = 65 Len = 0
>
>>461 >> C > S RST+ACK(seq=1, ack=65, len=0)
>
>逆向きなんですが…どっちなんですか?
すみません、前者が正しいです。
あと全く別の質問なんですが、winsockでUDPでデータ通信をする際に
あるあて先に1パケットで最大何バイト送れるかを調べる方法はありますか?
467 :
デフォルトの名無しさん:04/02/12 13:33
オレ、LinuxでCでネットワークプログラム書いてる。
ソケットに対して writeして そのすぐあと close したとき
相手に writeした分は 届くの?
フラッシュするとか writeが完了するの待つとか いる?
>>467 TCP/IP の場合?
普通は届くけど、ホントに届いたかどうか、close() しちゃったら、
もう、確かめられない。write() したはいいけど、相手からの応答が無くて、
TCP で再送タイムアウトになったとしても、そのエラーを拾えない。
もっとも、再送タイムアウトになるまで待つ、ってのも気の長い話だけど。
データを送信した後、read() で 0 return するまで待ってから、ソケット
を close() するようなコーディングをよく見かけるな。
あと、「フラッシュする」ってのは何かを誤解していると思われ。
両方がread() で 0 return するまで待ってから、ソケット
を close() するようなコーディングをしていたらどうなるんですか?
shutdownでも使え。
>>469 そのアプリケーションがどういう通信をやるのか知らんけど、
通信の最後で、
write() した側は read() 0 return を待つ
read() した側は、必要なデータを読み取ったら、close()
とすればいいだろ。
それが嫌なら、
>>470 の言うように shutdown() でも使え。
write() して即 close() だと、もし、相手がデータを送って
きたら RST 応答してしまう。
>>466 よっぱらってるんで、
> あと全く別の質問なんですが、winsockでUDPでデータ通信をする際に
> あるあて先に1パケットで最大何バイト送れるかを調べる方法はありますか?
こっちだけ。MTU discoveryで検索。
あ、常にできるわけではない。
PathのnodeがMTU discoveryをsupportしている必要がある。
って事は書いといた方がいいか。
Path というか、基本的に通信相手だけサポート
していれば大丈夫でしょ。
もちろん、途中経路の firewall 管理者が、
「icmp は全部ブロック」みたいな無知な
packet filtering ルールを設定してないこと
ってのはあるけど。
てゆーか、いいかげん、こういう設定勧めている
低レベルなセキュリティ本は滅んでほしい。
>>474 とりあえず読んで。
RFC1191:Path MTU discovery.
RFC1981:Path MTU Discovery for IP version 6.
あ、
>>446はIP packet fragmentationを嫌って、
こういうことを尋ねているというのが、暗黙の仮定になってます。
code=4 の icmp メッセージが、RFC792 のものから更新され
ていたのを知りませんですた。RFC792 に RFC1191 の router
requirement と同じことが書いてあると思ってた。
無知スマソ。
>>475 v6 の場合は、仮定してもいいよね。そもそもルータが
fragmentationしてくれないし。
IPv6ではPath MTU Discovery必須です。
>>474 >>475 こちらも追加。
RFC2923:TCP Problems with Path MTU Discovery
UDPではPMTUDを使わない(えない)かも。
デフォルトでUDPのPMTUDを切っているOSが多い。
ところでWindowsでDFがすべてのパケットに付いているのは仕様?
どうせ付けるならEvilを付けてほしい:-)
悪は嫌いです
そうですか:-)
GoodとEvilは同じパーティに入れないからなあ
>>483 んなこたない。
ダンジョン内で待ち合わせをすればいい。
でもロードなんかいらないだろ
サムライと忍者で十分
winsockのソースも流出した模様
JavaのURLConnection系ってタイムアウトが実装できないから
使いにくいっていうけど、タイムアウト部を自分で書けば使える
ということなんだろうか。
>>488 > タイムアウト部を自分で書けば使えるということなんだろうか。
こっちに反応し忘れた。hookがないから駄目。
そもそもSocketにtimeoutがない(< 1.4)。
1. java.*, javax.*, sun.*でないURLConnection系のクラスを使う。
2. 1.4を使う。
のいずれか。1.はConnectionPool系ならtimeoutが付いていることが多い。
>>488 hookがないからというのは具体的にはどういうこと?
いや、タイマースレッドを用意してタイムアウトしたら
URLConnection#disconnectすればいいかとか適当に
考えていたんだけど。
と思って調べてみたらURLConnectionにはdisconnect
がない。HttpURLConnectionだった。
ここの住民にとってはいい教材が手に入りましたなぁ・・・。
「ソース嫁!」が飛び交う悪寒。
Windowsの流出ソースの中のWinsockのソースに何か目新しいものあった?
リファレンスに載ってない隠し機能みたいなのとか
流出ソースって何処で手に入るの?
497 :
デフォルトの名無しさん:04/02/15 21:24
499 :
デフォルトの名無しさん:04/02/15 22:56
ソースって言っても重要な部分は結局tcpip.sysに丸投げで、
tcpip.sysのソースは含まれていないときたもんだ。
>>491 disconnectがconnectをcancelするなんてことは、
documentのどこ読んでも書いてないですよ。実際無理。
帯域制限を実装したいんだけど。
たんにSendToにぶち込むバッファーの量を絞ってやればいいだけの話?
>>502 そんなもん、下のレイヤーにやらせておけば?
>>502 どの程度帯域制限したいかによるけど、
bitrate計算して、その分sendtoも遅らせたりする必要が出てくるでしょ。
506 :
デフォルトの名無しさん:04/02/17 10:06
Linuxで動いてるサーバーにTCPのコネクションを超大量に張ってたら
途中からSYN-ACKが返ってくる時間がクソ遅くなってくる。
2万セッションくらい張りたいんだけど、なんか設定できるところない?
あ、それから、当然だけど、一つのサービスで20Kセッションなら、
acceptをどうやっているかなど、アプリの構造もかかわってくる。
510 :
デフォルトの名無しさん:04/02/17 11:22
>>508 サンクスコ。ちょっと読んでみたけど面白かった。
>>509 漏れが書いたのは多分
>>508で言うところの最初の
"Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification "
の奴で、acceptしているスレッドはaccept次第ワーカースレッドに全部仕事を任してる。
send/recvのやりとりはそれほど発生しないので、普通にselectでさばけてるんだけど、
acceptでブロックしてる時間が異様に遅い。
スニッフィングしてみたら、synがクライアントから送られて、syn-ackが返ってくるまで3秒かかってたりする。
acceptしなくてもlistenしてれば自動的にsyn-ackは送られますよね?
よく見てみたらsyn-ackが返って来る間に色々やりとりがあった。
サーバーからただのackが返って来て、
クライアントがrstを送って、
サーバーがackを返してる。
で、3秒後にクライアントがsynを送って、
それに対してsyn-ackが返って来た。
なんでこんなよくわからないことしてるの?
>>513 もっとよく見ろ。
その ACK は、その SYN とは全然関係ないコネクションの
ACK だろう。
単にサーバ側アプリケーションの accept() 処理が追いつかず
にバックログキューが溢れて、SYN が破棄されているだけ。
で、クライアント側の SYN の再送で救われている。
できる限り、サーバ側アプリケーションのバックログ値を
大きくしてやれ。
>>514 >その ACK は、その SYN とは全然関係ないコネクションの
>ACK だろう。
両側のポートは一緒なんだけど、違うコネクションってことはあるの?
>できる限り、サーバ側アプリケーションのバックログ値を
試してみます。
ありがとうございます。
バックログの値を20000にしてみたけどやっぱり同じ現象が発生する。
クライアント側では3つプロセスが動いていて、
それぞれが一つずつ接続をしてるだけだから同時に3つしか
キューに入らないはず。
どんどん絶望的な気分になってくる…
orz
517 :
デフォルトの名無しさん:04/02/17 17:43
メールクライアントを作っているのですが、簡単なテストサーバみたいなものは
ないでしょうか?POP3サーバとかじゃなくて、
手打ちデータなどをクライアントに返せるようなサーバがほしーです。
ベクターを探してみましたが見つかりませんでした。
なにか知っていたら教えていただけるとうれしいです。
519 :
デフォルトの名無しさん:04/02/17 17:47
>>517 それをつくるのも勉強のうちじゃないの?
失礼しました。OSはWindows98かWindows2000かLinux Redhat9でお願いいたします。
>>520 >手打ちデータなどをクライアントに返せるようなサーバ
って何よ
522 :
デフォルトの名無しさん:04/02/17 17:59
echoじゃだめなんか。デフォルトでつぶしてルかも試練が
tcp over udpなソースってどこかにあったりしませんか?
>>524 airhookとか。
死ぬ程糞だけど。
>>506 OSは?
backlog の検索にhashを使ってないタコな
OSも世の中にはあるぞ。OSを乗り換えた方が
いいかも。
527 :
デフォルトの名無しさん:04/02/18 00:21
Winsockでプロクシサーバを作ろうとしています。
複数のソケットを作って、WSAASyncSelectを使って非同期通信しています。
それで、各ソケットごとに受信・送信の状態などを覚えておかないといけない
と思います。
で、そのために、HWNDにGetWindowLongやGetPropでするようなことを
SOCKETでもできますか?できるならそこに構造体のアドレスを入れて
おけばいいですよね。
(WSAASyncSelectで各ソケットとウィンドウを1対1に対応させれば出来るん
ですが、ウィンドウひとつでできるならそのほうがいいので。)
それとも、スレッドを使ったほうがいいんでしょうか?
>>526 Linuxって思いっ切り書いてますがな。
ディストリビューション関係あるの? カーネルは同じでしょ
529 :
デフォルトの名無しさん:04/02/18 03:58
preforkして複数のプロセスでacceptしてみれ。
でも改善されたらラッキー、くらいだな。
>>526 カーネルは2.4.22で、ディストリはdebian使ってる。
早く2.6にしたほうがいい?
>>531 今見たら入ってた。
#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ipchainsはないみたい。
>>516 > 両側のポートは一緒なんだけど、違うコネクションってことはあるの?
古いコネクション。そのために TIME_WAIT なんて状態が存在する。
が、今回のケースでは関係ない気がする。回線トレース見てみないと
なんとも言えんなぁ。
>それぞれが一つずつ接続をしてるだけだから同時に3つしか
>キューに入らないはず。
お前、バックログキューを全く理解していないぞ。
バックログを 20000 にした、って、どうやったか、具体的に
書け。listen() の第 2 引数を 20000 にしただけじゃあ、
OS 側の上限に負けるぞ。
listen、引数大きすぎてもエラーにならないもんなあ(w
>>533 >> 両側のポートは一緒なんだけど、違うコネクションってことはあるの?
>古いコネクション。そのために TIME_WAIT なんて状態が存在する。
あー、確かに。
ただ、一つずつconnectしていってもエラー返さずずっとブロックしてるから
別のコネクションってことはありえないと思う。
>>それぞれが一つずつ接続をしてるだけだから同時に3つしか
>>キューに入らないはず。
>お前、バックログキューを全く理解していないぞ。
accept後のデータのやりとりは別スレッドに任せてるから
connectにacceptが間に合ってない、ってことはないと思う。
クライアント側は何度かデータのやりとりしてるからほぼ間違いないと思う。
acceptすればキューから外れると思ってたんだがこれは正しい?
>バックログを 20000 にした、って、どうやったか、具体的に
>書け。listen() の第 2 引数を 20000 にしただけじゃあ、
>OS 側の上限に負けるぞ。
第二引数を20000にしただけですた。
OSのほうの設定もやってみます。ありがとうございます。
>>535 > acceptすればキューから外れると思ってたんだがこれは正しい?
そりゃそうなんだけど、acceptはsingle threadedなんでしょ。
だったら、一つ捌いている間にどんどんたまっていくよね。
> accept後のデータのやりとりは別スレッドに任せてるから
これをやっている間にも。
> connectにacceptが間に合ってない、ってことはないと思う。
自身たっぷりだが、有り得ないことじゃないよ。
>>535 >accept後のデータのやりとりは別スレッドに任せてるから
>connectにacceptが間に合ってない、ってことはないと思う。
accept() 後の話はかんけーねーだろ。
accept() ってのは、結構重い処理なんだよ。
クライアント側もシリアルに回してるのに SYN+ACK が返る
のが遅いのであれば、バックログ溢れなのかどうか疑わしく
なってくる。
とりあえず、サーバ側で netstat -s を定期的に採取して、
バックログキュー溢れが発生していないか確認してみろ。
今 Linux が手元にないから、netstat -s のどこを見れば
いいか説明できない。スマソ。誰か、フォローよろ。
FreeBSD だったら "listen queue overflows" のところね。
後は、さっさと、そのアヤシイという回線トレースを晒せ。
>>506 > accept後のデータのやりとりは別スレッドに任せてるから
> connectにacceptが間に合ってない、ってことはないと思う。
> クライアント側は何度かデータのやりとりしてるからほぼ間違いないと思う。
ここで一つ疑問なんだが、「何度かデータのやりとり」(特にサーバーからのデータを受信)を
しないと次のconnectは呼び出さないの?
たしか、サーバー側でacceptしなくても"3-Way Handhsake"が終わればconnectは制御を
戻すから、もしそうでないならキューがあふれる可能性あるよね。
540 :
デフォルトの名無しさん:04/02/18 14:02
>>539 糞レスと判断したかレスアンカーがないから無視したんだろ。
返事送れてスマン。
まずバックログの話だけど、
# sysctl -w net.ipv4.tcp_max_syn_backlog="5000"
で増やして、listenの引数のほうも4000とかにしてみたけど、
同じ現象が発生した。
>>536,
>>537 accept直前で文字出力してacceptに入ってることは確認してるんだが、
結局クライアント側からの再送の3秒分止まってる。
ちなみにクライアント側でconnectする前に2500msのSleepを挟んだら
クライアントは5500msくらいの時間止まるようになった。
2500msのsleepを入れてるのにあふれる、ってありえる?
synからのダンプは、
19:06:06.672731 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:06.675614 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 1398628608 win 5840 (DF)
19:06:06.675642 192.168.123.61.xtel > 192.168.123.19.19876: R 1398628608:1398628608(0) win 0
19:06:06.690803 192.168.123.61.1308 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:06.791364 192.168.123.61.1312 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:08.559930 802.1d config 8000.32:cf:fc:3e:e4:8c.8001 root 8000.32:cf:fc:3e:e4:8c pathcost 0 age 0 max 8 hello 2 fdelay 5
19:06:09.394346 0.00:00:74:6b:2b:c7.4100 > 0.ff:ff:ff:ff:ff:ff.452:ipx-sap-nearest-req 4
19:06:09.606638 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609082 192.168.123.19.19876 > 192.168.123.61.xtel: S 1754744741:1754744741(0) ack 1640009459 win 5840 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609179 192.168.123.61.xtel > 192.168.123.19.19876: . ack 1 win 65535 (DF)
19:06:09.609576 192.168.123.61.xtel > 192.168.123.19.19876: P 1:65(64) ack 1 win 65535 (DF)
19:06:09.612497 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 65 win 5840 (DF)
19:06:09.615356 192.168.123.19.19876 > 192.168.123.61.xtel: P 1:65(64) ack 65 win 5840 (DF)
19:06:09.615513 192.168.123.61.xtel > 192.168.123.19.19876: P 65:129(64) ack 65 win 65471 (DF)
3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。
この後サーバークライアント間でパケットが何回か往復して、
また同じようなSYN,ACK,RST,SYN...ってのが出る。
connectした時の最初のsynからのダンプは、
19:06:06.672731 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:06.675614 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 1398628608 win 5840 (DF)
19:06:06.675642 192.168.123.61.xtel > 192.168.123.19.19876: R 1398628608:1398628608(0) win 0
19:06:06.690803 192.168.123.61.1308 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:06.791364 192.168.123.61.1312 > 192.168.123.19.19876: . ack 705 win 64831 (DF)
19:06:08.559930 802.1d config 8000.32:cf:fc:3e:e4:8c.8001 root 8000.32:cf:fc:3e:e4:8c pathcost 0 age 0 max 8 hello 2 fdelay 5
19:06:09.394346 0.00:00:74:6b:2b:c7.4100 > 0.ff:ff:ff:ff:ff:ff.452:ipx-sap-nearest-req 4
19:06:09.606638 192.168.123.61.xtel > 192.168.123.19.19876: S 1640009458:1640009458(0) win 65535 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609082 192.168.123.19.19876 > 192.168.123.61.xtel: S 1754744741:1754744741(0) ack 1640009459 win 5840 <mss 1460,nop,nop,sackOK> (DF)
19:06:09.609179 192.168.123.61.xtel > 192.168.123.19.19876: . ack 1 win 65535 (DF)
19:06:09.609576 192.168.123.61.xtel > 192.168.123.19.19876: P 1:65(64) ack 1 win 65535 (DF)
19:06:09.612497 192.168.123.19.19876 > 192.168.123.61.xtel: . ack 65 win 5840 (DF)
19:06:09.615356 192.168.123.19.19876 > 192.168.123.61.xtel: P 1:65(64) ack 65 win 5840 (DF)
19:06:09.615513 192.168.123.61.xtel > 192.168.123.19.19876: P 65:129(64) ack 65 win 65471 (DF)
3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。
この後サーバークライアント間でパケットが何回か往復して、
また同じようなSYN,ACK,RST,SYN...ってのが出る。
>>538 サーバーからのデータ受信をするまで送受信を10回くらいしてる。
だからacceptされてるはずなんだけどなぁ…。
>>539 スマン、自分宛だと気づかなかった。でpreforkで検索してもapacheの設定の話ばっかりで、
manで調べても見つからない。ポインタキボンヌ。
>>542 サービス名変換してないトレースして欲しいに。xtel って何番だ?
それから、トレース晒すなら、どこで採取したかも書け。
> 3行目でよくわかんないRSTが送られてて、8行目でSYNが再送されてる。
よくわかんなくはないぞ。2 行目の謎の ACK に対する RST だ。
192.168.123.61 側には該当コネクションが存在しないから
RST 応答していると思われ。多分、1 行目の SYN を受けた段階では、
192.168.123.19 側には、まだ
192.168.123.19:19876 <-> 192.168.123.61:xtel
という古いコネクションが残ってると思われる。だから、ここで
古いコネクションの ACK を返している。
お前、クライアント側のプログラムで、以下のようなことをやっ
てないか?
- connect() 前に明示的に bind() している。
- SO_REUSEPORT オプションを使っている。
>>545 のつづき。
3 行目で RST を受けたので、このタイミングで 192.168.123.19
の古いコネクションが消滅。
8 行目の SYN の再送に対して 9 行目で 192.168.123.19 側から
SYN+ACK が帰されてて 10 行目の ACK でコネクション確立。
4 〜 7 行目は関係ないな。
古いコネクションの時からのトレースがあれば確証が得られる
んだけど。
>>544 > サーバーからのデータ受信をするまで送受信を10回くらいしてる。
> だからacceptされてるはずなんだけどなぁ…。
accept() しなくてもコネクションは確立するんだよ。
3 way handshake でのコネクション確立が完了して、
ようやく、アプリケーションの accept() が解ける。
だから、回線上にデータのやりとりが流れることと、
accept() が終わっていることは別の話。サーバ側から
のデータ (PUSH ビットが立ってるやつ) が流れてたら、
それは、accept() が終わってるってことだけどな。
それ以外は TCP がやり取りしてるデータだからアプリ
ケーションは関係ない。
明示的に bind() してないのに、古いコネクション
とかぶっちゃうとしたら、ANY ポートの範囲が異様
に狭い、ってことはない?
偶然採取できている、別コネクションのデータをみると、
どうやら、このマシン (192.168.123.61)、ANY ポートの
範囲が 1024 〜 5000 になってる気がする。
イマドキそんな腐った OS は捨ててしまえ。ちゃんと、
IANA に従えと。
もし、古いコネクションが残ってることが原因なら、
とりあえず、サーバアプリケーションは、データの
やりとりをして最後にソケットをclose()する時に、
read() が 0 return するのを待ってから close()
するようにしろ。つまり、クライアント側がコネクション
をクローズしたことを確認してから、サーバ側も close()
する。
そうすれば、サーバ側には TIME_WAIT のコネクションが
残らないから、この問題は発生しない。サーバアプリケ
ーションの常識。覚えとけ。
>>544 preforkは、サーバ起動時にあらかじめ(pre-)いくつか子プロセスをつくっておくこと。
Apache1.3.x(のStandAloneモード)がその一例。
>>545 激しくすまん。このdumpはクライアント側でとったもの。
192.168.123.19がサーバーで、19876は固定のポートでクライアントの1313番(xtel)はエフェメラルポート。
> - connect() 前に明示的に bind() している。
それしてる。ただポート番号は指定しない(0)で適当に取らせてる。これやばい?
> - SO_REUSEPORT オプションを使っている。
SO_REUSEADDRは使ってる。SO_REUSEPORTは使ってないわ。
> accept() しなくてもコネクションは確立するんだよ。
ごめん、説明が悪かった。
クライアントはサーバーからのデータをrecvで待ってる。
クライアントはsend,recvを繰り返して、最後のrecv後に
次のconnectを呼んでる。
> 明示的に bind() してないのに、古いコネクションとかぶっちゃうとしたら、
> ANY ポートの範囲が異様に狭い、ってことはない?
いっぱいコネクション張ってみたら
4963の次に1026番ポート開いてた。
5000以降は使ってないのか。
試しにクライアントのローカルポートを30000-50000にして
つないでみたけど、結果は同じだった。ショボーン
>そうすれば、サーバ側には TIME_WAIT のコネクションが残らないから、この問題は発生しない。
テスト中に中断するためにクライアントをCTRL-Cで止めてるんですが、
これはまずいっすか?
>>550 あー、プロセスじゃないけどスレッドはあらかじめ作っておいてあるわ。
質問。
LANで送受信したIPパケットの個数を知りたい(取得したい)んですが、
どうすればいいですか。
>>553 OS無くてもいいじゃん
オレならパケットモニタを買って来てぶち込む
>>551 >ただポート番号は指定しない(0)で適当に取らせてる。これやばい?
いや。かまわん。それなら ANY ポートが振られるから。
> 試しにクライアントのローカルポートを30000-50000にして
> つないでみたけど、結果は同じだった。ショホ゛ーン
何がどう同じだったのか書け。それでも同じように謎の ACK が出て
たのか? 古いコネクションの ACK が流れてる可能性がある、という
仮説なんだから、ちゃんと回線トレース確認汁。
> テスト中に中断するためにクライアントをCTRL-Cで止めてるんですが、
> これはまずいっすか?
そーゆー話はどーでもよくって、サーバ側がどういう作りになってる
か説明汁。TIME_WAIT が残るような作りなのかどうか。
>>555 度々すまん。
>何がどう同じだったのか書け。
>それでも同じように謎の ACK が出てたのか?
>古いコネクションの ACK 流れてる可能性がある
クライアントのプログラムを必ず30000から順番にポートを使うようにさせたら
一度テストプログラムを動かしただけだと問題ないんだけど、
二度目に起動するとSYN-ACKじゃなくてACKが返ってきてた。
サーバーは全コネクションで同じポート使ってるし、
クライアントは一度目と同じようなポートをbindしてるから全く同じソケットペアになってる。
古いコネクションのほうのACKか、っていうのは判断できる?
>そーゆー話はどーでもよくって、サーバ側がどういう作りになってる
>か説明汁。TIME_WAIT が残るような作りなのかどうか。
サーバーはソケットをaccept後にrecv, send, recv, recv, {recv, send}*10という処理をしてる。
recvの前にはselectしていて、5秒でデータが来なかったらclosesocketしてる。
この後はselectでソケットがシグナルされて、recvの戻り値が0以下の時に切断してる。
送受信してるデータは全部64byte固定で、サーバー側は64byte単位で読み込んでる。
あとクライアントが1000コネクション張った後に一気に1000回closesocketを呼ぶと
サーバー側でnetstatで見ると800個くらいESTABLISHEDのコネクション残ってた。
100ms間隔でclosesocketしたらほとんど消えてた。
Establishedなつもりのソケットペアと同じソケットペアでsynが送られたから、っていうのが原因?
>>556 >古いコネクションのほうのACKか、っていうのは判断できる?
全ての回線トレースがあれば、シーケンス番号と ACK 番号の
繋がりから判断できるだろ?
だから、古いコネクションの時からのトレースを確認しろと
言っている。
>この後はselectでソケットがシグナルされて
意味がわからんぞ。
実はサーバー側で蟹さんとか使っていて、パケット落としまくっ
てるだけじゃないのか?
>>559 (蟹は別にして) その可能性も否定できないね。
以前のコネクションでクライアントからの FIN
を取りこぼしてたとしたら、こういう状況になる
かもしれん。
ただ、その場合、クライアント側では FIN の再送
を繰返し、FIN+ACK が得られるまで FIN_WAIT_1 or
FIN_WAIT_2 状態で残るはずだから、何度か後の
connect() 時に同じポート番号が使われた、という
点の説明がつかない。SO_REUSEADDR を使うことで、
クライアント側で FIN_WAIT_1 or FIN_WAIT_2 で残
っているポート番号を bind() することは可能だが、
それと同じコネクション対になる相手に対して
connect() しようとした所で、EADDRINUSE エラー
になるはず。
とりあえず、netstat -s や netstat -i での確認を
しようとしない
>>506 に乾杯!
562 :
デフォルトの名無しさん:04/02/20 12:29
蟹?
∧||∧ \ │ 蟹 警報! ! | /
( ⌒ ヽ \ └―――──―――┘ /“corega FEther PCI-TXC Plus
∪ ノ \ ヽ(´ー`)ノ / 】“ELECOM LD-10100S
U U \ ∧∧∧∧∧ / 易】“ GreenHouse GH-ET100RT
オンボードが蟹だった \< カ >【安易】“駄メルコ LGY-PCI-TXD
v(・ω・)v v(・ω・)v v(・ω・)v< 二 .>【安易】“プラネッ糞 FW-110TX
v(・ω・)v v(・ω・)v v(・ω・)v< 悪 チ >【安易】“哀王 ET100-PCI-L2
―――――――――――‐< 感 ッ >―――――――――――――――――――‐
蟹チップ___マンセー`ヾヽ< !!!!! プ > 蟹は蟹であると見抜ける人でないと |\
,r''´ ,ォく ̄^ 〉、< の >(ハイエンドなLAN環境を実現するのは)難しい
/ / ノ ! / { } ∨∨∨∨∨ \ / |/| __ \ /
./ し' ノ、 , -、 { `′ / \ \ 丿 __ '"ゞ'-' | |
{ ヾ;、. _,.ィ「! }-ィ゙ /〉}、ヽ, ‐/ \ | | '"-ゞ'-'____| | __//
ヽ、 ~ ,r'ソ ト-'′ `┬'^い, } / ∧∧ ミ ドスッ \\\| | ̄ ̄ ::::::::  ̄ ̄\/
.( 'ー')j/ ヾj jツ i / ,ゝ/ ( ,,)┌―─┴┴─‐`く ( ,-、 ,:‐、 |/\
. [`〔」ノ `'ー'゙ { `7 / つ RealTek \ |/\
`'y′ [ニ7 〜′ /´ └―─┬┬─―─ \ __,-'ニニニヽ . |/\
〉 } / ∪ ∪ ││ ε3 \ ヾニ二ン" |/\
( 蟹. REALTEK ノ/ ゛゛'゛'゛ \_____/
俺のはLGY-PCI-TXCなんだが…蟹?
>>549 多分忘れると思うので、また後で教えてください。
ワロウタ
568 :
デフォルトの名無しさん:04/02/22 12:43
>568
・TIME_WAIT状態のポートへのbindを許可する(bind出来るのは1プロセス)
・1つのポートに複数のプロセスが同時にbind出来るようにする
と書いてあるように見えるけど。
>>568 SO_REUSEPORT はマルチキャストのためのオプション。
つまり、UDP で使う物。TCP には関係ない。
確かに引用されている FAQ には「UDP」の文字が出て
こないから、シロートには分かりづらいかもしれない。
マルチキャストを知っていれば自明なんだけど。
SO_REUSEADDR は、TCP のコネクション対が全く同一
にならなければ、ローカルポートが同じコネクション
も存在可能にするオプション。SO_REUSEADDRを設定
していても、コネクション対が全く同一になるコネク
ションは同時には存在できない。そのようなコネクシ
ョンを作ろうとするシステムコール (bind(), connect())
は EADDRINUSE エラーになる。
超遅レスに思えたけど、まだ一日経っていないのね。
574 :
デフォルトの名無しさん:04/02/24 00:23
socket関数で、 0 が帰ってくるときがあるんだけど
こりゃーいったい何を意味してるのかな
575 :
デフォルトの名無しさん:04/02/24 00:38
sd = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
これでsd==0になることってあるの?
576 :
デルファイの名無しさん:04/02/24 01:13
こんちわ。
いま、DOSベースでTCPIPのパケットをとばす方法をさがしてます。
DOSのアプリで、シリアル通信をしていたのを、TCPIPでやりたいと言う
要求があるのです。
WindowsベースではWINSOCK使ってチャットみたいなことをした経験は
あるのですが、DOSでどうやったらいいか途方に暮れています。
昔、よくLANMANでファイル共有なんかさせていたので、とりあえずLANMAN
のシステムコールとかAPIの資料をさがしてるんですが、なかなか目的のものが
見つかりません。
ここらへん、参考になる資料とか、サイト、使えるモジュールなど(有償でもかまい
ません)はないでしょうか。
よろしくおねがいします。
IBMのWebBoyとかフリーのTEENとか
DOSでSMB使いたいとか言い出さないでね
>>576 ネットワークプログラミング相談室 Port4
>>577 (゚∀゚)サンクスコ
まさにそのとおりでした
おはようございます。
>578
Linx をちょっと漁ってみてますが、、、ソースだけではちょとつらいです。。。。
そこら辺もちょっと攻めてみようと思います。
>579
いへいへ、TCPIPでチャットみたいな事ができればいいのです。制御系のPCで、
機械制御してるのでWindowsはつかえなくてDOS使ってるところで、LANで通信させたいもので。
>580
ありがとうございます。いっぺんみてみます。。。
584 :
デフォルトの名無しさん:04/02/25 23:18
send が失敗すると2分後くらいに recv が -1 を返すんですが、
この時間って変更可能なのでしょうか?
ちゃんと説明して。
全く無関係アプリのバグ
587 :
デフォルトの名無しさん:04/02/26 01:56
>>584 応答のあるものなら2分なんて待たずに
さっさと捨てるべし
588 :
デフォルトの名無しさん:04/02/26 02:56
589 :
デフォルトの名無しさん:04/02/26 02:59
一部、チルダが全角に化けたり、/e/のあとに余計なlが入ってしまいました。
すみません。
Host:
>>585 LANケーブルを抜いてsendすると、sendは成功するけど 2 分後くらいに
コネクションが切れます。2 分以内にケーブルを刺しなおすと送信できるんです。
なんて気の長いタイムアウト値なんだ・・・ということが言いたい。
>>587 さっさと、close(socket) してしまえって事?
リトライしても送信バッファに溜まるだけですよねー。
タイムアウト値を調整するより途中でキャンセルできるインターフェースを作っとけばいいんじゃないの。
何作ってるのか知らないけど。
>>591 2 分なら短い方だ。たいがいの OS では、
TCP 再送タイムアウト時間は 10 分近い。
気に入らないなら、TCP の再送タイムア
ウト時間を短く変更すればいい。
けど、システム全体に影響するから、普通
はそんなことやらない。そのアプリケーション
で、一定時間内に相手から応答がなければ、
エラー処理にするように作るのが普通。
「リトライ」はダメでしょ。お前は TCP を
なんだと思ってんだYO。
一定時間、相手から応答が無ければ shutdown() してまえ。でええの?
>>594 >「リトライ」はダメでしょ。お前は TCP を
>なんだと思ってんだYO。
そ、そうなんですか。。。
元々 RS232C で実装されていたものを Ether Net + TCP/IP に変えたですよ。
首くくって出直して来ます・・・ _| ̄|○
>>588 Host:はさんざんがいしゅつだから
ケース2について補足しておくとmod_proxyの仕業
> 参考にしているサイトによるとGETメソッドはpathを指定するようです。
AbsoluteURLを指定する書式はHTTP/1.1では正しい。
>>596 > 一定時間、相手から応答が無ければ shutdown() してまえ。でええの?
だーかーらー、それで「ええ」のかどうかは、そのプログラム
書いてるお前にしか判断できないでしょ。
そのコネクションは、もうだめぽ、と判断するんなら、素直に
close() すれば。わざわざ shutdown() することに意味はない。
599 :
デフォルトの名無しさん:04/02/26 15:16
>>590,593,597
ありがとうございます、解決しました。
散々がいしゅつだったのですね、過去ログはPort8スレしか読んでいませんでした。
>>598 え〜、タイムアウトでリトライだめぽならコネクションの安楽死しか無いでしょ〜。
「猫でも分かるネットワークプログラミング」を読んで勉強してるんですが、
分らないことがあるので質問させてください。
とりあえずTCPチャットをサンプル通りに打ちこみ、
自分の一台のパソでサーバとクライアントを両方起動してたところ、
LAN側のローカルIPとかホスト名を指定した場合は上手く通信できたんですが、
グローバルIPを入れると通信が確立できませんでした。
自分のグローバルIP(らしきIP)にpingをうってみたら
やはり応答がないみたいなんですが、なにか根本的に勘違いしてるんでしょうか?
ヤフーなので固定IPではないらしいんですが、
実際昨日調べてからずっとかわってないみたいなので、その辺は問題ないと思うのですが、、。
ド素人なので場違いなようで申し訳ないんですが、
何か理解のヒントになるようなことでも良いので助言をいただけたらと思います。
環境はWIN2000とVC++6です。
その「グローバルIP」は実はルータのインターフェースに付いているという
落ちではないだろうな。
>>602 すいません、、ちょっと意味が理解できないであります。
家のなかでデスクトップとノートをルータで繋いでるんですが、
その間では通信できましたし、一台のPCの中でも出来ました。
グローバルIP(と思い込んでいるIP)は
「確認君」などのグローバルIPチェックサイトで調べた物なんですが、
それじゃまずいのでしょうか?
そのルータのインターフェースに付いているIPというのは
確認君などで見れるIPアドレスとは違ったものなんでしょうか。
落ちましたな。御後が宜しいようで。
>>603 何が起きても責任は持てないが、そのルータのフィルター機能を全て
無しにして味噌。
脳豚入れてるので無問題なりぃ。
>>604 ありがとうございます。
やっぱりなんかすごくバカな事を聞いてるんでしょうか。
そりゃ出来なくて当たり前、ってことでしたら、
なぜ出来ないのかというのを
何となくのイメージでよいので理屈で理解したいのですが。。
>>605 ありがとうございます。
よくわかんないのでとりあえずいったんルータを外してみようかなと思ってるんですが、
なかなか面倒そうであります。
このままの環境ではルータを挟んでる関係で
グローバルIPを使っての自分から自分への送受信はできないけど、
クライアントの方を友達とかに渡して
外から繋いでもらえばできるんでしょうかね?
今日は遅いんで明日にでも試してもらおうと思ってるんですが。
>>608 マジレスすると、そのチャットソフトで使ってるTCPポートを開いて
ローカルなIPへ通すような設定をルータにしないと無理。
ルータの説明書を読んで味噌。Web鯖を外部へ公開する方法とか
書いてあるはずなので、その方法と同じやり方で出来るはず。
ちなみに漏れはルータなんか使ってないのでグローバルから
素通し。あひゃひゃひゃ。
初級ネット板へでも行って、ポートマッピングについて教えて貰うといい。
ぶっちゃけグローバルIPが割り当てられていないPCで
ゴローバルIPのテストをするのは不可能
プロキシでも使わない限り
#ローカル環境の話ね、友達に穴つついてもらうのはOK、FTPのプログラミングでハマる人よく見るので蛇足ながら
612 :
デフォルトの名無しさん:04/02/27 00:58
閉じた環境ですべて設定してしまえばいいじゃん
しかしプライベート/グローバルIPだのNATだのよくこんな頭悪い仕組みを思いつけたもんだ。
最初はこんなにインターネットが広まるなんて思ってなかったもん。
アメ公は腐るほどIPぶん取ってるくせに・・・
617 :
デフォルトの名無しさん:04/02/27 02:31
IPv6割り当ててくれるプロバイダはいつ登場するんだろう?
>>617 うちUSENだけど素でカメみえるよ。
ほかにもIPv6実証実験に参加してるプロバイダは結構あるとおもう。
クライアントが全て対応するか、
全てのISPがv4v6ゲートウェイやってくれないと、
v6だけでサービス立ち上げるわけにはいかないけどね。
>>614 というか、今でも頭の悪いプロトコル考えている奴らの方が…ICQとか…
おまいらネットワークプログラミングの前にネットワークを勉強しる!
現場しかありません
>621
3分間Networkingをキーワードにぐぐりなさい。
そして隅から隅まで目を通し頭に叩き込みなさい。
ところでさ・・
IPv6とか、いまいち実感わかんのだけど・・・
結局目に見えたメリットはどんなのがあるの?
グローバルIPアドレスが増えるので、各PC1台ごとにグローバルIPアドレスを割り振る事が出来る
って聞いた事あったけど、結局グローバルIPアドレスを追加するには追加料金要るし・・・
IPv6なら人の細胞一個一個にIPアドレス振っても余るらしいよ
LAN内のプライベートIPから外のグローバルIPへ変更しなくても良くなるんだよね
>>624 下半分は基本的にMACアドレスからの生成だから、IPv4とは違って
PC増えたからって追加料金はないと思うぞ。
マルチキャストを使うとWinnyの転送効率が上がりそうだな。
>>628 何故?
ブロードキャストじゃねーぞ。
>>627 そりゃサービス内容によるんじゃないの?
select() を使ったサーバのソースって何処かに落ちてない?
636 :ヽ(´ー`)ノ :04/02/28 16:08
>>633 > この板はプログラムを作る人のための板です。
mp3 のリッピングにせいを出す前に、ローカルルールを読む知恵ぐらい付けたらどうだね。
637 :デフォルトの名無しさん :04/02/28 16:11
>>636 MP3をさらにリッピングするのか?
PC初心者板へお帰り。
4引数selectのexceptfdsに入ってるハンドル、OOBを読み捨てればいいと思うんだけど何書いとけばいい?
perl5.8.3で IO::Socket と IO::Select 使ってるけど、Cとかの話でもいいからキボン
selectなんて使うの?
使いますよ。Win32のActivePerlです。
>>635 > OOBを読み捨てればいいと思うんだけど何書いとけばいい?
この文章の意味がわからんのだが。
「いいと思うんだけど]ってのは何なんだ?
MSG_OOBをrecv()しなくて無視するとどうなるのだろ?
ソケットバッファがオーバフローであぼーんか?
処理系の実装によるが、悪意のある接続先にOOBデータを送られ続けると
バッファが満杯になりデータを読めなくなるかもしれない。
ソケットにOOBINLINE を設定すればとりあえず問題ないけどね。(単にクライアントが壊れた入力を流してるように見えるだけ
>>640 OOB メッセージは 1 つしか滞留しないから、無問題。
基本的に 1 byte しか緊急メッセージとして扱わないのが、
普通の処理系。
>>641 は妄想。
643 :
デフォルトの名無しさん:04/03/01 17:37
>>645 『Telnet アプリケーションで』って書いてあるが。。。
647 :
デフォルトの名無しさん:04/03/01 22:46
相手が送ってきたOOBを放置してたら通常のデータを読めなくなるのはtelnet以外のプロトコルでも同じ
Winsock でお勧めの本、
ありますか?
ありますか?
650 :
デフォルトの名無しさん:04/03/01 23:38
>>649 「あるあるあるあるあるーーーー」
ちゃーらーらーらーらー
お勧めっていっても一冊しか出てないし
書籍ネタはスレ違いだし
nagle って、なんて読めばいいのでしょうか?
ナグル、ネイグル、ネァグル、ノグル
さすがに、殴れ、ではないだろうとは思いますが。
661 :
デフォルトの名無しさん:04/03/03 23:06
ブロックソケット=同期、非ブロックソケット=非同期 と書いてある本があるけど
ブロックソケット=同期、非ブロックソケット≠非同期 ですよね?
はいそうです。
一般的にasynchronous communicationというのは、
requestとreplyが分離されているような通信スタイルのことです。
「非同期」と訳されることが多いのですが、ネイティブは「非同時性」のつもりで話しています。
「非同期」は定着してますが、はっきり言って誤訳です。
read() でデータが来るまで待たされる ⇒ ブロック
read() でデータが無いとステータスが返る ⇒ 非ブロック
read()? を実行しても忘れた頃にデータが返って来る ⇒ 非同期
であってるの?
そんなところです。
分散コンピューティング、分散アルゴリズムの本を読むと、
かなり詳しく概説してあります。
非同期云々ごときでんなもん薦めんでも
そりゃ、そうかも。
>>666 キューイングセオリー屋ってなんすか?
>UNIXの次にくるもの
Plan9 とか。
>>666 きゃ〜、今月は本代を2マソも使ったのに・・・ホスイ
>>670 いろいろ勉強し出すと本代ってどんどん増えてくよね。
図書館行っても糞だし。
近所の大学の図書館にはわりといろいろあるけど…
672 :
デフォルトの名無しさん:04/03/04 20:06
TCPとWinSockでペイントチャットを作ってます。
絵を描いた時のマウス座標を文字列としてお互い送受信してるだけで、
座標6バイト+文字列尾のNULL文字1バイトの計7バイトのデータなんですが、
どうも見た感じ送信側の速さに対して受信の処理が追いついてないような感じで
送信側の動きがダイレクトに伝わりません。取りこぼしをしているのではなく、
受信側が必死に追いかけてやっと再現されてるような感じです。
にもかかわらず、送受信する文字列のサイズを1024ずつ(使うのは先頭7バイトのみ)
にしてみると、なぜか滑らかに伝わります。
でかいサイズを同じ頻度で送受信するので普通に考えると負担が増す思うのですが、
これはなぜでしょうか。。。
ある程度パケットが溜まってから送信する設定になってるから
ありがとうございます。
お馬鹿な〜って症状なんでしょうか。
ネットゲー作ったりするときなんか出来るだけ送受信データを小さくする
ように努力するもんだと思ってたんですが、
小さくしすぎてもパフォーマンスに影響するんですか・・・
(誤読してないとすれば。)
わけわかんなくなってきました。
Nagle アルゴリズムをオフにしてパケットのバッファリングを殺せって事だよ。
>>675 データを小さくするってのは正解だけどそれだけじゃ失格。
各データを使うタイミング情報を付けるなどの工夫するから期待する動作になる。
678 :
デフォルトの名無しさん:04/03/04 21:40
それより、672は、TCP使ってたの?
UDPにするのは常識だと思うが
>>678 UDPでマトモに相手側に描画できるか?
エラー処理とかしてたらTCPの方が良いような・・・
UDPにするのが常識ねぇ…
>>678 UDPにするのも一つの案だとは思うけど、常識か?
動画を見るだけならUDPとかで多少パケット落としながらでも
良いけど、絵を描くとなるとあまり情報が欠落しても困るような…。
試してみる価値はあると思うけど。
>>672 本当にリアルタイムに相手側に反映させる必要があるのかどうかをまずは検討した方がいいよ。
インターネットなんていい加減な環境でまじめにやろうとすると結構しんどいから。
今はたぶん同一のマシンかLANで隣のマシンに並べてテストしてるからラグが
はっきり見えるだけでインターネット越しだったら全然気にならないかもしれないし。
あるいは単に描画がカクカクするのが気になるだけなら
受信パケットをローカルのキューにためておいて
描画に適当なウェイと入れて(例えば最速で0.1秒に1ドット)表示するようにすれば
見た目上は滑らかに描画されてるように見えるかもしれないし。
>>681 > 試してみる価値はあると思うけど。
>>672=675にはまだ早いんじゃないかな。酷くなる一方だと思う。
WindowsのターミナルサービスはTCPで画面描画やってる罠。
X-Window もVNCもそうだよ。
あのへんは描画コマンドを送ってるからパース仕切れなくなると困る。
ただUDP使ってる動画ストリーミングプロトコルにはそれはそれでそれなりの理由があるよ。
>672
本当のリアルタイムはインターネットだとムリ。
googleやyahooにpingして遅延がどのくらいあるのか見て、
どの程度の遅延が許容できるのか考えた方がいい。
俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
もちろんTCP_NODELAY
686 :
デフォルトの名無しさん:04/03/05 00:32
age
>>685 >ただUDP使ってる動画ストリーミングプロトコルにはそれはそれでそれなりの理由があるよ。
なんにしてもペイントアプリにUDPは向かないよ。
もしUDP使った場合一通り送って取りこぼした情報再送するようになるから
最初に歯抜けの線が表示されて後から抜けた部分が補完されてしまってカコワルイ。
>俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
>もちろんTCP_NODELAY
これだけだとカクカクするのは直らないでしょ。描画開始のラグが減るだけで。
パケットにGetTickCount使った時間情報仕込んでおくといいのかも。
>>685 >俺ならマウスを押してから離すまでのストロークを記録して、ある程度長くなった時点で送るね。
これが一番分かりやすくて良い方法なんじゃないかな
>>672
>>687 >パケットにGetTickCount使った時間情報仕込んでおくといいのかも。
これは当然仕込んでおくと思って
>>688を書きました。
>>688 >これが一番分かりやすくて良い方法なんじゃないかな
>>672 5秒かけて線引いた場合、相手側に表示が始まるのは5秒後で終了するのは10秒後だろ。
あまり賢いやり方ではないな。
>>676 じゃダメなの?
たまにインターネット越しに X 飛ばすけど、それ程問題を感じてないなぁ。
>690
なんで同じ速度で線を引くんだ?
あと「ある程度の長さになったら」ってのも理解してないよな。時間とか距離とかストロークの区間とかで判断できるじゃん
>>691 負荷で不可。個人使用なら実害はないだろうけどさ。
>>693 >あと「ある程度の長さになったら」ってのも理解してないよな。
>時間とか距離とかストロークの区間とかで判断できるじゃん
1ドットごとにsendしとけばそこらへんは時間またはサイズを見て
WinSockが勝手にやってくれるんだから二度手間。
だいたいUDPと大文字でタイプする時点で釣りだろ。
頭文字だからいいんじゃないの?
つかこれも釣りか?
697 :
デフォルトの名無しさん:04/03/05 03:23
>>696 全角文字のことを大文字と言う人が結構いるものだ。
どうも、色々ありがとうございます。
やっぱり手描きチャットなんで、作るんだったら
相手の腕の動きの生々しさまで伝わってくるようなものを作りたいです。
なので
>>672に書いた通り、真面目に座標一つ拾うごとにsend・recvして
テストしていたわけなんですが(ローカル環境で)、
どうも見た感じ送受信のタイミングがずれるみたいだったので、
座標を拾ったりsendする間隔をtimeGetTimeで大きくして補完する
というのも試してみました。が、やっぱり見た目がちょっといまいちな感じでした。
それから今度は同じローカル環境で単に1024バイトとかデカイ文字列に入れてみたら
座標一つ拾うごとの送受信でもなぜか上手くいったので(座標は先頭の数バイトに一個だけ。)
友人宅と繋いでテストしてみたんですが、相手の描いた絵はこちらに滑らかに伝わってきたものの、
こちらの絵が相手には点々でしか伝わらなかったようでした。
こりゃデータサイズが大きいしこっちの上りが遅いからかなぁ、とか適当に結論付けたのですが、
TCPなのに取りこぼしってするんですかね?(実はこの辺すらよくわかってなかったり。。。)
とりあえずタイミングをずらす原因となっているオプションを切り替えてみるのと、
時間情報と合わせて拾った何個かの座標を一括して送り相手側で再生する方法を
試してみようと思います。
>>698 > 座標を拾ったりsendする間隔をtimeGetTimeで大きくして補完する
> というのも試してみました。が、やっぱり見た目がちょっといまいちな感じでした。
なんてやる前に、
> とりあえずタイミングをずらす原因となっているオプションを切り替えてみるのと、
をやりなよ。NO DELAYでね;-)
700 :
デフォルトの名無しさん:04/03/05 09:38
700
701 :
デフォルトの名無しさん:04/03/05 10:33
listコマンドを行うと↓のような形式で表示されるのですが
drwx---r-x 7 qqq hpusers 4096 Nov 20 14:25 . @
drwx---r-x 8 qqq hpusers 4096 Oct 4 2002 .. A
この時に、日の後は時間や年になっているのですが、
@の場合の年は何年か?Aの場合の時分は?
と、悩んでおります。
この謎を教えてください
この板のこのスレを選んだ基準は?
ls --full-time
>>701 FTP の LIST コマンドのことだと推測。
つか、人に推理ゲームさせないで最初から書きなさい
>>701 質問に対する答えは
(1) 過去の6ヶ月以内の日付(GNU ls の場合)
(2) 表示されないため、そこから知ることは不可能
代案は
1. MDTM が実装されていればそれを使う。
2. オプションが渡せれば --full-time (GNU ls の場合)
ネットワークの達人のみなさま。教えてください。
いまソケット(TCP)でプロセス間通信をしようとしています。
サーバとクライアントがいて、クライアントからの電文をサーバで受け、応答します。
この場合、C->Sへの電文が喪失したり、その応答が喪失したり、タイムアウト後に送れて届いたりといったことは
発生するのでしょうか?TCPは相手にできる限り届けるプロトコルということをどこかで読みました。
すると喪失したら再送はTCPが責任をもって行うのでしょうか?
それともアプリで応答がない場合はもう一度送るなどの処理を入れるのでしょうか?
よろしくお願いします。
>>705 遅れることはある。再送は責任もってしてくれる。
>>707 注:届かない時は届かない
まぁ、俺も未だかつて見たこと無いんで真偽のほどは分からんが、
会社の上司から「実際にあった」と聞いた。
>>708 届かないときは recv() に -1 が返って来るけど
何のエラーもなく届かなかったってこと?
>>709 その通り。
ここらへんはRFCでも定義されてなかったと思うから、実装によって挙動は違うかもしれない
少なくともBSD系では、送り側の配送失敗は明示的にエラーが出ない。
で、そんな場合でもコネクションは切れてないから受信側でもエラーは検出できない
すると、バイトストリームの途中がぽっかり抜けて受信されて、途中からデータがおかしくなる。
結局どう解決したかと言うと、全MSGの頭にSignature付けて毎回確認したそうな。
まぁ、普通は完全におかしなデータ受け取った時点でコネクションを
切るけど、その時はそれができなかったんだとさ。
#嘘言ってたら突っ込みよろしく( ̄▽ ̄)ノ
write(socket,buf,1024)としたのに戻り値が1023以下ということはあったはず。
のでwrite()の戻り値をちゃんとチェックすれば大丈夫じゃなかったっけ?
>>712 それは送信バッファに入らなかった時じゃないか?
TCPは送信バッファに入った後に、再送も含め配送の処理を行うから
そこでエラー起きると、writeの戻り値じゃ判断つかないと思う。
>>713 だとしたら、それはTCPスタックのバグだろう。
>>711 そんなことはありえない。送受双方が同時に糞スタックでない限り。
実装ごとに違うのではなくて、まともな実装としては認められないものでしか起き得ない。
仕様を読めば分かる。seq#が先に進まないから。
>>712 そう。
>>712 もしそんな危機的なことが起きたら、接続が切られます。糞スタックでない限り。
>>713 ですね。
716 :
デフォルトの名無しさん:04/03/06 01:16
ああ、みなさん。いろいろレスありがとうございます。
とりあえずまとめてみます。
理論上は、
1 電文が喪失した場合はTCPが再送してくれるが届かないこともある。そのときは受信側でrecvが-1を返すので判定できる。
2 電文が遅れて到着することがある。
3 write(send)の戻り値は送信バッファに格納できたバイト数であり送ったバイト数ではない。
アプリケーションとしては
1への対処:(C->Sに要求を出したと仮定)
サーバでrecvの戻りが-1だった時はNGを応答する。
クライアントはそのNG応答を正しく受け取った場合、送りたかった要求を再送。
正しく受け取れなかった(recvが-1を返した)場合はやっぱり要求を投げなおす。
2への対処:
サーバやクライアントが遅れて到着したものを受けて誤動作しないよう、TCPの上の
層(アプリ)でシーケンス番号を割り振ってチェックする。おかしいのははじく。
といったところでしょうか。(うーん。なんかまちがってそう)
>>716 > 2への対処:
> サーバやクライアントが遅れて到着したものを受けて誤動作しないよう、TCPの上の
> 層(アプリ)でシーケンス番号を割り振ってチェックする。おかしいのははじく。
補足:
TCPソケットはストリームなので同一ソケット中でデータが前後することはない。
ありえるのは複数のソケットに書き込みしたとき、順番通りに到着するとは限らないってこと。
>>716 > (うーん。なんかまちがってそう)
全然ダメです。
>>1のFAQから勉強し直しです。
>>716 >1 電文が喪失した場合はTCPが再送してくれるが届かないこともある。
この曖昧な書き方、やっぱり解ってないんじゃない?
TCPを使っているなら必ず届くまで再送してくれる。
もしいつまでも届かない場合があったならば、それはTCPの問題ではなくネットワークの問題。
途中でADSL回線がぶちきれたとか、ケーブルが抜けおちたとかさ。
このときTCPが異常を発見できれば、発見した方(またはsend、recvの両方)で-1が返る。
エラー処理なんか考えなくていいよ
>TCPを使っているなら必ず届くまで再送してくれる。
>もしいつまでも届かない場合があったならば、それはTCPの問題ではなくネットワークの問題。
という表現も曖昧じゃない? はっきりとTCPタイムアウトについて説明した
方がいいと思う。
質問スレにも書いたんですが
スルーされてしまったのと、こちらのスレで聞くほうが適切だと思ったので再度質問させてください。
WinSockでWSAAsyncSelectを使い
イベント受信で処理するサーバープログラムを組んでるんですが
複数の接続がある場合、個々の接続に対応するにはどうすれば良いのでしょうか?
その時のsocketにそのまま返せばOKですか?
>>722 マルチ氏ね。
しかも、>1や過去ログも読めないのかよ。二回ほど氏ね。
>>711 send() が失敗して recv() に -1 が返ってくるのはかなーーーーり遅いので
何も返って来ないと勘違いしてるだけでは? 10分以上掛かるんじゃないかな。
>>719 send() が失敗したときに send() にエラーが返って来ましたっけ?
>>722 FD_ACCEPT が来たら accept() すれば良いだけでわ?
でソケットを取得したら、FD_READ, FD_WRITE で WSAAsyncSelect() にぶち込むか
スレッドでも作れば?
726 :
デフォルトの名無しさん:04/03/07 02:01
DNSのような問い合わせに対して返すシステムを組んでます。
返すデータもIPアドレスなので、少量なのですが
UDPの方が良いかな?と迷ってるのですがどうなんでしょうか?
一応数万の問い合わせが有るシステムなのですが・・・・
ただ、問い合わせにあまり失敗されてレスポンス悪くなっても困るんでTCPにすべきなのか迷ってます。
助言お願いします。
プロトコルを選ぶ基準が…
HTTPにして複数台サーバ立ててLBしたほうが運用上も楽かもしれんよ。
レスどうもです。
う〜ん、実はHTTPでやった方が楽と言う気も確かにして来ました。
もう少し考えて見ます。
どうもありがとうございました。
一応数万の問い合わせ/sec
数万/secって・・・そりゃどの方法を使っても厳しいと思うが。
つか商用サイトか?だったら2ちゃんなんかで相談するのは間違ってるぞ。
え〜と、問い合わせする可能性のあるクライアントが数万と言うだけで
それらが同時に問い合わせする事は考えにくいです。
待ち行列理論
そもそもDNSってなんでUDPなの?
>>736 UDPの方が高速で軽いから
DNSのような少量のデータで、特に信頼性もいらないような通信だと好都合
っていうか、TCPにしたら、IPアドレスより容量のでかいヘッダをつけなければならなくなって
理不尽だと思うw
中身より高価な財布を持つくらい不毛
10バイトのデータを TCP でやりとりしている漏れの立場は・・・
10バイトだろうが1バイトだろうが、簡単に落ちたら困る場合はTCP。
DNSもネームサーバ間のブロック転送だかでデータ量が多くなると
TCP使うんじゃなかったっけか。
Winnyって、通信は非同期式なんですかねー?
アプリがsocketをどう使ってるは知らんが、通信はTCPだ。
>>741 nyをブロッキングでやってたらどれだけThread作らねばならん事やらw
ログみりゃ分かるけど、あれを全て独立したThreadでやってたらシステムdじまうぞ
む・・・、今同期式でいちいちスレッド起こして作ってるんだが、非同期式に変えた方がいいのかのー・・・。
とりあえず一通りできて、パフォーマンスやばかったら考えよう。。
>>744 とりあえず動くまではそれでいいと思うYO!
同期、非同期、ブロック、非ブロックは区別して書いてくれ。
nyはselect()使ってるっぽいなぁ。
748 :
デフォルトの名無しさん:04/03/07 21:26
わからないとこがあるので、教えてほしいのです。
ソケット+マルチスレッドな簡単なサーバソフトを作りたいのですが、以下のところでつまっています。
わかる人、助言ください。
環境はSolarisです。
途中はちょっと省きます。
main{
socket作成
bind
listen
while(1){
/*アクセプト*/
sock2=accept(XXX);
/*スレッドへ処理を移行*/
pthread_create( NULL,NULL,func, sock2);
/*ソケットをクローズして待ち状態にする*/
close(socket);
}
}
void func(socketの型 sock){
sockを用いた処理
exit(0);
}
で、スレッドへ移行して、処理をさせる場合、acceptで取得したsock2をどう渡したらいいかわかりません。
また、このとき、スレッドを何個も処理させるためにはどうしたらいいのでしょう?
よろしくおねがいします。
pthread_createの4個目の引数でしっかり渡してるじゃん。
狐憑き自動筆記か? 自分で応えてるじゃん
>>736 domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
TCP使いたければどうぞ。
最近思った
ソケットプログラミングって、初めはコンソールで作ると簡単だ とどの入門書にも書いてるが
WindowアプリでWSAAsyncSelect()でイベント駆動にした方が簡単ジャン
って思うんだが・・・・
イベント駆動にどの程度慣れているかの問題だと思われ
753 :
デフォルトの名無しさん:04/03/08 17:05
そういえばTCP/IP以外の質問もしていいのか・・・
>749
レスありがとう。
pthread_create( pthread_id* ,pthread_attr_t*,void* func(void *),void* arg);
pthread_createの4番目の引数は void *argで定義されているため、
値渡しができないと思うのですが。
で、下のはポインタの間違いでした。
void func(socketの型 *sock){
sockを用いた処理
exit(0);
}
sockをポインタで渡すと、呼び出されたfuncの中で値をコピーする必要がある
と思うのです。しかし、スレッドで呼ばれているので、次の瞬間には、別のアクセスが
来て、コピーする前にsockの中味が変更してしまう可能性があると思うんです。
また、acceptで取得したsockに伴うsockaddr_in構造体を渡してあげなければ、
funcの中でソケット通信ができないのではないでしょうか?
このようなとき、マルチスレッドでソケット通信した場合、スレッドはいくつくらいまで
同時に処理できるでしょうか?
(listenで用意した数よりも多くできますか?)
よろしくお願いします。
>>755 intをポインタにキャストして渡す。
#ある入門サイトを見るとそうやっているんだよなぁ・・・
>>756 > intをポインタにキャストして渡す。
そうすると、ANSI C的にはお行儀が悪いので、(多くの処理系では無問題)
intの値をメモリ上に持ってそのアドレスを渡す。
>>755 > sockをポインタで渡すと、呼び出されたfuncの中で値をコピーする必要がある
> と思うのです。しかし、スレッドで呼ばれているので、次の瞬間には、別のアクセスが
> 来て、コピーする前にsockの中味が変更してしまう可能性があると思うんです。
What is "sockの中味"?
> また、acceptで取得したsockに伴うsockaddr_in構造体を渡してあげなければ、
> funcの中でソケット通信ができないのではないでしょうか?
違います。OSのカーネルについてかなり誤解があります。
カーネルは単なるライブラリじゃないです。
とにかく、
pthread_create( NULL,NULL,func, &sock2);
void func(int *sockp){
*sockpを使った処理
exit(0);
}
をやってみろ。とにかく
mallocしたほうがいいだろうねー
受け取った側で中身取り出したあと、free
>>755 おまいはスレッドの勉強と
ソケットの勉強を
別々にもうちょっとやりなされ
レスしてくれた方々、ありがとうございます。
とりあえず、コンパイルして実行してみます。
762 :
デフォルトの名無しさん:04/03/08 23:59
すみません。winsock2.0についてお聞きします。
ローカルマシンでサーバアプリケーションを起動し、クライアントアプリケーションもローカルマシンで実行して接続するサーバアドレスを127.0.0.1にすると正しく動作するのですが、
LAN上のマシンでサーバを走らせ、LANのアドレスで接続すると、接続はうまくいきますが、127.0.0.1で実行したときと異なる結果になってしまいました。
このアプリケーションは、サーバの画面をキャプチャして、そのバイト配列をクライアントに送信するというものです。
127.0.0.1で実行するとしっかりとキャプチャ画像が送られてきました。
しかしLANアドレスでやるとクライアントが固まります。
おかしいなと思いデバッグしてみました。
すると、データの受信部(recv関数)でクライアントが永遠に待機状態になっていました。
バイト配列は途中まではちゃんと送信されていました。
サーバはデータの送信の終了を知らせるメッセージ"OWARI"を送ることになっているのですが、これが届いていません。
なぜ127.0.0.1ではうまくいくのでしょう。
問題のソースは次に張りますのでよろしくおねがいします。
/サーバ/
int BytesSent;
int bufLen = w*3*h;
BYTE* b ;//ビットマップのバイト配列
do
{
BytesSent = send(connectedSocket,(char*)b,bufLen,0);
b += BytesSent;
bufLen -= BytesSent;
}while(bufLen>0)
send(connectedSocket,"OWARI",strlen("OWARI"),0);
/クライアント/
BYTE* b//DIBのバイト配列へのポインタ;
int BytesRecv;
bool flag = true;
char bytes[1024+1];
ZeroMemory(bytes,1025);
while(flag)
{
BytesRecv = recv(soc,bits,1024,0); //←しばらく受信するとここでとまります
bits[BytesRecv]='\0';
string str=bytes;
if(str=="OWARI")
break;
memcpy(b,bytes,BytesRecv);
b += BytesRecv;
}
急ごしらえなので、使わない変数や無意味なフラグがあって見辛くてすみません。
>>763 > BytesRecv = recv(soc,bits,1024,0); //←しばらく受信するとここでとまります
> bits[BytesRecv]='\0';
bits→bytesの誤りか?
> string str=bytes;
> if(str=="OWARI")
なぜ"OWARI"がバッファ先頭にあることを仮定しているのだ?
それからな、str=="OWARI"はないだろ? strcmpしろよ。
C言語の修行し直してからまた来なさい。
非常に参考になりました。どうもありがとうございます。
C++のstringだとしたら == でもいいぞ
stringだろ?w
==でいいじゃん
俺も765と同じつっこみをしようと思ったが、すぐうえのstring str=bytes;を見てやめた。
環境
・OS Windows2000 SP4 MS VC++6.0インストール済みのところに以下の手順で、ONC/RPC for Windowsを
インストールしました。
1)
ttp://netbula.com/oncrpc/ より ONC/RPC for Windows V1.14.3のインストーラをDLし、
デフォルトでインストール。
2)コマンドプロンプトで以下を実行するとエラーメッセージが表示されます。
C:\oncrpc\test>..\bin\rpcgen cou.x
C:\oncrpc\bin\rpcgen.exe: unable to open cpp32: No such file or directory
rpcgen.EXEが CL.EXEを使用するということなので、環境変数PATHにVCのCL.EXEの存在する
ディレクトリを設定しています。
まだなにか設定が必要なのでしょうか?
やっとできました。
結局、w h の文字列長を先に1バイトづつ送ってやってから、縦横のサイズをあらわすデータを受け取ることでズレを解消しました。
しかし、TCPは原始的で面白いですね。
「TCP が原始的とは(ry」と言うオヤジが出てくるのに 30 フレーム。
TCP が原始的とは(ry
ライブラリ任せのどこが原始的なのかと
>>770 ONC/RPCとやらは使った事ないからよーわからんが、エラーメッセージ
に出てるcpp32.exeってBorland C++とかじゃないのか?
付属ドキュメントがあるなら隅々までよく読んでみろ。
>>775 ありがとう。
付属ドキュメントないから、バイナリエディタで rpcgen.exe見てみたら、
Borland C++用に作られたものでした。
他のwin32用の添付バイナリもBorland C++で作成されてました。
しょうがないので付属ソース変更して VC用に作ります。
sendの戻り値が0ってことある?
>>772 俺なんて糸電話だぜ!
パケロス・パケ化け激しすぎ
バカ野郎、俺の使っている伝書鳩は
最近遠距離通信を自粛するようになっちまって
パケットが届かないんだよ。
ここは「優秀な伝書鳩の育て方」について議論するスレになりますた
質問です。
どうも理解出来ないところで例外が発生してしまいます。
UDPのSOCKETを返すクラスを作成し
NET_SET *netset;
netset->UDP_SET(hWnd);
と言うコードをBOOL InitInstance()の中に書いたんですが・・・
メンバ関数を呼び出す所で例外が発生してしまいます。
ちなみに以下がクラスの内容です。
SOCKET NET_SET::UDP_SET(HWND hWnd)
{
SOCKET listen_sock;
SOCKADDR_IN saServer;
int nReturnCode;
WSADATA wsaData;
WORD wVersionRequired = MAKEWORD(2,1);
/******************************************/
/**********WinSock DLLを初期化する************/
/******************************************/
nReturnCode = WSAStartup(wVersionRequired, &wsaData);
if (nReturnCode != 0 )
{
//エラー通知
return listen_sock;
}
//要求したバージョンを利用できるかどうか確認する
if (wsaData.wVersion != wVersionRequired)
{
//要求したバージョンを利用できない事を通知
WSACleanup();
return listen_sock;
}
/******************************************/
/**********WinSock DLLの初期化完了************/
/******************************************/
/******************************************/
/*************SOCKETを作成する**************/
/******************************************/
listen_sock = socket(AF_INET, SOCK_DGRAM, 0);
if ( listen_sock == INVALID_SOCKET)
{
//エラー
WSACleanup();
return listen_sock;
}
/******************************************/
/*************SOCKETの作成完了**************/
/******************************************/
/******************************************/
/*************非同期処理に指定***************/
/******************************************/
nReturnCode = WSAAsyncSelect(listen_sock, hWnd, SM_EVENT,
FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE
);
if ( nReturnCode == SOCKET_ERROR)
{
//エラー
closesocket(listen_sock);
WSACleanup();
return listen_sock;
}
saServer.sin_port = htons(IDS_PORT);
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY;
if( bind(listen_sock, (LPSOCKADDR)&saServer, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
closesocket(listen_sock);
WSACleanup();
return listen_sock;
}
return listen_sock;
}
以上です。
よろしくお願いします。
質問の仕方すら知らないのかね?
> どうも理解出来ないところで例外が発生してしまいます。
> メンバ関数を呼び出す所で例外が発生してしまいます。
失礼。例外はあのわけわからんメッセージね。
NET_SET *netset; // ←
netset->UDP_SET(hWnd);
例外といっても色んな種類があると思うのだがどうなんですか?>マ板のみなさん
789 :
デフォルトの名無しさん:04/03/09 22:11
正確に呼び出し部分のコードを書いたほうがいいのでは?
ポインタ宣言だけして、いきなりメンバ関数を呼び出してるように見えてしまう。
>あのわけわからんメッセージ
ってどれやねん。
>>792 あのメモリ保護違反の奴(メモリがreadに……)
NET_SET *netset; // ←
netset->UDP_SET(hWnd);
を見てそう思った。
というか、ネットワークプログラミングじゃなくて、初級プログラミングですね。
796 :
デフォルトの名無しさん:04/03/10 00:30
エントロピーとかハミング符号化とかがまったくわかりません
どなたか情報理論に関するお勧めな本知ってたらおしえてください
すれ違いでごめんなさい
>>796 ハミング符号化を行うとデータ量を1/3に出来る。
これを商品化に成功したのが花王。
799 :
デフォルトの名無しさん:04/03/10 01:50
スレ違いの質問してるくせにずいぶんと偉そうだな。
おしえてよ
テーハミング符号化
自分の都合の良いように真実を書き変える非可逆圧縮方式。
>>796 「アドレス00000000に対する違反が起きました。」か?
1●CLIE ◆GodOnnFcO.が何か書き込んでも放置で。
> 1●CLIE ◆GodOnnFcO.
qb系のサーバのコテハンみたいだけど、まじでウザい。
>>796 スレ違いの話題を延々続けるお前には理解不能かと思われ。
qbではない。ロビーだかラウンジだかそのへんの固定。
いずれにしろ駄コテ。相手にする価値なし。
809 :
デフォルトの名無しさん:04/03/14 22:53
WSAAcceptを使って、接続時にデータを渡せるのだが、
これを実装できた人いる?
810 :
デフォルトの名無しさん:04/03/14 22:53
WSAConnectも
質問の仕方がなってないな
初めてネトゲつくりに挑戦するので作り方知らないので教えてちょ。
環境:winsock 2.0 OS:windows2000
メッセージのFD_WRITEについてなんですが下の実装見てください。TCPを使ったネットワークゲームの根幹を作ってます。
スペースのため簡略化してあります。
class client
{
public:
vector<my_message> messages;
SOCKET sock;
void SendData(){};//messagesに溜まっているメッセージを1つづつ送信しては削除する
void AddMessage(my_message msg){messages.push_back(msg);}
};
vector<client> clients:
//switch
FD_WRITE:
for(int i=0;clients〜)clients[i].SendData();//WPARAMと同じソケットを持つプレイヤーオブジェクトをforで探して、データ送信メソッドを呼び出す
//送信するメッセージが無ければ何もしない。
//
こうやったときに、送るべきメッセージが無かった場合そのままsendせずに通過してしまうので、再びFD_WRITEが送られてくることは無いのだ、と私は考えています。
ということは、以後clientオブジェクトに送信すべきメッセージが追加されても、FD_WRITE通知は来ないのでforループでマッチせず、データ送信メソッドを呼び出せなくなります。
この実装方法だとやはり問題があるのでしょうか。
clientクラスにboolで送信可能かどうかを示す変数でも持っておいて、フレームをアップデートするときにその値を見て送信メソッドを呼び出すべきでしょうか?
その場合も何か問題はありますか?
age
>>814 なるほど。FD_WRITEは単なるメッセージなのですね。
わかりました。どうもありがとうございました。
っていうか、サーバー側でWSAAsyncSelect()使う意味ある?
確か、Window移動させたりすると、FD_ACCEPTとか応答関係全く動かなくなるんだよね?
>>816 非同期モードを使わない場合、各ソケットの送受信のためにスレッドを大量に作らなければならないと聞きました。
現在普及しているようなネットゲームのサーバでは同期モードを使うのが一般的なのでしょうか。
> 非同期モードを使わない場合、各ソケットの送受信のためにスレッドを大量に作らなければならないと聞きました。
どこで聞いたんだよそんなデタラメ
この板です。
>>25 >>32 >>33 >>34 >>37 私の読解力不足かもしれません。
でも今考えてみたら、1万もコネクションは無いんです。24〜300ぐらいを想定してます。
しかし、同期モードでやる場合、各ソケットごとにスレッドを作らないとsend recvで固まってしまいます。
300ぐらいならスレッド作っても大丈夫なんでしょうか。
もしかして、ioctlsocketですか?
ブロッキングと非ブロッキング、同期と非同期は区別しろとよく見かけましたが、これがまさにそうだったんですね。
いや、、何もWSAAsyncSelectでイベント駆動型にしなくても良いじゃん
>>816の言うようにイベント駆動型だと、Window弄ってたりするとその間まったくnetwork関係のイベント発生させれないんだし
鯖の場合不向きのような・・・
Windowの再描画などのイベントより
ネットワーク関係のイベントの方がずっと優先度が高いので
ネットワークイベントのメッセージがたくさん来ると
ボタンも押せないしWindowの移動も出来なくなるのだが。
だからサーバー動作向きというわけではないが。
>>822 ADSL以上の回線のかちゅがまさにその状態ですね
824 :
デフォルトの名無しさん:04/03/16 16:01
>WSAAcceptを使って、接続時にデータを渡せるのだが、
>これを実装できた人いる?
できた人いたらサンプルソースキボヌ。
プロシージャ関数に、WSAconnectで指定されたデータを受け取れると思うのだが、
受け取れないので。
>>819 IOCPつかっちゃだめかな?
Win9x系だと動作するか妖しいけど…
沢山アクセプトしても自分で立てて設定した数のワーカースレッドで
全ての送受信の管理できるから便利だよ。
でもゲームで使って使いやすいかどうかはしらないけどねー。
UIスレッドと通信スレッドは分けろよ...
>>819 select()使えよselect() !
>>825 IOCPのサンプルコードのあるサイトないですか?
>>828 >825ではないが、
GetQueuedCompletionStatus, CreateIoCompletionPort
こいつら検索かければそれっぽいページがひっかかると思う。
俺は日本で見つからなかったから海外サイトからサンプルひろったよ。
まぁ、ゲームに適しているかは知らないけど、
Win2Kで沢山のソケットの送受信を管理したいなら、
スレッド300個起動よりはIOCPの方がスマートだとは思う。
>>830 IDirectPlay8NATResolverと同じ考え方なんじゃない?
どっか外部サーバーにアドレスを登録させて、その情報を使ってUDPで通信って感じでさ
NAT or FW背後のクライアントだけで、相互接続させるのはさすがに無理だと思うよ。
>>830 さすがに、最初に接続をコーディネイトするサーバは必要。
コーディネイト後は、両者にUDPに暗黙の穴を空けて、直接P2P通信。
>>831-832 レスありがとうございます
アドレスを管理するサーバが必要なのは納得できるのですが、
UDPで暗黙の穴をあけるというのは、どのような手法でしょうか?
ルータの外からはUDPもたいてい遮断されると思うのですが、
特別な方法があるのでしょうか?
>>834 833じゃないけど
その技術前々からやりたいな と思ってたんですが・・・・
良い資料ないですかね?
少しWinsockのUDPでの通信プログラムを実装出来る程度の技術では無理でしょうか?
もっと低レベルの部分弄らないといけないのかな・・・
836 :
デフォルトの名無しさん:04/03/17 17:03
簡単に説明すると
ポート0同士の場合
AとBと鯖のSがあったとする。
Aがポート51(仮想上のポート)からSのポート50へ送信
BがAのポート51へ送信すると、Aのポート50に何故か送信できるってわけ。
実装は簡単でしょ?
おっと、リロードするの忘れてました。
>>836 Aのポート50というのが何のことかと、仮想上のポート51というのがよく分からないです。
よろしければ、詳しい解説お願いします。
>>829 ありがとうございます。
>スレッド300個起動よりはIOCPの方がスマートだとは思う。
select() で 500ソケット管理するアプリを作った漏れはアフォですか?
>select() で 500ソケット
これってパケット来なくてもCPU100%使っちゃわない?
待ち時間長めにとるとレスポンス悪くなるし。
まあ求める物が違うんならどの書き方でも良いんでない?
スレッド300個は300が同時に処理できる代わりに、ススループットも分割されるでしょ。
IOCPはスループットを確保できる代わりに処理が始まるまでの遅延がおこる場合も考えられるし。
まあ通信相手から見たら同じことかもしれんな。
ススルー(・∇・)プット
>>841 待機中にCPUを食ってるってことは無いですが。
>>842 スレッド300個が同時に動くとメモリとCPUの取り合いが起きて
スループットが予測出来ませんよね。
15スレッドに20接続ずつやらせりゃいいんだよ。
何で同じ議論が何回もループすんだか・・・┐(´д`)┌
スレッドはスタックとコンテキストスイッチのオーバーヘッドを生む。
select()系だけだと検査に無駄なオーバーヘッドを生む。
サーバープログラミング?
I/Oコンプリーションポート マンセー!
>>845 select()ってそんなにオーバヘッドあるの?
>>845 > select()系だけだと検査に無駄なオーバーヘッドを生む。
selectだと検査に無駄なオーバーヘッドを生む。
poll,kqueueだと検査のオーバーヘッドは少ないが、マルチスレッドと違い並行性が稼げない。
pollはselectと同系統だろ。
本質的な性能の悪さは解決されない。
>>851 kqueueをpollと一緒くたにされたら、BSD方面の方々が怒るんじゃないの?
epollや/dev/pollと一緒にするならともかく。
kqueue, /dev/poll, epoll に比べたら、pollもselectも50歩100歩だと思う。
上の方でスレッドだ、select()だ言ってるの見て書いただけなんで、
細かいとこは突っ込まないでくれ・・・Σ(´D`lll)
1スレッドでpollingでやってたらリクエスト処理(ディスクI/Oとか)の間は
他の接続の相手できないから、結局はどっかで並行性の問題が生じる。
(OSが適当にスレッドプールして割り当ててくれるんなら話は別)
かといって、大量のリクエストを処理するのに全てスレッドで実装していては
ネットワーク以外のオーバーヘッドが大きすぎるし、最大数が狭められる。
ようするに、単独の手法でやるより、複数組み合わせた方が
スケーラビリティ的にはいいだろう、ってこと。
その分実装は複雑になるから、費用対効果ってとこでしょう。
鯖なんだから、非ブロックで無限ループまわしときゃいい気がするけど…。
あ、想定してるのはMMORPGの鯖ね。
ゲームフレーム単位で動作させるから、非同期とかせずこれでいいかなと。
859 :
デフォルトの名無しさん:04/03/18 12:26
質問です。
Winsockで
recv()の戻り値って
0またはSOCKET_ERROR(-1)ですよね?
正常受信判定で
if(recv(sock, buf,10000, 0)>0){
こんなコード書いてるサンプルをみたんですが・・・
これだと、判定に使えないような。。。
860 :
デフォルトの名無しさん:04/03/18 12:35
>>859 正常に受信してるなら受け取ったバイト数が返ってくる。
MSDNLibraryにも
----------
If no error occurs, recv returns the number of bytes received.
If the connection has been gracefully closed, the return value is zero.
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
----------
と書いてあるが?
>>859 受信したバイト数をどうやって知るんだ(笑)
ありゃ、遅かった
>>860 え〜と、、
『Winsock2.0プログラミング』
の
クイックリファレンスには、戻り値がそう書いてたんですが・・・
調べてみます。
どうもです。
なるほど、、そういう事だったんですか!
どうもありがとうございました!!
>>865 『Winsock2.0プログラミング』には
「recv()の戻り値は0またはSOCKET_ERROR(-1)」
って書いてあるの?
>>862 まあ、UDPかつblockingだとパケットは丸ごと読めて、
なおかつ中身見れば終端が分かる時は必要ないから、
あの断片だけでは問題があるかどうか分からなくはないかな?
>>868 ほんとに?「エラーの戻り値は」とかじゃないの?
>>657でお勧めに挙げられてるけど、嘘っぱちか?
俺の持ってるやつは2003年7月11日 第11刷発行だけど
戻り値
0またはSOCKET_ERROR。
って書かれてるね。
うへー、recvは切断かエラーを判定するためだけの関数なのか(笑)
>>856 >(OSが適当にスレッドプールして割り当ててくれるんなら話は別)
これをやってくれるのがIOCPだと解釈してるんだけど違うのかな…
スレッドプールでスレッド10個立てて、動いていいのは5個までと設定しておけば、
送受信の結果を受け取ると動いているスレッドが5個になるよう調節してくれる。
5個全部埋ってる所に新しい完了の通知がきたら、
既に仕事をしているスレッドがまた通知待ち状態に戻るか、
ブロッキング関数で停止してる状態になったスレッドが発生すると、
その時動いているスレッドの数が5個になるようプールから1つスレッドが動き始める。
一時的に動いているスレッドが6個以上になる事もあるけど、
通知待ちの所でまた5個になるよう調節される。
15スレッドで1スレッド毎に20個のソケットを処理させるって感じではないが、
スレッドプールの数を30辺り、アクティブスレッド数15で設定して、
300個のソケット管理をIOCPに放り込めば同じ事ではないのかなと思うんだけど…。
ちなみにMS御推奨のIOCP使用時のプールとアクティブスレの数は、
プール=プロセッサの数x2 アクティブ=プロセッサの数だったかな…。
アクティブの方をプロセッサの数以上にするとスレッドコンテキストの切り替えで
無駄な時間を取られるのでお勧めしないとか書いてあったと思いました。
でも、動けばいいじゃん、そん位さ、とか思ったり。
>>838 俺は>836ではないが…
ClientA,BとそいつらがA',B'っていうルーターを使ってたとして、
AやBがSとのパケのやり取りでA',B'に開けた動的NATの情報を鯖経由で交換して、
お互いその穴へ向けてパケット送ればNATの壁を越えてUDPの送受信が可能という事では?
動的NATって送信先が変わったら設定変わらないの?とかいう質問はカンベンな。
貼ってあるURLの資料みてこういう意味かって思っただけでNATがどうとかは詳しくないからさ。
しっかし、、
その仕様って有る意味怖いよな。
セキュホになるじゃん。。。
>>876 いろいろ勘違いしてたこともありましたが、試してみたところ、
いくつかの環境では送信先変わってもルータのポートは変わらず、
UDPの送受信が可能でした。
他の環境ではどうなるかわかりませんが、
さらにいろいろ調べてみようと思います。
これって、プライベートIPアドレスな人でもOKなのかな?
ISPのNATがそんな簡単に貫通するとは思えないけど・・・
>>875 >プール=プロセッサの数x2 アクティブ=プロセッサの数
1CPUだとアクティブスレッドが1?
シングルスレッド鯖と何処が違うの?
1つのCPUで2つのスレッドを同時にアクティブにする……!?
H.Tなら出来るんじゃない?
そもそもMSは市販PCで作るサーバなんて相手にしてないだろ
つまりちゃんとした自社製品を買(ry
>>882 スレッドプールから起動されるスレッド数の上限と、
>>875の文章ならそう解釈するるのが妥当だろな。
アクティブスレッドの数がプロセッサ数を越えるとコンテキストの書き換えが…
って書いてあるし。
つかMSのサイトに書いてあるっていうから見に行けばいいんだろうが、
>>875も気を利かせてURL位張ってくれればいいものを…
暇だから自分で探してみますかね。
886 :
デフォルトの名無しさん:04/03/19 10:47
OS:windows2000
言語:MSVC++6.0
LANで結ばれている別のマシンに登録されているサービスの起動/停止を
行うためのAPIはありますか? また、APIがない場合何らかのコマンドで
実行することは可能ですか?
ローカルマシンなら起動/停止するやり方をしてっているのかと・・・
889 :
デフォルトの名無しさん:04/03/19 13:15
前に
>>812でネットげーについて聞いた者です。
あれから、サーバとクライアントの間でアカウントとパスワードで認証して、サーバがプレイヤの位置情報を送信し、受け取った位置をクライアントの3D空間の視点とするシステムを作りました。
クライアントはキーUpDown情報をサーバに送信し、サーバは受け取ったキー情報からプレイヤの位置を計算します。
サーバは1フレーム計算するごとに全プレイヤの位置を全クライアントに送信します。
すると、1秒間に2回ぐらいしか位置情報が届かず画面がカクカクになってしまいました。
どのように改善すればよいのでしょう。
要約は次のようになります。
Server::NextFrame()
{
//位置情報メッセージを生成して渡す
for(i){
for(j){
Message msg;
msg.vec = client[j] -> GetPos();
msg.type = MSG_POSITION;
client[i]->AddMessage(msg);
}
}
//各クライアントオブジェクトに溜まっているメッセージをすべて送信
for() client[i]->SendData();
//メッセージが来ていたらすべて受信
for() client[i]->RecvData();
ProcessMessage();//受け取ったメッセージの解析 ここでKEY情報を解釈してプレイヤーの位置を変更
}
Client::NextFrame(){
if(GetKeyState(VK_UP)<0){
Message msg;
msg.type = MSG_KEY;
msg.data = VK_UP;
this->AddMessage(msg);
}
Send();//たまっているメッセージを送信
Recv();//到着するメッセージを受信
ProcessMessage();//メッセージを解釈。ここでサーバから来る位置情報を解析して、自分の位置を設定。
BeginDraw();
EndDraw();
Show();
}
892 :
デフォルトの名無しさん:04/03/19 13:17
sageるな
>>889 >サーバとクライアントの間でアカウントとパスワードで認証して
まさかアカウントとパスワードそのまま送ってないだろうな。
>1秒間に2回ぐらいしか位置情報が届かず画面がカクカクになってしまいました。
さすがにそれは遅すぎ。コード見てないからわからないけどもう少し改善できるだろ。
でも改善は出来るけど遅延の完全な解決は不可能。位置情報以外にも移動する方向を送って
次の位置情報が届くまでは直前の方向に動き続けてつじつまを合わせるようなごまかしを実装すればいい。
>>889 つーかそれじゃ判らなさすぎ。
本当に通信部分が問題でここに来たんだろうね?
描画周りを全てOFFにしても速度は変わらないとか、サーバと実行機は別なのかとか情報が必要かと。
812の内容ってことはFD_WRITEとか使ってんの?
それならメッセージ周りの基礎処理はちゃんと出来てる?とか。
>>889 ・通信部分は結局どういう形で実装したか
・通信部分がカクカクの原因だと思った理由
まずはこれを書いてみよ
原因考えたら通信部分に問題ないなら他スレへGO
後接続クライアント数もあった方がいいかも
例にクライアント1つ繋げてそうなったとかだと笑うに笑えない
>・通信部分がカクカクの原因だと思った理由
毎フレーム座標データ交換できないんだからカクカク二なるのは当然。
no_delayに
解決しました。
どういうことかといいますと、サーバ側でfloatで送っていたデータをクライアント側でintにして座標に代入していました。
これによって小数点以下が切り捨てられて、間のフレームが落ちたように見えたのです。
クライアントを修正すると、ばっちりスムーズに300フレームで動いています。
相談に乗ってくださった方々、どうもありがとうございました。
これに懲りずに、また詰まった時はお願いします。
('A`)
「猫でも分かるネットワークプログラミング」を読み終えたので
次はTCPで「一対多」のゲームでも作ってみたいと考えています。
しかしプログラミング自体かなり素人なため
どうしてよいものかさっぱり分らず、アマゾンで色々物色していた所、
「雪田修一 著 UNIX ネットワークプログラミング入門」
という本を発見しました。
これってVC++とかWinSockとかを使いたい、
しかもド素人の私のようなものが買って大丈夫でしょうか。
持っている人がいたら内容とかどんな感じか教えて欲しいです。
「TCP/IPによるネットワーク構築III WinsockVer」も買ってみたものの、
難しくてよく分からなかった、、、というレベルです。
902 :
デフォルトの名無しさん:04/03/19 22:39
recvfrom()の5つ目の引数に送信元のSOCCKADDRが入るんですが
送信元のポートとアドレスを知りたいのです
5つめの引数をどうすれば得られるんでしょうか?
>>902 こんな感じで使ってる
struct sockaddr_in fromAddr;
recvfrom(・・・(struct sockaddr *)&fromAddr,&fromAddrLen);
printf("recvfrom %s:%d",inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port));
>>903 THX!です。
なるほど、sockaddr_inを使うんですか
どうもありがとうございました。
>>900 全然大丈夫じゃないよ。
それはUNIXの本であって、Winsockは扱ってないよ。
内容自体は良いので、きちんとWinsockの関数に読み替えられる
スキルがあれば問題ないけどね。
906 :
デフォルトの名無しさん:04/03/19 23:57
>>886 できます。
>>887 のいうようにローカルの操作するのと同じ。
ただし権限のあるユーザーの場合だけ。
907 :
デフォルトの名無しさん:04/03/20 00:01
Winsock2でUDP使うときってだいたい60KBくらいまで
送れると考えてしまっていいですか?
getsockoptしないで
駄目です。
別にいいよ。漏れは困らないから。
910 :
デフォルトの名無しさん:04/03/20 08:18
8KBならどうですか?
すべてのヘッダ込みで1.5KBまで
912 :
デフォルトの名無しさん:04/03/20 08:39
むとぅ
913 :
デフォルトの名無しさん:04/03/20 08:57
Windows 2000でgetsockoptしたら64KB弱が返ってきたんですけど
この値は意味ないんですか?
64kというのはおそらく送信バッファのサイズと思われ、
1.5kというのは分割されずに遅れる最大サイズということで
>>911 1.5Kってイーサパケットのサイズじゃなかったっけ?
何かで570前後のサイズがIP向けだったと記憶してたが自信ないな・・・
570って最小じゃないか〜?
イーサネットのフレーム長(最大)が1500バイト。
イーサネットフレームの内ヘッダ14バイト、IPヘッダ20バイト。
UDPヘッダは8バイトだっけか。
残りがデータの最大値。
接続形態によっては、たとえばPPP/PPPoEヘッダ等で、もうちょっと減るけどな。
低水準な話はわかんね
918 :
デフォルトの名無しさん:04/03/20 18:12
SendTo()で60KBくらいのデータは一度に送れるけど、
IPレベルでは500バイトや1500バイトに分割されて送られる、
って感じですか。
そうです
920 :
デフォルトの名無しさん:04/03/21 01:56
921 :
デフォルトの名無しさん:04/03/21 03:52
単一のスレッドで複数のクライアントと送受信するサーバにおいて
select(...);
for(int i = 0 ; i < clientnum ; i++)
{
if(FD_ISSET(clientsock[i], &fdread))
{
}
if(FD_ISSET(clientsock[i], &fdwrite)
{
}
}
のようなサンプルを見ました。
selectベースだと送信するときもselectで書き込めるかどうかをチェックしないといけないのですか?
上記ソースのようにしないで別のスレッドとかでsendしたらいけないのでしょうか?
送信バッファが埋まってるとsendでブロックされてしまうから事前にチェックすると言うのが元々の趣旨。
別のスレッドにしてブロックされてもかまわないならOK。
なるほど〜。そういうわけでしたか。
ありがとうございます。
>>920 そうか、プリアンブルもフレームのウチだったけか。
最小つーたのはイーサネットフレームではなくてIPの最小保証MTUのつもり。
今確かめたら576バイトのようだ。
クライアントから送られてきた文字列(CRLFで区切り)を受け取って
それを全クライアントに送信するプログラム(要するにチャットです)を
作っているのですが、大まかな感じは以下のとおりです。
言語はC#ですが、多少簡略化して書きます。
プログラムはコンソールアプリケーションです。
メインスレッド
while (true) {
s = Console.ReadLine();
if (s == "quit")
break;
else {
quit以外は読み捨て
}
}
ネットワークスレッド
while (flag) {
ブロックせずにクライアントの接続をaccept
for (クライアントの数) {
select
s = recv
メッセージ処理(s);//この中で、sの解釈および各クライアントへのsendを行う。
}
}
このような感じのプログラムで、5、6人でチャット中に、突然
while(flag)内で固まってしまいました。そうなると、クライアントから
何を送っても反応がありません。
ところが不思議なことに、その状態で適当に何かを入力すると、
(つまりメインスレッド内のReadLine()内で処理が行われる?)
突然溜まっていたメッセージが怒涛の勢いで処理されて、再び
ネットワークスレッドが動き出します。
メインスレッドのReadLine()は、改行を打つまで戻ってこないメソッドですが、
単に1文字を打っただけでも、怒涛の勢いで動き出すので不思議です。
同じような現象に遭われた方、いらっしゃいますか?
要するに、一応各クライアントからのデータはサーバーに届いて
いるが処理されないままであり、何か文字を打ってReadLine()を
働かせた瞬間に、ネットワークのスレッドの固まりが解けて、届いていた
メッセージを怒涛の勢いで処理した感じなのです。
> for (クライアントの数) {
> select
selectの使い方を知らない?
>>927 さっきそのことに気が付きました。selectは一気に判定したい
ソケットを放り込んむものですから、クライアント分回すのは
おかしい(というより非効率的)ですね。
修正してからしばらく様子を見てみます。
930 :
デフォルトの名無しさん:04/03/21 21:36
激しくスレ違いかもしれませんが・・・
Winsock でサーバアプリを作った場合、Win2k Pro でも10クライアントまでなら
ライセンス的に問題ないですよね?
931 :
デフォルトの名無しさん:04/03/21 21:47
HSPなんだが
hspsock.dllを使って
sockputでPOST送信したいのだが、CGIが標準入力としてうけとる情報は
どこに書き込めばいいんですか?
932 :
デフォルトの名無しさん:04/03/21 21:49
>>931 「〜だ」と「〜です」のどちらかに統一してくれ。
まず日本語の使い方や礼儀というものを習って来た方がいいんじゃないでしょうか。
934 :
デフォルトの名無しさん:04/03/21 21:54
hspsock.dllを使いてsockputでPOST送信しなむ。
CGIが標準入力としてうけとる情報は
いづくにか書き込めばよからむ。
>>930 そのライセンスってドメインやワークグループのサービスに関してだろ。
自前アプリに対しては治外法権だと思うが。
>>930 正直、気にした事がない。
プログラムというか、Windowsの利用規約とかに
詳しいスレに行って聞いた方がよさげな気もする。
>>935 Win2k 鯖の場合は、Windows 認証を利用しないアプリは治外法権なのですが。。
Apacheに対するMSKKの見解でこういうのがあります。
http://www.apache.jp/misc/windows.html (1)Apacheは「インターネットの情報サービス」であるため、 EULAにおける
「インターネット情報サービス」に関する規定が適用される
(2)ApacheはEULAの「サーバーソフトウェア」に該当するため、
『サーバーソフトウェアとしては使用できない』旨の記述がある
OS(Windows 2000 Professional等)では使用できない
(3)EULAに『サーバーソフトウェアとしては使用できない』旨の記述のない
OS(Windows XP Professional等)でのApacheの使用は問題ないが、
「最大接続数」の制限によって端末10台以内からの利用に限られる。
(4)「インターネットの情報サービス」、「ファイルとプリンタの共有サービス」、
「リモートアクセス」サービスのいずれかの機能を利用するソフトウェア の
使用には同様の制限が適用される。
(1)(3)(4)項は良いとして、(2)項は Win2k pro の EULA の何処にも書いて無いんですけどね。
>>936 それらしいスレが見つからないのです。
GPLのはあるけど。
Linux使え!
IISをインターネット情報サービスと訳すからおかしくなるんだ。IISのままにしとけ
取り合えず暫定的に、selectをやめて単数socketのチェックであるPollを
使ってみたんですが、状況は変わりません。
メインスレッドでReadLine()を刺激してやる(何かしら文字を入れる)と
突然動き出すのが意味不明ですが、気長に見てますのでもしご存知の
方がいらっしゃれば教えて下さい。
Windowsのユーザ認証機構を使わない独自のサーバだと
接続制限を受けないと解釈するのが正しいようですね。
外 資 系 企 業 の 日 本 法 人 は 何 処 も ア フ ォ ば か り
これも正しい。w
>>943 >>944 selectをソケットごとにやるというのは明らかに本来の使い方ではないけども
それをやったとしても、非効率的だがそれがおかしい動作の原因にはならない
というのは甘いでしょうか。ただ、本来の使い方からはおかしい以上、もちろんそういう
やり方はやめるつもりです。
いずれにしても頂いたサンプルソースを見させていただいて、問題点を
もう少し切り分けてみて頑張ってみたいと思います。ありがとうございます。
>>946 どこで固まってるかは調べたの?
select(), recv() ?
>>946 select() をソケットごとにやるのと recv() でブロックするのは同じでは?
つまり、select() するのは意味なーいじゃん。
と、いうことで Win2k Pro + オレオレ鯖 + MSDE で接続無制限、と。。
>925
チャットプログラムなんだよな。
ネットワークスレッドでのメッセージ処理のConsole.Print(だったけか)
あたりがメインスレッドのReadLineとケンカしてるんでねーの。
>>947-948 >>925からネットワーク担当のスレッドだけ持ってきたんですが、
while (flag) {
ブロックせずにクライアントの接続をaccept
for (クライアントの数) {
select(そのクライアント) ←今は取り合えずPollに変えました。
s = recv(そのクライアント)
メッセージ処理(s);//この中で、受け取ったメッセージを解釈し、全クライアントへメッセージをsendしています。
Console.WriteLine(処理したメッセージ)
}
Sleep(1);
}
このスレッド(whileループ内)のどこかで固まっていることは分かります。それでよく調べてみると、
メッセージ処理関数の中で処理されたメッセージは各クライアントにsendされているようです。
(「全ての」クライアントに正常にsendされたかはこれからの調査になるのですが…)。しかし
処理したメッセージを表示するはずの、次行のWriteLine()が動いていないので、もしかしたら
どれかのクライアントへのsendで停止している可能性があります。
でも、不思議なのはsendで停まっているのは理解できるのですが、何故その場合に、適当な
キーをポチッと押して、
>>925のメインスレッドないのGetLine()を刺激すると、停止しているのが
何ごともなかったかのように動き出すのか、という部分なのです。
なんか間違えて標準入力の番号でselectしちゃってるとか
>>950 ありがとうございます。私もその線は怪しいと思っています。
ReadLine()で待ちながら別スレッドで、様々なタイミングでWriteLine()が
何回も呼ばれるので、ちょっと不安があります。
ネットワークとは全く関係ないバグかもしれませんので、このスレで相談するのも
ちょっと気が引けたんですが・・・。ただ、メインスレッドでReadLine()を待ちながら、
ネットワーク担当スレッドで適宜、WriteLine()はしていますが、クライアントごとに
スレッドを作っているわけではないので、WriteLine()に関しては、同時に呼び出される
ことはなく、WriteLine()同士が被ることはありません。
>>952 C#(Winsock 2.0のラッパーでしょうか)で作成しているので、
標準入力のselectはできないんです。
こういうバグが一番難しいですね。なんせ数時間に1回ぐらいしか
起こらないので…。
レスをいっぱい使用してしまいすんません。
どこで止まってるかをまず完全に見極めないと。
よく分からんけどWriteLine()は動いてるけどフラッシュされてないので
動いてないように見えてる、って可能性もあるし。
ネットワークスレッドの実行関数Runに、staticキーワードが付いていないことに気付きました。
とても嫌な予感がしてきました……。
関係無かったようです。
日記スレじゃないんだけど。
UDP socket の recvfrom() で、dest-addrがわからないのは、
意図的な理由があるのでしょうか?
>>959 単に(4BSDの頃の)最初の設計がそうだっただけ。
確かにdstのsockaddrも欲しい時もあるが、dst別に分けたいなら
bindする時にアドレス別にbindしてsocketを必要なだけ作るのがセオリーだな。
>>959 宛先は自分だから知ってるはずだろ。
忘れたらgetsockname(2)でも使えや。
>>959 ?
>>961 自分に割り当てられているアドレスは一つとは限らないからでは。
960が言っているのはINADDR_ANYを使わないで・・・ということだと思う。
>>959 IP_RECVDSTADDR オプションを使えば、dest-addr が分かるよ。
IP_RECVDSTADDR オプションが有効になっている場合、
recvfrom(2) の完了時に帰されるアドレス構造体が、src-addr
ではなく、dest-addr になる。
>>960 どんなセオリーだよ、それ。dest-addr が欲しけりゃ
IP_RECVDSTADDR 使うだろ、ふつー。
さらされ記念ぱぴこ。
965 :
デフォルトの名無しさん:04/03/23 17:36
俺は
>>960ではないが、
IP_RECVDSTADDR なんてオプションしらなくて、
IP別に受信するならIP毎にソケット作ればいいやん?
と思いついちゃった俺は、無知な上にふつーじゃないんだな… orz
まあ963はネタなわけだが。
IP_RECVDSTADDR ってIPv4でも使えるの?
971 :
デフォルトの名無しさん:04/03/25 00:02
メッセージキューを使用して
プロセス間通信のプログラミングを行いたいのですが
別サーバ間でのプロセス間通信は可能なのでしょうか?
このスレで良いのかどうかわかりませんが・・・
スレ違いの場合は誘導していただけると有難いです。
>>971 SVR IPC に多くを求めてはいけません。
おとなしく、socket などを使いましょう。