ネットワークプログラミング相談室 Port4

このエントリーをはてなブックマークに追加
1Unassigned
主にソケットに関しての質疑応答スレです。

Programming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html

Winsock Programmer's FAQ
http://tangentsoft.net/wskfaq/

過去スレ:
ネットワークプログラミング相談室
 http://pc.2ch.net/tech/kako/970/970344582.html
ネットワークプログラミング相談室 Port2
 http://pc.2ch.net/tech/kako/1006/10062/1006258198.html
ネットワークプログラミング相談室 Port3
 http://pc3.2ch.net/test/read.cgi/tech/1023359282/
2デフォルトの名無しさん:02/10/10 17:04
3
use Socket;
>1
乙彼〜
OTUKARE-
6255.255.255.255:02/10/10 23:04
図書コーナー!

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/ref=pd_bxgy_text_2/249-2677107-1089124
詳解TCP/IP〈Vol.1〉プロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/ref=pd_sim_dp_3/249-2677107-1089124
The Implementation (TCP/IP Illustrated, Volume 2)
http://www.amazon.co.jp/exec/obidos/ASIN/020163354X/ref=pd_sim_dp_4/249-2677107-1089124
Linuxソケットプログラミング―ネットワークプログラミングにおける実践技法
http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/qid=1034258224/sr=1-4/ref=sr_1_2_4/249-2677107-1089124
7デフォルトの名無しさん:02/10/11 21:37
おつかれさまです。
いきなり低レベルの質問なんですが
win95 C TCP/IP でプログラムしたのですが
double*1000000
のデータは送れたのですが
double*2000000
のデータを送ろうとしたらエラーがでてしまいました。
なぜなのでしょうか?
エラーコードは何だった?
9デフォルトの名無しさん:02/10/11 23:15
う、すいません。みてなかった;;;ほんともうしわけないです。時間がなかったもので、でなおしてきます
どこでエラーが出たの?
受信側のバッファ不足っぽいけど。
11デフォルトの名無しさん:02/10/12 14:19
送信でエラーがでてしまいました。確か送信側と受信側の両方とも同じ量だけ用意したつもりだったのですが、エラーコードを取るのを忘れていまして、
後日エラーコードをとってもういちど質問させていただきます;;
>>7
前スレの最後の方で似たようなの見たような・・・
ちゃんと過去ログ参照しようね。
結局ソケットに限定したら、ほとんど定石みたいなコードしか書かないよね。
問題が出るとすれば、パケットに流すバイト列の中身の方。
前スレの最後で、TCP/IP が並列動作しているのを見たことあるか?
という話題が出ていたが、マルチプロセッサでの race condition
が原因のバグを何度も見たことあるぞ。

シロートは引っ込んでなさいってんだ。
IRCクライアントって簡単に作れますか?
意外とできそうなんですが・・。
10分じゃつくれない。
1日あれば作れる。
簡単と言うかどうかは知らん。
>>14
で、それが並行動作している証拠と言うわけ ?
似非玄人も、引っ込んだ方がいいよ。
1815:02/10/14 01:20
TCP/IPクライアント作ってIRCのサーバに接続してみたんですが、以外にあっさり繋がってびっくりしました。(^^;
#文字コードってJISなんですね。
文字コード変換して、あと文字列やりくりしたら何とかなりそうな感じです。
まあ、作ってみないとどうかはわかりませんが・・。
>>17
並列動作してない証拠にもなってないし…
>>14ってミジンコ?
20デフォルトの名無しさん:02/10/14 08:57
旧すれより下がってるから、アゲ
21デフォルトの名無しさん:02/10/14 09:17
http://cocoa.2ch.net/test/read.cgi/phs/1032671125/l50
のためにプログラム組んでくだされ
22デフォルトの名無しさん:02/10/14 11:02
>>21
携帯捨てれば?
23 ◆Rc2D5d6xf. :02/10/14 12:10
24 ◆Rc2D5d6xf. :02/10/14 12:10
◆nNRv8vDd2o
delphiでファイル送受信をする方法を探し、
ttp://www.users.gr.jp/ml/archive/delphi/48638.asp
このようなものを見つました。
テキストの場合、上手く受信したファイルを保存出来るのですが、
他の形式の場合の受信方法がわかりません。
TStringsに入れてSavetofileで保存できますか?
2614:02/10/14 18:08
>>17
早い話、仕事柄、カーネルを覗いて並列動作を確認したり、
バグを潰したりしなければならない立場にいるってことだよ。
>>26
別にあんたの業務内容なんか聞いてないんですけど、自慢ですか ?

どうやって並列動作確認してるのかを聞きたいだけだよ。
カーネルデバッガ。
>>25
delphiは良く分からんが、"TStrings"なるインスタンスにバイナリを突っ込む理由がわからん。
バイナリに\0が入ってたらどーすんの?
ていうか、サンプルのままやればいいじゃん。
Memo1.lines.add(IntToStr(b));
の代わりに1バイトづつファイル保存すればいいんでないの?
3025:02/10/15 14:19
>>29
それの具体的なやり方がわからないです。
TFileStream使えば良いのかな。
>>26
この人前スレの本題は無視して、
俺はカーネルにバグがあるのを知っているぞ─、偉いだろう、だけだね…
お前もスレと無関係の内容のない煽りだけだな
>>30
delphiスレ行った方が良さげ。

fs:=TFileStream.Create('file', fmCreate);
for i := 0 to Socket.ReceiveLength - 1 do begin
 Socket.ReceiveBuf(b, 1);
 fs.WriteBuffer(b, sizeof(Byte));
end;
fs.Free;

こんなカンジか? delphiやったことないから知らんけど。
>>28
具体的には ?
>>34特定のカーネルに依存する話だから、商用 UNIX の話であれば、こんなとこで詳細に説明できないと思うが…。
>>35
結局「示せない」と言うことですね。
煽るのおもしれえ。やっぱ2ちゃん最高。
>>37
ヴァカは、放置で。> >>37 を除く 各位
煽りキター!!!
放置なんていう言葉をナチュラルに使うなんて
さすが2ちゃんねらーは違いますね。
40デフォルトの名無しさん:02/10/16 03:39
windowsでTCPを使うにはwinsock.hをインクルードしないとだめだとおもうんですが
C言語ではむりなのでしょうか?C++でないとだめなんですか?
41デフォルトの名無しさん:02/10/16 04:24
C言語でふつーにインクルードできるが。
socketってそもそもC言語用のインターフェースだし
>>39
むしろお前が放置してくれよ
いや、俺が放置される!!
メールヘッダのReceiveが複数なのは中継を経ているってことですよね。
その中継はSMTPでどんなコマンド(?)でやり取りしているのでしょうか?
誰かわかる人いますか?
はい、います。
46デフォルトの名無しさん:02/10/16 21:39
>>45
だけじゃああんまりなんで、
ftp://ftp.iij.ad.jp/pub/RFC/rfc821.txt
の6ページに例があります。他にもたくさん載ってる。
WinSockのリファレンス的な解説をしてる良いサイトはないですかねぇ・・。
開発はVisual C++6です。
MSDN
良スレage ちゃった♪
50デフォルトの名無しさん:02/10/17 23:57
Win32APIでHTTPクライアント作ろうと思ってるんですが、
参考になりそうな本・サイトってありますか?
(できれば日本語で)
MSDN
キーワードは wininet
5250:02/10/18 00:09
あ、使用コンパイラはBorlandC++5.5.1です。
MSDNでいいと思うけど・・・
5450:02/10/18 00:19
>>51,53
ありがdございます。勘違いしてますた。
WSAStartup( MAKEWORD(1,1),&wsadata );
client_socket = socket( AF_INET, SOCK_STREAM, 0 );
 ・
 ・
とsocketのプログラム書いてるんですが、
connect()でサーバと繋がった状態で、サーバ側が落ちた(接続が切れた)時の判断って
どうやればいいんでしょうか?
try catchとかで例外を拾えるのかと思ったのですがそれも駄目でして・・。
(selectはつかえないですよね・・)
使用開発ツールはVisual C++です。
recvが-1とか返すだろ。
selectも使えるし。
5755:02/10/18 08:16
>recvが-1とか返すだろ。

それが何故か返らないんです。。(--;)
スレッドで処理してるからでしょうか?

if( recv( client_socket, buffer_p, BUFSIZE - 1, 0 ) < 0 ){// 受信したかどうかチェック
 MessageBox(NULL,"error.","error Message",MB_OK);
 Rval.Error = true;
}
return;
5855:02/10/18 08:33
recvの戻り値ですが、デバックしてみると・・

・何か受信した場合は0以上を返す。
・接続が切れた場合は0を返す。
・それ以外はマイナス(SOCKET_ERROR)を返す。

という事は0の場合接続が切れたという事でいいんでしょうか?
なんか0でいいみたいな感じですが・・。
つか、そういう問題かよ、、MSDN嫁
>Return Values
> 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.
6055:02/10/18 09:07
レスどうもです。

>If the connection has been gracefully closed, the return value is zero.

接続がしまってる場合は0を返す、ということは0でいいんですね。(^^;
どうもありがとうございました。m(__)m
>>55
「相手が落ちた(接続が落ちた)」の定義にもよる。
相手が単純にソケットをクローズしただけなら、TCP レベルで FIN を受信
するから、recv() が 0 return する。

相手が RST を飛ばしてきたら(強制切断) recv() が -1 return で
エラーコードは ECONNRESET (WinSock の場合表現が違うかもしれない)。

相手のマシン自体がホントに落ちた(panic とか) だったら、何も
おこらない。recv() でブロックしたまま。

質問する時は、どういう状況について質問するのか、できるだけ、
具体的にしよう。

とりあえず、ソケットプログラミングの一般論として

 ttp://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.1

に目を通しとけ。
>>61
> 相手のマシン自体がホントに落ちた(panic とか) だったら、何も
> おこらない。recv() でブロックしたまま。
ある程度時間がたったらETIMEOUTで戻ってこない?
63!1:02/10/18 10:28
64プロ:02/10/18 10:43
何もプログラム分からないけど、どのように勉強していけばよろしいですか?
6561:02/10/18 10:58
>>62
何が TIMEOUT するのさ?
何も送信してなければ、TIMEOUT も存在しえないよ。

もし、データを送信して、TCP レベルでまだ ACK を受信していない段階で
相手がオチた(無応答になった)のなら、TCP の再送タイムアウトが発生
するので、recv() が -1 return して ETIMEDOUT エラーになるけど。

もっとも、もし、相手がオチた後にリブートして来たケースを考えると、
TCP の再送を受信した段階で相手が RST 応答するから、そこでコネクション
が切れる。アプリケーションは recv() のエラーでそれを検出するから、
再送タイムアウトよりは、早いタイミングで検出できるだろう。

SO_KEEPAVLIE オプションを有効にしてれば、データを送信していなくても、
無通信状態が続いたら相手の生存確認をするから、そのうち TIMEOUT を
検出するけど、普通は 2 時間ぐらいかかるし(Windows の事情はよくわから
ないのでデフォルト値がどのぐらいか知らない)。

>>63
Web制作
http://pc3.2ch.net/hp/
>>64
本屋にいって「はじめてのC言語」という本を買ってくる
>>65
Windowsでも似たようなモンですわ。
>>65
するとコネクション貼るだけ貼りまくってその後パケットを
一切送らなかったらDoS攻撃が成立しますか。
プロトコルレベルのTIMEOUTとアプリレベルのTIMEOUT、ごっちゃにしてないかい?
>>67
それが DoS 攻撃になるのかどうかは、アプリケーションによるでしょ。
それだと、コネクション張った側(クライアント側)もコネクションを
保持し続けないといけないわけだし。

つーか、どーゆーのが DoS 攻撃だと言ってます?

>>68
アプリレベルの TIMEOUT って、それは、アプリケーションが、
タイムアウトの仕掛け(alarm とか?)をやってた場合でしょ?
>>62 も「ETIMEDOUT」って書いてるから、プロトコルレベルの
タイムアウトの話だよ。
> それだと、コネクション張った側(クライアント側)もコネクションを
> 保持し続けないといけないわけだし。
単に沈黙すればいいような。
もっともありもののTCPスタックはRSTとか勝手に返しそうだから
自前でTCPのハンドリングをする必要はありそうだけど。

> つーか、どーゆーのが DoS 攻撃だと言ってます?
サーバのコネクション数には限界があるわけで、その数まで
接続しまくって放置すればサービス拒否攻撃が成立しますよね?
>>70
> もっともありもののTCPスタックはRSTとか勝手に返しそうだから
ごめん。意味が分かりません。TCP がどういう場合に RST を送信
するか、理解してます?

> サーバのコネクション数には限界があるわけで、
ありません。
>>69
> >>68
> アプリレベルの TIMEOUT って、それは、アプリケーションが、
> タイムアウトの仕掛け(alarm とか?)をやってた場合でしょ?
そーです。もしくはselectなんかのTIMEOUTね。
つか、>>68>>67へのレスですわ。

>>70
サーバだって何もこないソケットをただ延々と待ってたりはしないよ。
繋いで切ってを繰り返した方が、負荷が高いと思うけど。
>>71
ごめんなさい。
> それだと、コネクション張った側(クライアント側)もコネクションを
> 保持し続けないといけないわけだし。
が意味不明だったんで意味不明なレスしてしまいました。

> ありません。
listenの引数は飾りですか?
ApacheのMaxClientsはダミーですか?
カーネルの(以下略
つーかマジで言ってます?

>>72
> おこらない。recv() でブロックしたまま。
はただ延々と待ってるという意味ではないの?
7471:02/10/18 15:21
>>73
> listenの引数は飾りですか?
listen() の第 2 引数はバックログ値であって、コネクションの数と
関係しませんよ。accept() しない状態のコネクションをいくつまで保持
できるか、でしかありません。
普通、サーバアプリケーションが速やかに accept() でコネクション
を引き取っていくので、いくらでもコネクションは張れます。

コネクション数の話で、listen() の引数の話を出してくるところを見ると
バックログキューとかが、理解できてないように思います。

> ApacheのMaxClientsはダミーですか?
それは Apache がどのように扱うか、であって、TCP レベルのコネクション
の数と関係ありません。...と書いてて気付いた。>>73 さんは、アプリケー
ションレベルでの話をしてるんですね。そうすると、それはアプリケーショ
ンがどう振る舞うか、に依存しちゃうので、どうにでもなっちゃう。

でも、なぜここで、listen() の引数の話を出してきたのかが分からない…。

> カーネルの(以下略
カーネルとして、TCP コネクションの数に制限はありません。
>>74
ポートは65535個しかありませんが。

> カーネルとして、TCP コネクションの数に制限はありません。
じゃあどうしてSYN floodのような攻撃が可能なのですか?
カーネルのSOMAXCONNは(以下略
皆まで言わないとシラを切るつもりですか?
> 普通、サーバアプリケーションが速やかに accept() でコネクション
> を引き取っていくので、
fd_setの数にも同時起動可能なプロセス数にも上限があるし
FreeBSD 4.6RELEASE なんですが、こいつの recv() って SIGALRM で
抜けてきます?
漏れのとこだと、SIGALRM は recv() に割り込んで、シグナルハンドラは
実行されるんだけど、その後、勝手に recv() が再実行されてるみたいで、
recv() がエラーリターンしてくれないんですよ。
マニュアル見ると、EINTR するって書いてあるし。
Solaris とかだと抜けてくれるんですけどね。
なんでか知ってる人いたら、レスキボンヌ

>75
>ポートは65535個しかありませんが。
それが問題になるのはクライアントだけ。
そのうち、「32bitマシンで積めるメモリは4GBだけ、とか
言い出すんだろうか、、、
コネクションは、src/dest それぞれの IPaddr/portの4つのうち、
一つでも違えば張れますよね。(だからといって、カーネルに制限
がないと言い切るのも問題ありだけど)

>> カーネルとして、TCP コネクションの数に制限はありません。
>じゃあどうしてSYN floodのような攻撃が可能なのですか?

ここで、ハーフコネクションの話を持ち出すのは筋違いでは?

>SOMAXCONN

これも筋違いでは?
listen() のバックログ最大値の話でしょ。
(つづき)
>fd_setの数にも同時起動可能なプロセス数にも上限があるし

カーネルが保持可能な最大コネクション数には限界があるって
話とは微妙にずれてるし...ナニが証明したいの?

なんか、低次元の話で熱くなってないか?
(...熱くなってるのは一人だけだったりして)

一休みして頭を冷やし、もちっとまともな証拠固めをすませてから、
反論したほうがいいと思う。

まあ、カーネルにコネクション数制限がないって話は、打ち砕く
ことはできるんじゃないかな。つーか、すべての資源で制限がない
ってものはないんだから...まあ、モノによっては、上限が2の64乗
とかになっちゃうんだけどさ...それでも、それが上限だとは言い
張れるわけで(笑)

Solaris9 の場合は 2^32、40億個だってさ。
さすが 64bit カーネル(つか 32bit では不可能)
http://jp.sun.com/solaris/wp/solaris9/better_by_design.pdf
(スケーラビリティへの取り組み参照)
>>78

signal()を使わず、sigaction()でSA_RESTART flgをOFFにする。
FreeBSDは、signal()はBSDセマンティクス、sigaction()はPOSIXセマンティクスだとさ。
8471:02/10/18 18:25
>>75
> ポートは65535個しかありませんが。
はぁ? オマエが「サーバの」って限定したんだろーが?
サーバ側のポート番号は一緒だよ。

>>76
> カーネルのSOMAXCONNは(以下略
> 皆まで言わないとシラを切るつもりですか?
それも、バックログキューの上限値の話だろ?

>>77
> fd_setの数にも同時起動可能なプロセス数にも上限があるし
何が言いたいのかわからんけど、fd_set って select(2) の話だと
思うんだけど、それはファイルディスクリプタの話であって、
コネクション数とは一致しないよ。確かに、fd が open できなければ、
ソケットが生成できないから、アプリケーションがコネクションを保持
できなくなるけど、でも、コネクションは存在するからね。

>>82
> まあ、カーネルにコネクション数制限がないって話は、打ち砕く
> ことはできるんじゃないかな。つーか、すべての資源で制限がない
> てものはないんだから...まあ、モノによっては、上限が2の64乗
> とかになっちゃうんだけどさ...それでも、それが上限だとは言い
> 張れるわけで(笑)
もちろん、確かにそーゆー話をし始めると、無制限じゃないよ。
でも、「コネクション数」としての制限値はないよ。リソースの
制約は受けるだろうけど。
8578:02/10/18 18:50
>>83
ども、ありがと。
recv のマニュアルばっか見てました。
signal(3) に書いてありますね。
お馬鹿な質問にレスくれて、THXです。
>>84

打ち砕く云々の部分は、与太で書いただけだから、気にしないようにね(笑)
基本的には、一人だけ御馬鹿さんがいると、みんな思ってるんじゃないかな。
いや、思ってないよ。
思ってるよ。
おまいら、レイヤをごっちゃにして話すのやめろです。
なんか、盛り上がってますね。
話のきっかけは、recv() で物理的な回線断、相手のクラッシュが検出できるか?
ってことに関しては、判断不可能ってのが正解だと思います。
そういう状態になったら、recv() は永久に戻ってきません。
そのために、わざわざアプリで定周期にパケットをやり取りして相手の生死の
確認をするんだと思います。

その後のやり取りについても、 >>61 , >>71 , >>81 , >>84 の説明のほうが
筋が通ってて、正しいように思います。
私は、TCPの内部のソースはまだ読めないので、一部の説明は理解不能ですが。

それと、
>じゃあどうしてSYN floodのような攻撃が可能なのですか?
についてですが、大抵のサーバは、コネクション毎にプロセスやスレッドを
作りますから、それらに割くリソースがシステムのリソースを食いつぶしていって、
最後にはサーバーが動けなくなる(メモリが足りなくてプロセス、スレッドがもう
作成できないとか)や、ものすごい勢いでコネクションの確立要求がくるとそれの
対応にカーネルが追われてしまって、本来のサーバーの仕事が出来ないくらいCPU
パワーを使ってしまい、結果、サーバーとしての機能停止って感じじゃないのかな?

よって、サーバー側のコネクション数に限界がなくても、SYN flood攻撃は成り立つ
と思います。




>>90
SYN flood の話で、プロセスやらスレッドやらを出してきちゃだめ。

SYN_RCVD 状態のコネクションは、まだアプリケーションに通知
されない(accept(2) できない状況)から、サーバアプリケーションが
fork() やら、スレッド生成やら、したりしないの。

で、カーネル内では、そのハーフオープンのコネクションのため
のテーブルがどんどん増えていくんだけど、消しようがないから、
そのうち、資源無しになっちゃうってのが SYN Flood 攻撃です。

アプリケーションが引き取ってるんなら、アプリケーションが close
すれば済むんだけど、ハーフオープン状態だとアプリケーションが介在
できず、カーネル内で TCP もそれを消すことができずに、ああ、困った
ね、って話。

SYN Flood の話を持ち出してきたのは、勘違いしている人でしょ?
SYN Flood
SYN-SYN/ACK-ACK
WindowsXPの場合は受付側のTCPのコネクションは4000で打ち止め
代表ポート受付後自動で1000〜5000のポートに対して処理を引き継がせているが
それを食いつぶすとコネクション不能になった
この範囲内でしか自動で割り当ててくれないらしい

ところでどこを設定すればこのコネクションの限界数を無限に増やせるの?
XP HomeとXP Proと.NET Serverで値が違うんだろうなあ・・・
HomeとProは同じ結果
NETはMSDNの嫌がらせCDに入ってたけど入れてないので試してない
96デフォルトの名無しさん:02/10/18 21:35
.NET Serverなら無制限だと思われ
試しもしないで無責任なことをほざくのはヤメレ
だってインストールするのめんどいんだもん・・・
>93
http://tangentsoft.net/wskfaq/advanced.html#maxsockets
の話では無かろうな。
10090:02/10/18 22:12
>>91
な・る・ほ・ど
そういうことですか。
また、1つ賢くなりました。
なっとくしましたです。
とりあえずネットワークプログラミングをやるんなら、Stevens本ぐらいは嫁。
素人の巣窟かここは...
>>91
後半は大嘘だな。
以下、「UNIXネットワークプログラミング 第2版 Vol.1」からの引用。
-確立待ちコネクションキューが満杯の場合、Posix.1gではSYNを無視、
-あるいはRSTで応答のどちらの挙動を示しても良いことになっている。
-Berkeley派生のインプリメンテーションでは、到着したSYNを無視する
-ことになっている。
UNIX依存の知識を披露していい気になってる奴発見
>>101
まあ、>>91はこうなっている実装が問題になったって話したんでしょ。

>>73,>>75はハゲシク無知なくせに謙虚さが足りないぞ。
104デフォルトの名無しさん:02/10/19 10:40
apatchのインストールの話題はここでいいですか?
>>104
違います。
10691じゃ無いが:02/10/19 11:02
>>101
コネクションキューも資源の一つなんだが…

コネクションキューを割り当てることが出来ないから
-確立待ちコネクションキューが満杯の場合、Posix.1gではSYNを無視、
-あるいはRSTで応答のどちらの挙動を示しても良いことになっている。
-Berkeley派生のインプリメンテーションでは、到着したSYNを無視する
して、新規のコネクション要求が受け入れられない。
どのように大嘘なんだ?
>WindowsXPの場合は受付側のTCPのコネクションは4000で打ち止め
>代表ポート受付後自動で1000〜5000のポートに対して処理を引き継がせているが

accept するとポート番号が変わる?
んなばかな。
>>107
受け付け用のポートと実際に通信するポートは異なるのだが
もしかして全部同じポートで通信していると思ってたのか?
同じポートでどうやってTCPが通信先を判別するのか小一時間問い詰めたい
>>108
もまえは小一週間勉強しなおせ
>>108

単に、socket記述子が別になることと勘違いしてない?
netstat とか使ったことある?
111101:02/10/19 13:38
>>103
それだと、「こうなっていない実装」(例えば典型的なBerkeleyの実装)に
対してはSYN floodingは無効であると主張しているのと同じ。

>>106
> コネクションキューを割り当てることが出来ないから
SYN floodingにより、あるポートに割り当てられた接続待ちキューの
エントリが満杯になったとしても、他のプロセスには何ら影響がなく、
新たにlisten()によりコネクションを待ち受け、
正常にサービスを行うことができるが、「キューを割り当てられない」
とは、一体何を云っているのか?
>108
>同じポートでどうやってTCPが通信先を判別するのか

srcaddr : srcport : dstaddr : dstportの組で判別しまふ。
鯖のポートがおなじでも、クライアントのポートは(アドレスも)違うので大丈夫なのれす。
サーバポートとクライアントポートの違いが分からない香具師はアフォなのれす。
小一時間人を問いつめる前に、マスタリング TCP/IPを10遍読むのれす。
>>111

なんか、勝手に自分で問題設定してませんか?

あなたは、勝手に 91 が、接続待ちキューはシステム全体で共有、
といっているとみなし、ポート単位に割り当てられている実装がある
のだ、とわめいている。

でも、91 は、システム全体で共有だとか、ポート毎だ、なんて言及
していないと思うけれど?
114デフォルトの名無しさん:02/10/19 21:17
telnetでhttp://hostname/index.htmlをHTTP/1.1でGETして標準出力に出す場合、画面に収まり切らない部分って皆さんどうやって見ていますか?
現在はGETするだけのHTTPクライアントを作って結果をリダイレクトしてファイルに落してから後程ファイルを開いて先頭の方を見るという面倒な事をしています。
>>114
teraterm とかのまともな Telnet クライアントなら、ログ機能 (受信データを記録する機能) がついてるから、そう言うのを使えば ?
本当にHTTP/1.1を話したいのか問いたい。Connectionの面倒を見る気があるのかと。
RFC2145を読んでないならまず読んどけ。
117114:02/10/19 21:39
>>116
私の事を言っていますか?
すみませんこれから読みます...
2068はobsoleteなんですよね?
118114:02/10/19 21:41
>>115
むしろそういう機能をもつHTTPクライアントを作りたいんです。
ならまずRFC読んでからですね。すみません。
>>114
% w3m -dump_both http://www.example.com/ | lv
w3m はクライアント, lv は more のようなもの
120114:02/10/20 00:36
>>119
できますた。これらのソースみて勉強します。有難うございました!
121デフォルトの名無しさん:02/10/20 01:10
Cのマルチスレッドなのですが,
_beginthread等で起動するスレッドで
_beginthreadに渡すパラメータを参照する場合と、
グローバル変数を参照する場合とで違いはあるのでしょうか?
Don't use global scoped variable!!!
123デフォルトの名無しさん:02/10/20 01:49
スレッド間でデータ共有するのだから
グローバル変数しか方法が無い思うのですが。
mutex すれ。
125デフォルトの名無しさん:02/10/20 02:08
MFC使わないと無理ということでしょうか?
>>121
グローバル変数とパラメータが指すオブジェクトは全然違うやん。
>>121
何を聞きたいのかわからん。
当然参照の仕方 (コードの書き方) は、違う。
しかし、これはマルチスレッドだろうが単なる関数呼び出しだろうが一緒だろ。

で、問題はこれが「ネットワークプログラミング」と何の関係があるのかと...。

>>123, >>126
はぁ ?
128デフォルトの名無しさん:02/10/20 12:31
すみません、質問いいですか?

特定のIPアドレスのPCが起動したときに、メールで知らせがくる
プログラミングを教えていただけないでしょうか?環境はLinuxです。

おおよその流れは、

・10分おきぐらいに特定IPにPINGをかける。
・if(応答なし)
   次の10分後に再びPINGをかける;
  else(応答あり){
    当方にメールで知らせる;
    自動的に特定IPのPCにTELNETでログインする;
  }

以上のような感じのプログラミングできるでしょうか?
よろしくお願いします。
ping:
 int ret = system( "ping somehost -c 1 -q" );
メール:
 FILE *fpmail = popen("mail some@anyhost -s title");
  fprintf(fpmail, "somhost boots.\n");
  fclose( fpmail );
あとは自分でやれ。
130デフォルトの名無しさん:02/10/20 12:53
>>128

Perlかshellか何かでさくっと出来るだろ。

漏れの予想ではtelnetする部分がちょっと工夫が必要になるのではないかと
思うが。まずは自分で考えろ。


131デフォルトの名無しさん:02/10/20 14:20
128です。
129,130さんありがとう。

でも言語にはかなり疎いんです。Linuxのネットワーク管理ぐらい
をすこしかじった程度なんで。
でも、この前のLinuxWorldを参考にしてshellを組んでみたいと
思います。

でもやっぱりできそうにないな。。。。
132121:02/10/20 15:04
>>127

スレ違いスマソ
「マルチスレッドプログラミング相談室」
逝ってきます

133デフォルトの名無しさん:02/10/20 23:44
>>131

簡単にあきらめんなよ。

本当にtelnetをつかうなら、shellは無理じゃないか?Perlならやりようによる。
あとはExpectを調べてみろ。

ところで、相手のPCには、telnet server動いてるんだよな?ちょっと気になった。

ネットワークプログラミングとは微妙にちがうのでsage
134133:02/10/20 23:45
下がってない・・・鬱死
むしろtelnetでloginすることが要求仕様なのかどうかの方が気になる。
Win32APIがそこそこ使いこなせるようになり(大したことはない…)
Winsockもそこそこ使えるようになって(これはもっと大したことない…)
ふと思ったのですが、簡単な遠隔操作プログラムならつくれるんじゃないかと…。
簡単なト○イも作れそうでちょっと怖くなりました。。
137デフォルトの名無しさん:02/10/21 02:51
131です。
いや、正直なところお手上げです。
やってみたいのですが。。。
当方C言語を少々(目的:数値計算)なのでなんともできません。

Perlもshellもよくわかりません。
Linuxネットワークサーバを数十個つくれるぐらいです。

出来そうな人、どうかお願いします。
平日軍に大いに期待します。ホント申し訳ありません。

当方提供できるのは、MPIの数値計算プログラミングを少々
というところです(恥)。
138デフォルトの名無しさん:02/10/21 02:53
133さん
131です。
Telnetserverはworkしています。
僕はちょっとPerlとかあまりわからなくて、
申し訳ないです。。。
>>136
作ってからいえよ。一番むずしいのはどうやって感染させるかなんだから。
WinMXで一度自作のトロイ流したけど感染は3人しか確認できなかった。
140デフォルトの名無しさん:02/10/21 03:27
↑すごい人が居るな・・・・、ここ。
私、138です。。。。
本当に流すところが凄い。。。
>>139
感染したかどうかなんて確認できるの?
実行したら、どっかのCGIでも叩くようにすればええんとちゃうの。
144136:02/10/21 08:32
>>139
3人も居れば凄いのでは・・
作ったとしても漏れは怖いので流せません。(汗
>>140
もっと凄い人はスレの上の方に・・
145デフォルトの名無しさん:02/10/21 10:13
>>144

全部読んだけど、凄い人って誰・・・・!?

ところで、128の仕事はshellでいいのかな?それとも
Perlなのかな?
146デフォルトの名無しさん:02/10/21 12:12
>>145
ウイルスをばら撒く勇気がある人<凄い人
147デフォルトの名無しさん:02/10/21 12:17
ここに書いていい質問かわからないんですが…

今WEBのページを作っているんですが、
JAVASCRIPTで定義した変数の値をPerlの変数に渡してサーバに送りたいのですが、
そういったことって出来るんでしょうか?

CGIでサーバを介すと時間がかかるんでページの中ではJAVASCRIPTで処理して
その結果をPerlで出来たら早いと思って、やろうとしているんですが…。

誰か詳しい人や、やったことがある人がいたら教えてください。

よろしくお願いします
>>147
激しく板違い。

JavaScriptがクライアントで動いてることが理解できてりゃ
答えは簡単だろ。
149デフォルトの名無しさん:02/10/21 13:00
申し訳ないです。やはり板違いでしたね^^;。

で、どゆことですか?
出来ないということでしょうか?
板のトップの注意書きを読んで適切な板で質問しなおしてくれ。
>>147
いや、普通にできますよ


煽りに負けてるようじゃ先は長いけどな
152デフォルトの名無しさん:02/10/22 16:46
>>128
「PCが起動したとき」はどう定義するんだ?
>>15210 分おきぐらいの ping に応答したタイミングでいい、ってことだろ。
ずーと起動してたら、10分ごとに「起動した起動した」とメールが。。。
当然、前の状態を保持しとくんだろ。
違っていれば落ちた/起動したの判定ができる。
pingの代わりにUDPパケットじゃだめ?
>>156UDP パケットを投げて ICMP Port unreach が返ってきたら、その相手が起動した、って判断するってこと?OS によるけど、UDP ソケットで connect() しとかないとICMP Port unreach エラーは検出できないから、注意。
>>155
ネットワークだから、たまーに ping が失敗することもあるから、失敗したら何回かリトライするようにね。
159デフォルトの名無しさん:02/10/23 16:17
外部から「起動した」を判定するのは結構難しいので、
pingだけじゃなくて、複合テストをやった方がいいと思う。

例えば、rup、snmpを使ったり、起動したhostがsnmp trap出すようにする。
UNIXだったら、GNU fingerでfinger .clientもいい。
DHCP使ってるなら、dhcpdのlogやsnmp trapも有効だ。
# 調べられるのはserver上に限られるが。
netgameにも使えそうだな。
161デフォルトの名無しさん:02/10/24 23:09
教えてください
WinSockを使いSOCK_STREAMでADSL回線使用の場合
1秒間に送れるデーターは5KByte程度でしょうか?
たぶんプログラムが悪いんですが。
通常もっと早いですよね?‘
5Kbyteはちと少ない気がする。通常20K-200K程度だと思う。
ただし、相手がちゃんとrecvしていたらね。
163161:02/10/25 06:48
>>162 ありがとうございます。書き忘れの条件ですが
HTTPプロトコルで GETを取ったら800Byte送るテストで
1秒間に7回程度しか送れません。双方ともスレッドで
単に送受信しているだけです。なにかコツというか
注意点がありますか?
>>163
自分が使っている環境や関連技術をよく調べる。
まずftpかで、上り速度を測ってみたらどうだ?

>162
ADSLなら、逆立ちしても、上り200Kでない筈だけど、、
1Mbps=128KByte/sが最高?
167161:02/10/25 09:36
たとえばこういうのって速度制限てあります?
WAKWAKですが5KByte(約64Kbps)で制限?
>>161何 byte ずつ write してますか?一方向だけのデータの流れだったら、遅延 ACK が発生して、Nagle アルゴリズムの影響で性能劣化してるってことはない?
どなたか教えてください。
JavaでFTPライブラリを製作していますが、
サーバー上の特定のパスがファイルであるかディレクトリであるかを
判定する最も確実な方法は何でしょうか?
NLST -alLでカレントディレクトリと親ディレクトリを返したら
ディレクトリ、という風にやるつもりでしたが、
FTPサーバーによってそれが当てはまらないのがあり、
困っています。
MLSD使ったら
CWDしてみてできたらディレクトリ
「ファイルである」以外の理由で失敗することも歩けど
172デフォルトの名無しさん:02/10/25 15:44
>>163
単純にHTTPのハンドシェイク遅延に引っ張られてるだけじゃネーノ?
173169:02/10/26 00:17
>>170
MLSDは対応してないサーバーが多くて・・・
もうちょっと一般的になればMLSD決め打ちでいけるのですが。

>>171
サーバーによって、パーミッションエラーが返ってきたりするので、
あまり実用にならないと判断してその手は見送りました。

FTPプロトコルって、中途半端に人が使うようにできているので
たちが悪いですね・・・
174デフォルトの名無しさん:02/10/26 19:16
質問す
sockaddr_in
の各メンバに値をいれたのち
bindなどに引数として渡すときに
(struct sockaddr*)sockaddr_in
というふうにキャストする理由というのは
ポート番号IPアドレスなどを
アドレスデータとしてまとめて読み込んでしまうから
なんでしょうか?
ソース見てないのですが
そんなところであってますか
>174 ちがう。単にbindのプロトタイプ宣言が
int bind(SOCKET s, const struct sockaddr* name, int namelen);
だから

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/bind_2.asp
>>175
ちょっと補足しとくと、bind() なんかのソケットライブラリは IP 専用じゃなくて、他のプロトコルにも使うつもりだったから、そう言うプロトタイプになっている。

(でも、IP 以外で使ったことある奴はあんまりいないと思う...。)
177デフォルトの名無しさん:02/10/27 03:22
>>176
そうか?AF_UNIXなんかはそれなりに使われてると思うが。
>>152
起動した側にパケット送らせるのはダメか?
監視鯖側が受信確認するまでリトライしてさ。

で、監視鯖はダウンするまで10分置きにPingで確認しつづけるの。
これなら、死んでるPCにまでPingしなくて良いだろ。

つって、いっぺんに100台からのPCが起動したら、DDOSになっちゃうか。
>>177
>>175を見れ。intじゃなくてSOCKETだ。
>>179
もともとの質問である>>174にはWinSockであることを匂わせる部分は
ひとつもないが
>>180
わかってるよ。
あんたが「>>175へレスを付けた>>176」へレスしたからだ。
>>176>>175を見て補足したのだから,>>176はWinSockのことではないのかえ?
まあまあ、両人とも違いはわかってるんだからえーやんか。
マターリいこーや。
184176:02/10/27 17:58
>>182
ごめんよ、あんまり意識なかった。
ソケットライブラリ一般と言う意味で書いていた。
だから AF_UNIX も意識にあったけど、まあ IP で使う香具師の方が俺の周りじゃ多かったんだよ。

よく見ると >>174 は、「(bind() の) ソース見てないのですが」と書いてるから、多分 WinSock ではないだろうね。
185デフォルトの名無しさん:02/10/27 23:07
Socket プログラミングについて質問があるんですが。
最初、WSAStartup 関数やって、socket 関数でソケットを取得すると思いますが、
既存のソケット(他のプログラムが作ったソケット)を取得したいんですがやりかたがよくわかりません。
開発環境は WinXP Prp. VC++6.0 です。よろしくお願いします。
API でそういうようのがあればいうことないです。(API なら VB で使える)
>>185
VB好きならVBでやれよ
>>186
こういう奴が一番厨っぽい
ソケットをプロセスを超えて渡すというのは見たことないなあ・・・
unix方面でもわりかしトリッキーだったと思う
WSADuplicateSocket
WinSockなら、ふつーにDuplicateHandleする手もある
>unix方面でもわりかしトリッキーだったと思う
apacheからはじまるマルチプロセス型
サーバの立場はどうなってしまうのだろうか。
192!188:02/10/28 00:05
子プロセスには簡単に渡せるんだろうけど。
193188:02/10/28 00:12
>>191
apacheは動的に生成されたsocketをプロセス間では渡してない。
listenするsocketをfork時に共有しているだけ。
fork時のfdの共有はunixでは一般的に使える(でないとpiped forkが...)。

最初はacceptしたのを渡してると思ってたんだけど、思い込みって恐いね。
194188:02/10/28 00:14
>>189
うわあ、あるんだ・・・勉強になりやした。
winsock2ってことはwin98系でも使えるのね・・・
195185:02/10/28 01:21
いろいろなレスありがとうございます。
WSADuplicateSocket() や DuplicateHandle() 聞いたことない関数ばかりで調べてみたのですが、
DuplicateHandle() 関数に関して、第二引数に複製対象のハンドルを書くみたいですが、
私がほしいのはその第二引数のハンドル(ソケットハンドル)そのものです。
なのでこの関数を使う時点では他プロセスが作ったソケットハンドルは分かっているのでは?
(この関数使ったことないので根本的に私の解釈が間違っていなければですが)

えと、やりたいことは・・・
あるプロセスが取り扱ってるソケットがあります。
そのソケットが送信および受信したデータをバイナリ単位で知りたいのですが・・・。
hookしる
197185:02/10/28 01:32
Hook では送信受信などのメッセージは横取りできてもデータそのものは横取りできないのでは?
kageがかちゅに用いているようなHookを使え、というとるんや。
>185
>既存のソケット(他のプログラムが作ったソケット)を取得したいんですがやりかたがよくわかりません。

>195
>あるプロセスが取り扱ってるソケットがあります。
>そのソケットが送信および受信したデータをバイナリ単位で知りたいのですが・・・。

全然言うとること違うやないか、、、
http://www.layer.co.jp/

ここの作者に聞いてみたら?
聞かなくてもEtherealのソースを見るとか
net sendを使ったプログラムを組みたいんですがどうしたらいいのでしょうか?
参考になるwebページでいいんで教えてください。
からあげーーーー
205デフォルトの名無しさん:02/10/29 21:23
UNIXでgethostbynameを非同期に実行するにはどうしたらいいのでしょうか?
fork()やスレッドを使うか自前でDNSのパケットを処理するしかありませんか?
>>205
fork()がポータブルかなあ・・・
スレッド使うときはreentrantバージョン(gethostbyname_rとか)
を使うよう気をつけようZE!
>>205
squidが自前で実装してたような・・・?
Mozillaも自前で実装してる
209デフォルトの名無しさん:02/10/31 01:30
receive: /* ストリーム型のデータの受信処理 */
if ((rn = recv(s, &recv_buf[i], 1, 0)) < 0)
break;

/* 改行単位で受信処理をする */
if (recv_buf[i] != '\n') {
i++;
if (i < BUFSIZE - 1)
goto receive;
}

ストリーム型のデータの受信というのは通常このようにやるもんでしょうか?
どういった理由からでしょうか?
recvの挙動と戻り値を調べてみると分るぜよ
gotoがキモいコーディングだな
212デフォルトの名無しさん:02/10/31 01:50
大学の研究室にはLANが組まれていて、二台のコンピュータ間でネットワークプログラムを動かすときは、互いのマシン名が存在しているので、それでやりとりするんですが、
家にはwindowsパソコン一台しかないので、ネットワークプログラミングの勉強ができません。
DOS窓を二つ開けば擬似的にコンピュータが二台あるように見せることができるらしいですが、各DOS窓を識別する名前などが存在しないようで、こまっています。
パソコン一台でもLAN環境が整っているように見せるにはどうしたらよいのでしょうか?
ちなみにJAVAのHORBというやつを勉強してます。
>>212
どうしても二台分かれた環境にしたいのであれば、
VMwareなどのエミュレータを使うという手もあるよ
ポート番号分ければ委員でねえノ?
ORBのお試し環境に、別マシンはイランデショ。
各サーバーオブジェクトはORBを介して通信していて、その下が
LAN越しのホスト間通信をやっているのか、たんなるローカルの
プロセス間通信なのかはキニシナイ、というのがORBだとおもわれるが。
>>212
LANカード入れて、TCP/IP入れて、IPアドレスは適当にふって、
後は>>214の言う通りポートをわければ良い。

というか、プログラムするのにDOS窓は関係ない。
217デフォルトの名無しさん:02/10/31 02:26
寒くなってくると指が思うように動かないもんですね
くそ
218デフォルトの名無しさん:02/10/31 02:34
ループバックのアドレスを指定した場合って
そのパケットってどこまでいきますか?
適当にプログラムつくって
127.0.0.1に向かって飛ばしても
windumpとかで反応してないんですね
でもISPから振ってもらってるIPアドレスに向かって飛ばしたら
windumpが見てるところまで落ちてから戻ってきます
だからLANカードささなくてもいいんじゃないですかね?
これって甚だ勘違い?
なんのためのループバックだか。
勘違いじゃない。カードを刺さないでもTCP/IPのサービスは動いてる。OSがサポートしてればだけど。
221デフォルトの名無しさん:02/10/31 03:59
>>217
そういうときに指先に穴があいている手袋をどうぞ。
特撮ヒーローが着けてるヤツだな
223デフォルトの名無しさん:02/10/31 06:57
>>218
windumpで、capture対象にloopback interfaceを指定すれば、
127.0.0.1のpackaetもcapture出来るんじゃないの?
// 今手元にwindowsないから確かめられないが。

>>212
(H)ORBに一台も二台も糞もない。
・127.0.0.1を指定する。
・ネットワークアダプタがあれば、IPアドレスを振って、そこ(自分)を指定する。
(192.168.0.1辺りを使えばいい; プライベートアドレス)
どちらかでOK。

>>209
breakて
>>223
breakじゃ意味ないね(藁
つーか、コンパイル通らんだろ。

それに1バイト単位でrecv()って、・・・おぃ(^^;
でもPerlでストリーム型のデータ読むときは
$| = 1;
ってふつーにやるけど
なにかまずいことでもあるの?
つーか1バイトずつ読む以外の方法で
・改行まで読み込む
・ブロックも絶対しない
の両方を満たすことなんてできるの?
>>225ソケットを fdopen() して、そこから fgets() する。ftp のソース読め。ブロックを絶対しない、ってのは 1 byte ずつ読んだっていっしょだろ?その 1 byte が到着してなきゃブロックするんだから。ノンブロッキングモードだと当然ブロックはしないけど。
取れるだけとって、その中からデリミタ(今の場合改行)を探して、
それ以前を受信電文とし、それ以降は次の受信電文のためにバッファリングする。
というやり方に名前があったはずだけど忘れた。
でもまぁ、ストリーム型なら、電文ヘッダに電文長付けれ。
1バイトずつ読んでるやつがいるとは。
>>226
fgetsがバッファを満たすときにreadを一回しか呼ばないことは
保証されているのか?
> 1 byte ずつ読んだっていっしょだろ?
この場合はselectで回避できる。
230224:02/10/31 15:13
Perlでは他の要因の方が大きいだろうけど、
Cの場合は同じように1バイトずつ読む場合でも、
fdopen()してストリームからgetc()とかで読むのと、
ファイルディスクリプタからrecv()で読むのでは
バッファの関係で速度に雲泥の差がある。

移植性の問題もあるし、fdopen()しなくても
自前でバッファリングすれば問題ないが。

>>229
保証されてるかは知らんが、毎回FILE*のバッファが
一杯になるまで満たすような実装にはしないだろ。
231デフォルトの名無しさん:02/10/31 16:32
有名どころのネットワークゲームは
winsockを使っているのでしょうか?
Windows版のヤツは(直接かラップしてかはしらんが)
使っているはずです。ゲーム機についてはシラネ。
>>232
ゲーム機はps2sockなどを使っています。

>>230
どっちが性能いいの?
fgets()は改行が来るかエラー・EOFになるまでは何度でもread()を呼ぶよ。
従って、blockingモードのソケット+select()+fgets()では、相手が
行の途中まで送信した後改行をいつまでも送らなければ、ブロックを
回避できない。よって、fgets()を利用する場合はselect()ではなく
alerm()などの手段でタイムアウト管理するのが普通だろう。





236デフォルトの名無しさん:02/10/31 19:07
winsockを使ってTCP/IPをC言語でプログラムしてます。

recv関数は相手が送られてくるまでまちつづけてると思うのですが、受信スタートしたときの時間を取りたい場合どうすればいいのでしょうか?
待ち時間と受信にかかった時間をとりたいとおもってます。
selectでデータが受信バッファにあるかどうか分るから、
最初のデータが到着するまでを「待ち時間」とし、そこから最後のデータが
到着するまでの時間を「受信にかかった時間」とすればいいと思う
238236:02/10/31 20:04
>>237レスありがとうございます。
今select関数を使わず以下のようにしてるのですが、select関数を使った場合どうなるのでしょう?
それぐらい自分でしろと思われるとおもいますが、時間がなくて・・・

intrecving(SOCKET *serversock,double *buf,intlen)
{
intrec=0;
intcur=0;

while(rec<len){
cur=recv(*serversock,(char *)buf+rec,len-rec,0);
if(cur==SOCKET_ERROR){
printf("\nRECVエラー(エラー番号=%d)\n",WSAGetLastError());
closesocket(*serversock);
return -1;
}
rec+=cur;
}
return 1;
}
239デフォルトの名無しさん:02/10/31 20:28
P2P な UDP のコードを書いてるのだけど

ネットワーク内ブロードキャストに投げたデータグラムは
すぐさま自分自身でも受け取ってしまうけど、
受け取ったデータグラムが自分自身が投げたものであるかどうかを
知る、いい方法はありますか?

UDPポートはひとつで、送受兼用です。
普通、データに送信ノードのIDを埋めたりしない?
241239:02/10/31 21:05
ノードIDをつくりだしたくなかったので横着しようと思ったんですが甘かったかしら。
どうせLAN内で動くものだし、素直にインタフェイスのアドレスでも得るかのう。
recvfromのMSDNの記述から、
>>If the from parameter is nonzero and the socket is not
>>connection oriented, (type SOCK_DGRAM for example)
>>the network address of the peer that sent the data is
>>copied to the corresponding SOCKADDR structure
243230:02/10/31 23:57
>>234
ネタか?・・・まぁいいや。まじめに答えてあげるよ。
FILE *関係の関数、特にgetc()はマクロで実装されてる事が多いから、
バッファが空でなければ、そのチェック自身と一回の配列アクセスだけで
関数呼び出しすらなしに1バイトのデータを取得できる可能性が高い。

recv()の場合は、システムコールの最低限のコストの数百クロックに加えて、
ファイルディスクリプタや引数の値やアドレス空間のチェック、
実装によってはCPUの再スケジュールやその他もろもろが発生するから、
バッファリングされたユーザ空間だけでの場合と比べて何桁かは遅い。


>>235
ブロックして困るようならfgets()なんか使わずに自前のバッファを使うべき。

毎回FILE*のバッファを一杯にしないってのは、一回read()してバッファにデータが
残ってるうちは、満杯にするために再度read()することはないって意味だよ。

複数回read()されると、一度改行を受信してもfgets()から復帰できなくなる。
この場合、条件によってはお互いに半デッドロックって最悪な状態もありうる。
>>236
最初に書いた条件だとselect()する必要ないと思うが。
複数のソケットを待機するか、タイムアウトさせたいのでなければ必要ない。

おそらく、最初のselect()が完了してからを「受信にかかった時間」としたいんだろうけど、
select()直後のrecv()が復帰するまでにかかる時間は無視できる範囲内になるし、
場合によったらオーバーヘッドによって生まれる誤差の方が大きいかもしれない。
245235:02/11/01 00:40
> ブロックして困るようなら
「無限にブロックしても困らない」というケースの方が少ないと思われ。
ただし先にも書いたように、alarm()によりread()に割り込めば
無限にブロックすることは回避できるので、fgets()を使うのが
常にまずいとはいえないだろう。

だから、単純に「blockingソケット+select()+stdio」の相性は良くない、
とだけ云えば良い。select()は次回のread()がブロックしないことだけは
保証するが、1文字より多くの文字を読み取る可能性のある全ての
stdioの関数は、2度以上のread()を行う可能性があるからだ。
# まあ、SO_RCVLOWATを設定することでこの辺の事情は変わるが...
non-blockingソケットであれば、stdioを使うべきではないのは云うまでもない。

移植性を考えれば、最初から自前でバッファリングを行う方が良いのは同意。
>>243
結局>>226>>225の条件(ブロックしない)への回答としては
イマイチってこと?
247245:02/11/01 00:45
あー書いてる間に割り込まれた。そうかalarm使えばいいのか
248246=247!=245:02/11/01 00:45
おまけに名前欄間違えるし…鬱だ回線切って寝よう
winsockでalarmはないだろう、とか
250230:02/11/01 01:42
>>245
そう?ブロックしても困らない状況は結構あると思うよ。
勉強目的とかでクライアントをお手軽に作る場合や、鯖だとしても、
タイムアウトが必須なほど資源的に程切羽詰まってない場合とか。

でも、alerm()は有効そうだね。
EINTRで再read()する実装あったら嫌だけど(w

>>246
究極的には、常にブロックを一切せずに一行読み込むのは不可能。
select()使ったとしても、タイムアウトするまではブロックするわけだし。
ただ、その待ち時間の間に他の事をできるかどうかの違いでしかない。

プログラムの関心がひとつのソケットにしかなく、
タイムアウトも無用であればブロックしようがどうでもいい。
251236:02/11/01 02:06
>>244
レスありがとうございます。
select関数を使っていない場合どうすればブロッキングされている時間、送受信にかかった時間をとれるのでしょうか?

recv関数の前後で時間をとると、ブロッキングの時間と送受信の時間の合わさったものがでるとおもいます。
どうすればできるのでしょうか?
252デフォルトの名無しさん:02/11/01 05:10
HORBを使っているのですが、
Error: default constructor not found. HORB server can not create class MachineAmbient
というエラーがでます。
どなたかHORBをご存知の方いらっしゃいましたら、このエラーのでる理由を教えてください。
よろしくおねがいします。
253244:02/11/01 10:16
>>251
recv()はデータが到達して読み込める状態になったら即座に復帰する。
待機時間と比べたらバッファに転送する時間なんてないに等しい。
要するに一回のrecvの時間を計ってもしょうがないと。
何回かrecvするなら最初のrecvから最後のrecvまでの時間を
計るとかならまだよいと。そういうことだよね。
255236:02/11/01 12:16
>>253
レスありがとうございます。
recv関数で1MBぐらいのデータを送受信してるのですが、ブロッキング時間と送受信にかかる時間をはかれと上からの命令でして・・・
やっぱりむりなのでしょうか?select関数をつかうプログラムでないとだめなのでしょうか?
256244:02/11/01 15:25
>>255
ごめん。実測したらselect()使うかどうかで結構差あった。

int result;
fd_set rdfds;
FD_ZERO(&rdfds);
FD_SET(*serversock, &rdfds);
// ここから待ち時間
result = select(*serversock + 1, &rdfds, NULL, NULL, NULL);
if (result > 0 && FD_ISSET(*serversock, &rdfds) {
// ここから受信にかかった時間
>>249
WinsockならWSAAsync系
>>250
> 究極的には、常にブロックを一切せずに一行読み込むのは不可能。
> select()使ったとしても、タイムアウトするまではブロックするわけだし。
タイムアウト0でビジーループをまわすとか。
> ただ、その待ち時間の間に他の事をできるかどうかの違いでしかない。
その違いこそが重要なんでしょ。ブロックしたら困る局面ってのは。
258デフォルトの名無しさん:02/11/04 19:27
ブラウザとかで、アクセスすると環境変数(ブラウザ名など)が残るのですが、
それを、独自のプログラムで実現するにはどうすればいいのでしょうか?
ご教授ください。
ちょっと調べればすぐわかるのに
おい、259 は 258 が何をやりたいのかわかるのか?
漏れはわからねぇ・・・
プログラムの対象がどちらかもわからん
HTTP サーバーを独自のプログラムで作りたいという話じゃないのか?
263デフォルトの名無しさん:02/11/05 00:54
selectで受信バッファしらべてるんですが、受信可能の場合は1を返すのでしょうか?
>>263
マニュアルページぐらい読もうよ・・・
265デフォルトの名無しさん:02/11/05 01:06
>>もうしわけないです
ディスクリプタ集合に含まれているディスクリプタの数を返す
っていうのがわからなくて・・できたらおしえてほしいのですが・・
ディスクリプタ集合のうち、反応があったものの個数が帰る
267デフォルトの名無しさん:02/11/05 01:23
じゃーソケット1つの場合は1がかえるということでしょうか?
>>267
1か0だ。>>266を読め
おまえら教えてください。

Windowsプラットフォームにおいて(開発/実行環境共)
SNMPトラップを発行するエージェントを開発する際、

1)市販ライブラリを使う。
2)Socketで作る。
3)Windows上のSNMP APIを使う。

どれがいいんですか?MIBは定義しなくてもいいです。
単にトラップをRISEすればよいという仕様で。

1)は再配布条件が厳しいです。
2)は面倒なんですが今一番現実的選択だと思います。
3)はどこにもドキュメントがありません。
 拡張エージェントの雛形を作ってレジストリに
 登録しました。で、どうやってトラップ発生させる
 のよ?
>>268
あとエラーのときは-1(winsockならSOCKET_ERROR)になるね。
IRCクライアント作ってるんですが、JOIN、PART、MODEとかのメッセージが
山のようにあるので参ってます・・。
このスレでIRCクライアント作ったかたいますか?
何か上手い方法ないですかね・・。
>>271
plum を参考にしてみては
ttp://plum.madoka.org/plum.html
273デフォルトの名無しさん:02/11/08 08:01
C言語で
マルチスレッドのサーバを書きたいと思っています。
http://x68000.startshop.co.jp/~68user/net/c-echo-2.html
手始めにこのページにのってる
echoサーバプログラムを走らせて見たのですが、
クライアントから
文字を入力すると
(クライアントの入力:)echo
(サーバからの文字返答:)echo
となって帰ってくるのが理想だと思うのですが、
実際には一文字入力した時点でサーバから返答されてしまい
eecchhoo
となってしまいます。
これを正常にどうさせるにはどうしたらよいでしょうか?
>>273
それ、理想的な挙動のひとつ。
おまえの理想に適った動作にしたいのなら、
鯖側を行バッファリングするようにしないといけないだろう。

「プログラムは、プログラマが書いたとおりに動く」
この一言を差し上げよう。
クライアント側でバッファリングしたほうがラク。
276273:02/11/08 18:50
ようやくわかりました。
クライアント側でメッセージを作ってから送信すればよいのですね。
277デフォルトの名無しさん:02/11/08 21:48
質問です
Windows98/MEでRawソケットを使いたいのですが...
どうすればよろしいでしょうか?

Winpcapとかはあんまり使いたくないんですけど....
socket(PF_INET, SOCK_RAW, int protocol);
SOCK_RAWはNT系専用でなかった?
>>279
WinSock2なら使えたんじゃなかったっけか?
>>280
WinSock2はWin9xでも使えたっけ?
>>281
winsock2は9x系でもつかえる。ちと特殊。
raw socketが使えるかどうかは知らない。
wsock2 は Windows 95 で動いたっけ?
Windows 98 では動いたと思うけど。
286284:02/11/09 08:38
そうか、ありがdj
287デフォルトの名無しさん:02/11/09 17:58
クライアント側はWinsock
サーバ側はバークレーソケットで
サーバクライアント型のプログラムを書いています。
プロトコルは

長さ(2バイト) + メッセージタイプ(2バイト) +本文
という感じにしているのですが、

クライアントから
pCaOut = new CArchive(theApp.pcsf,CArchive::store);
.
.
pCaOut->Write(buf,strlen(data) + 4);
pCaOut->Flush();

このようにして送信して、
サーバで
read_size = read(sock,buf,length);
してメッセージを受信すると
このread関数が受信待ちで停止してします。
この後、無視してクライアントから続けてメッセージを送るか
クライアントを終了するかするとread関数から抜け出せるのです、
現象からいってクライアント側のflushの問題かと思うのですが、
Flush()メソッドは呼び出しています。
どのような原因が考えられますでしょうか?
なにとぞアドバイスを。
lengthにはなにが入ってるの?
>>287
CArchiveなんか使ってるからだろ。
それじゃサーバ側がCArchiveのプロトコルを理解できないよ?
290271:02/11/09 22:36
>>272
レスどうもです。
かなり苦労しましたが、完全オリジナルで一応IRCクライアント完成しました。^^;
#まだテストバージョンですが…。
こんなに大変なのがわかってたら作らなかったな…。とほほ。。
TCP/UDP で論理的に有効なポートって 0〜65535 であってる? 999999 とか
無理だよね?
最近のTCPの解説書にはポート番号フィールドのbit数が書いてないのか?
293デフォルトの名無しさん:02/11/11 02:04
サンクス
バークレイソケット API だと 2 バイトだけど下層が IPv6 とか AppleTalk とか
他のプロトコルになると違うのかなと思って…
申し訳ありませんがどなたか
InternetGetLastResponseInfo関数の使い方を
教えていただけないでしょうか?

wininet関数用のGetLastErrorのようなものだと
思っていたのですが
BOOL InternetGetLastResponseInfo(
LPDWORD lpdwError,
LPTSTR lpszBuffer,
LPDWORD lpdwBufferLength
);
上記lpdwError,lpszBuffer,の意味がわからなくて。
どうかお願いします。
たんなる予想で。

lpdwError:DWORDへのポインタ。エラー番号が返る。
lpszBuffer:バッファへのポインタ。文字列が返る。
lpdwBufferLength:用意したバッファサイズ。lpszBufferへセットされた文字列長が返る。
lpdwBufferLengthは
DWORDへのポインタ。用意したバッファサイズをセットし、lpszBufferへセットされた文字列長が返る。
へ訂正。
298デフォルトの名無しさん:02/11/11 22:27
サーバソケット開くときに、「どの IP への接続も受け付けます」って事を明示的に
示すには 0.0.0.0 とバインドすれば良いのでしょうか?
INADDR_ANYを使ったほうが...
というか、正確には「どのインターフェースでも」だよね。
>>299-300
C/C++ ならそうするのですが Java なので明示的な定数が定義されてません。
0.0.0.0 が INADDR_ANY と等価でないケースって何か考えられますか?
Javaは相変わらず糞だねえ・・・
つかJavaでサーバーソケットなんかやるなよ。
connect(winsock)時の接続に失敗した場合40秒ぐらい時間がかかりますが
これを短くする事って可能でしょうか?
>>303
非ブロックモードにしてwritableになるのを待つ
タイムアウト時間はご自由に
305草加市在住の初心者:02/11/12 18:37
初心者質問ですいません。
ちょっとスレ違いかもしれませんが、FTPに関しての質問です。(といってもコネクトの部分なんであまり関係ないですが)
最初のコネクトの後
以下のようなメッセージが帰ってきます。

220 xxxx FTP server (Version 4.144 Tue Dec 25 12:10:05 JST 2001) ready.

このとき正常にコネクトできたことを判断するのに
メッセージに
「220」という文字列があることでうまくいったと判断していいのか
「ready」も見るべきなのか、そもそもそういう方法で判断してはいけないのか
教えていただけないでしょうか?
>>305
RFC嫁
>>301
漏れはJava屋じゃないが....
ServerSocketのInetAddressを指定しない版のコンストラクタが、
INADDR_ANYの指定に相当するはずだが。
どうしてもInetAddressを使いたいのであれば、
InetAddress.anyLocalAddress(InetAddressのstaticなinstance)が
INADDR_ANYに相当するようだが、微妙にundocumentだったりする
みたいなんで、InetAddressを使わないのが正しいんだろうな。
308デフォルトの名無しさん:02/11/14 00:37
VB&winsockを使いプログラムを組んでいるのですが、
送られてきたデータをどの処理に使うかというように振り分けたいんです。
例えばデータがチャット用のTXTなのか、
他の処理に使うためのデータなのかというような感じで判別したいのですが・・・
クライアント側で送るデータにヘッダーみたいなものを付けて
それをクライアント側でCASE文あたりで判別できればいいなと思うのですが・・・
色々調べてみたのですが、いまいちそれらしいものが見つかりませんでした。
どなたか良い方法を教えていただけないでしょうか?
おねがいします!
>>305
SMTP, HTTP, FTP なんぞのメジャーな TCP プロトコルは数値 3 桁だけで
意味を決定できるように出来ている。
>>308
データの頭にヘッダつければいいだろ。
VBだったら&でつなぐのか?

ポート分けちゃうという方法もある罠。
311デフォルトの名無しさん:02/11/14 08:27
NetBIOS over TCP/IP(NBT)のパケットの仕様知りたければ、どうすれば良いのでしょう。
M$は仕様公開してないよね?Microsoftネットワークってのは非公開なのか?
312デフォルトの名無しさん:02/11/14 08:39
具体的には、Microsoftネットワークのパケット送って、相手先にファイルのコピーしたいです。
RFC1001、1002もそこまで書かれてないような気が...
sambaのソース嫁
314デフォルトの名無しさん:02/11/14 09:54
すごい。そんな方法がアタカ。先ずやってみる。>>313
でも、Microsoftネットワーク仕様公開してるとこあったら教えてね。
315デフォルトの名無しさん:02/11/14 10:03
でも、sambaってNetBEUIだよね。パケットは同じ?
316デフォルトの名無しさん:02/11/14 11:02
実はDOSでパケットプログラミングしたいんだけど、
sambaはUNIX用だから、Socketプログラミングになってるんじゃないかなぁ?
パケットプログラミングって……何?
318デフォルトの名無しさん:02/11/14 13:00
パケットドライバにアクセスするプログラミング。
オレ語を説明無しに堂々と使うなよ・・・
320デフォルトの名無しさん:02/11/14 13:57
sambaのソースファイルかコードの説明してあるサイト無いかな?
デバッガで追いかけようにもLinux無いし...
321デフォルトの名無しさん:02/11/14 15:43
samba少しづつ分かってきた。
SMBのlogin/offは、そのまんまcli_login.cがある。
SMBリクエストに対しては、process.c/switch_message()関数が応答で、実態はreply.cにある。
で、逆にSMBに要求はどこから出してるんだろう?
322デフォルトの名無しさん:02/11/14 16:00
namequery.c/resolve_name()関数はWinユーザからIPアドレス取得かなぁ?

SMBに入出力があるわけだから、SMBクラスにしといた方が読みやすいと思うんだけどどうよ。
323デフォルトの名無しさん:02/11/14 16:58
Linux/Sambaしてる方、教えて下さい。

SambaのGUIからNTのマシンにファイルをコピーするとき、どの関数がコールされますか?
http://samba.org/doxygen/samba/head/clilist_8c.html
みれ。 smbclinet.cも参照な。
それと、Sambaは鯖ソフトだから、SambaのGUIと
言われても、設定用のSWATくらいしか思い浮かばん。
325デフォルトの名無しさん:02/11/14 17:31
凄い、解説サイトだ。でも、今一つcli_list_newが何なのか分からない。

smbclinet.cが見つからないけど、libsmbclient.cのこと?

Linux側にはSambaのGUI無いんだ。どうりでGUIソース無いわけだ。
326デフォルトの名無しさん:02/11/14 17:39
あ、なんか勘違いしてたかもしれない...
Linux端末から、WinNTサーバにファイルをコピーすること出来ますか?
それが出来る場合、コールされる関数が知りたいです。
確かに
http://samba.org/doxygen/samba/head/libsmbclient_8h.html
の方がわかりやすいかもね。 このばあい、多分、
smbc_init, smbc_open/smbc_creat, smbc_write, smbc_close
だろうな。
328デフォルトの名無しさん:02/11/14 17:48
smbc_open/write/closeで、ネットのマシンにファイル書けるんだー。
有難うございます。>>327

そうかぁ、fileとcopyで全文検索かけてもひっかからないわけだー。
要らないreply.cはひっかかったけど。
>>326
関数とかは知らんが、smbclient(CUIのftp clientみたいなツール)の
ソース追えば実際にファイル転送してるところは分かるんじゃない?
>>326
Sambaにはsmbclientっていう、CUIなftp clientっぽいツールも付属
してるから、それのソース追うのが手っ取り早いかも。
ありゃ、書き込み失敗したと思ったらちゃんと書かれてやんの。
329はちとタイミング外したレスだったので無視してちょ。
332デフォルトの名無しさん:02/11/14 18:01
smbclient(CUI)のソースがlibsmbclient.cということで、合ってますか?>>329

libsmbclient.cは今見てますが、openとかrenameとか関数名分かりやすいです。
333デフォルトの名無しさん:02/11/14 18:13
smbc_open/write/closeからさらに、cli_open(clifile.c)/write(clireadwrite.c)をコールしてるね。
334デフォルトの名無しさん:02/11/14 18:23
cli_open/write等から、
cli_stup_bcc/cli_send_smb/cli_recieve_smbがセットで呼ばれてるけど、
ここでパケット送信&受信?
生のread/writeが出てくるまでクリック続けたら分かると思うが。
336デフォルトの名無しさん:02/11/14 18:43
出てきたYO!
cli_send_smb→write_socket→write_socket_data→write
という感じ。
fdはファイルディスクリプタだから、ソケットもファイルとして扱われるんだ。
337デフォルトの名無しさん:02/11/14 19:17
話は戻るけど、Microsoftネットワーク仕様公開してるとこが無いことははっきりした。

Microsoftが非公開だったネットワーク・プロトコルとAPIを公開
http://www.atmarkit.co.jp/fwin2k/insiderseye/20020927unveilapi/unveilapi.html

守秘義務契約に調印だってYO!
プロトコルに守秘ってのも、インターネットでクライアントの種類が無数になった時代に何だかな...
少しずつMSを叩けるネタが減っていくな。悲しいことだが良いことだ。
>>337
クライアントの種類が無数になったって守秘にするプロトコルと関係ないクライアントだろ。
「プロトコルに守秘」と「インターネットでクライアントの種類が無数になった時代」というのは関係ない。
340デフォルトの名無しさん:02/11/15 08:10
Samba解析age。

このまま、Samba for DOS作っちゃえ。
分厚い本を何冊も読み漁って勉強してると、
同じだけ勉強してたら弁護士にでもなれそうな気がするんですが・・
>>341
それもまた人生。
目指してみては?
343デフォルトの名無しさん:02/11/18 15:21
UNIX用ソフトのSocketに対するread/writeをDOS用に書き換えたいのですが、
NDISやODIのサンプルコードが見つかりません。
M$もNDISを利用するサンプルコードを出してないようですが、どうなんでしょう?
>>341
楽しくないなら辞めた方がいいだろうねぇ。
>>341弁護士は積み重ねると自分の背の高さより高くなる本の山の内容をすべてそらんじられるほど勉強するそうだけど。友人に目指しているのがいるんだけど、勉強のしすぎで吐いたってさ。
>>345
それもまた人生。
347デフォルトの名無しさん:02/11/18 19:26
DOSからPacket Driverを使ったサンプルコードとかあるのでしょうか。
どっかにあるはずだけど、netに転がってるかはしらん。
DOS時代にはThe Netが一般的じゃなかったから、
*socketのようにはいかないだろうとは思うけど
349デフォルトの名無しさん:02/11/19 01:03
proxy経由のSSLを使ったSocket通信について書いてある
お勧めのサイトとかあります?
CONNECTメソッドとかを発行するとこまでは
辿り付いたのですが・・・
PROXYから、CONNECTが帰ってきたら、その時点で
PROXYは無いも同然。

あとはSSL_connectとか発行するだけやん。
どうもです。
そうなんです。SSL_connect()でこけます。
やっぱり、CONNECTメソッドのハンドシェイクが
うまくいってないんでしょうね。
352レッドバグ:02/11/19 02:07
>>347

「FreeBSD ネットワーク管理ガイド」
 ピアソン エデュケーション /刊

 にDOSのネットワークソフトの事も書かれてて.
 フリーのソフトなどもいくつか書かれてた.
 ただし,URLが切れているのもあるけど,フリーの(ソース付き?)プログラムなどは,以前私が,グーグルでサーチしなおしたら,出て来ました.
 参考になるかどうかは分かりませんが.
 
353デフォルトの名無しさん:02/11/19 09:20
>>352
参考になりますが、せめてDOSフリーソフトのお名前だけでも...
354レッドバグ:02/11/19 10:20
>>353
 すまぬ.
 その本がどっか逝っているので調べられなかった....
 おまけにDLしたはずのDOSプログラム(とアドレス)もどこにあるかわからん.
 申し訳ないけど,書店に行って上記の本を当たってくださいませ.
355デフォルトの名無しさん:02/11/19 10:38
マイナーな質問ですみませんが、yahooオークションの商品の終了時間をjava
で取得したいのですが、どなたがご存知な方がいらしたら教えてください。
よろしくお願いします。
356デフォルトの名無しさん:02/11/19 11:13
DOS Trumpetとは、DOSのTCP/IP 見たいなもんですか?
357デフォルトの名無しさん:02/11/19 11:56
初歩的な質問ですが、IPアドレスはいつ決まるのでしょう。
UNIXでは、自分で設定するしかないと思いますが、
SMBの場合は、ログインのあとに割り振られるのかな。
dhcpはどこへ消えた
チャットサーバ作ろうとしてるんだけど、
1つのIPとポートに接続可能なクライアントの数って
六万コネクト(?)くらいなのでしょうか(65535くらい?)
オンラインゲームとか、かなりの数がサーバに繋がると思うんだけど
どうやって処理してるのだろう
>>359
普通に負荷分散

質問:
Unix C でマルチキャストでパケット配信するにはどうやってグループに
JOIN するんだ?
359っす
えーと、フツーに負荷分散はいいんですが・・・前提かいてませんね。スマソ
グローバルアドレスが1個/ネット自体の負荷はキニシナイという仮定で。
クライアント ← net → PC1 ←→ PC2〜PCn
として、実際の処理はPC2〜nにさせます。
で、振り分けさせるPC1にクライアントがどれくらいコネクト可能か
知りたいな、と。
>>359
コネクションの識別には送信元IP、送信元PORTも使われるのです。
>>361
PC1 の役割がルーターかプロキシか (つまり OSI 参照モデルの何か) による。
>>362
ということは、最大数自体は気にしなくていいとという感じなんですね
ありがdございまス
359=364っす
>>361
ありゃ。
役割としてはPC1がPC2-nの接続数を覚えてて、てきとーに振り分けて PC2-nと接続
PC2-n は互いに通信して情報やりとり/データ処理
ルータではないとはおもうけど、プロキシと言っていいのだろうか・・・
>>365
だ・か・ら、

PC1は、TCP/IPでクライアントとコネクションを張って(レイヤ7で)
振り分ける必要は必ずしもない。

パケット毎に、送信元のアドレス&ポートをハッシュしてPC2〜PCnに
(レイヤ3または4で)振り分けたって良い。

いずれにせよ、L4スイッチとかL7スイッチ使った方がPC使うより速い
と思うけど。
367デフォルトの名無しさん:02/11/19 13:49
質問です。全二重のNICとスイッチだけ使ったEthernetのLANで
UDPのパケットが落ちるときというのはどういう時ですか?
コリジョンは起きませんよね?
Linuxとかのデフォルトだと、1つのマシンでオープンできる
ファイルディスクリプタの数は4096個まで。
356っす
>>366
おお、そんな便利な物があったんですか
そーゆースイッチって値段高いのかなぁ・・・
#ふつーのスイッチで付いてる機能なのだろうか
プログラム的にはPC2-nの通信のみでイケそうですねえ

ありがとうございました
たとえば、でかいデータを2つ続けて送ったとき、
最初のが送り終わらないうちに次を送ると、
最初のがなくなっちゃう事がある。
>>368
う、socketもファイルディスクプリタとして消費されてしまうのだろうか
テストプログラムつくらなきゃいかんな(泣)
>>367
UDPは運がよければ相手に届くというだけで、
ノイズが発生したり黒ヤギさんが配達したりとかでも消えるような。
>>371
無謀だな。そんなことすら知らないようなレベルで
10万単位の接続をさばけるのを作れるとは思えない
>>369
負荷分散(サーバロードバランシング)機能のついたL4スイッチなら、
300万円くらいからあるんじゃないか? まあこれ以上は板違い。
369=371っす
>>373
はい。自分でもそう思います。
趣味で作るサーバ&クライアントで、多くても100人前後と目測しています
作ったあとで10万コネクトサーバにプログラムを変更するのは辛いので
得た知識はとてもためになりました。

>>374
なるほど。その値段ならPC1を作る時間+値段とL4スイッチという物の
性能とを考えればいいわけですね。どうもですー
376デフォルトの名無しさん:02/11/19 15:18
<違ったスレッドへ投稿しちゃった。^^;>

本当はここ。こんにちは。よろしければ教えてください。

現在、VC++のサンプルプログラムのチャット

プログラムをサーバ側とクライアント側のプログラム

を同一マシンで動かそうとしているのですが、

クライアントが接続するときに接続拒否をされているようです。

私のOSはWIN98ですが、やっぱりこれが原因でしょうか?

サーバー機能がないOSだからでしょうか? よろしくお願いします。
377デフォルトの名無しさん:02/11/19 15:25
市販のTCPやソケットでSMBクライアントを作ろうと思っています。
TCPやソケットはIP必須で、SMBのクライアントはIPが表面に出ないので、無理でしょうかね?
SMBでは、DHCPでIPアドレス自動設定してますが、いつやってるんでしょうか?ログイン時?
>>376
WIN98でも動くはずです。
接続拒否されているという判断は、どうなってるから拒否されてると
思ったんですか?
エラーは出てますか?また、出ていたらどんなエラーですか?
サーバのポート設定とクライアントのソレとは同一ですか?
クライアントの接続IPは正しいですか?
ファイヤーウォール等のソフトは動かしてますか?
>>377
DHCPで設定やってるのなら、PCに名前がついてるのでは
その名前でやりとりすれば、IPは知らなくても繋がるのでは
380デフォルトの名無しさん:02/11/19 15:44
>> 378 さん

えっと、CSocketクラスのConnect()時です。
GetLastError()を使ってエラーコードを取得しました。
ポートもIPアドレスも同じ設定です。
んー、でも動くのならやはりこちらの設定なのかなあ?
381デフォルトの名無しさん:02/11/19 15:48
PC名からIP取れるわけですね。>>379

PC名をSMBに追加するときにIPアドレス決まって、
他のサーバに問い合わせるときにサーバのPC名からIP取れる、
という考え方であってますか?
>>380
エラーコードを取得したのなら、どんなエラーかわかるのでは
どんなエラーか当方はわからないので、これ以上はなんとも。
>>381
<たとえば>
わたしは www.2ch.netのIPを知りません。
でも、プラウザにwww.2ch.netと入れてエンター押すと、IP知らなくても
サーバに繋がりデータを読み書きすることができます
</たとえば>
prowser
385デフォルトの名無しさん:02/11/19 16:12

エラーコードは 10016 で、WSAECONNREFUSEDだと、"接続
試みたがリジェクトされた"と、いうエラーだったはずでしたが、
ヘッダファイルで確認したところそんなコードは定義されておらず、
なぜ、接続拒否だと決め付けたのか自分でも理解できません。で、
もう一度エラーコード確認しようと動かすと、正常に動いてしまいました。
良く分からないまま、OKとしちゃいます。いっしょに考えてくれて
ありがとう。(エラー出てた頃は、インターネットに接続しませんでした。
でも、同一マシンだしなぁ? まあ、いいや、貴重な時間すみませんでした。)
SMB,つーか、NBTは、TCP/IPがきちんと通ってある上の
プロトコルだから、NBTがどうこうしよう、って時には
すでにIPアドレスは設定済みな筈だが、、、

まさか、NetBEUIが通ってたりする話じゃねーだろ。
387デフォルトの名無しさん:02/11/19 16:31
>>386
NetBEUIは関係ないけど、
NBTクライアントのネットワークの設定にIPアドレスは設定しないよね。
じゃあ、いつ決まるの?ってのが知りたいです。
ログインのときに、コンピュータ名をSMBサーバに登録すんだよね?
だから、君の所はDHCPが通ってるんでしょうが。
SMBが動き出す前に、DHCPがTCP/IPの設定を
ひと揃い終わらせるの。 IPアドレスの決まったあとで、
SMBは動き出して、自分の初期化をするわけ。
>>387
すっきりと疑問を解決したいのであれば、本屋さんや会社の資料室や図書館へ行って
DNSとかTCP/IPとかの本を読んだほうがすっきりするかと。
387さんの疑問はどうやって不定なIPのPC名だけで繋がるかという事でしょうか?
<たとえば>
・田中さんのところへ電話したい
・電話帳をもってくる
・田中さんの苗字と名前で電話番号を轢く
・電話番号GET
・184の後に電話番号をプッシュ
・非通知拒否でギャフン
</たとえば>
>>385
定義されてますが
392デフォルトの名無しさん:02/11/19 17:18
>>388
それはSMBのサーバ側?クライアント側?

>>389
アンドキュメンテッドMicrosoftネットワークは読んだが。
とりあえず、M$はパケット内容どころか仕様を公開してないが。というかDNSとSMBは別なんだけど。
>>392
なぜSMBという事にこだわってるのだろう
TCP/IPを使った通信の仕組がわかれば疑問も解決するのでは
>>390 さんが解説してますし。
394デフォルトの名無しさん:02/11/19 17:32
>なぜSMBという事にこだわってるのだろう
SMBのクライアントをこれから自作するから。

>TCP/IPを使った通信の仕組がわかれば疑問も解決するのでは
SMBのパケットがTCP/IPの形式になっただけ。だから解決しない。

>387

SMBクライアントが、たとえば\\host\nameにアクセスしたとき、
サーバーhostのIPアドレスを、どうやって求めるか、って話なら
・グローバルキャストで訊く
・WINS鯖に訊く
・DNS鯖に訊く
・*hosts
という手段がある。というか、gethostbynameを発行するわけだな。
>>394
申し訳ないんですが、394さんの疑問点がよくわからないのです。
IPのかわりにPC名(というものアレだが)を入れるということが疑問なのでしょうか
IPとPC名がどうやってイコールになることが疑問なのでしょうか
397デフォルトの名無しさん:02/11/19 17:49
両方とも違いまふ>>396

SMBクライアントをDOSに実装するのに、DOS用TCPやSocketが使えるか、を検討してるんです。
TCPとか使うにはIPが必須になるわけで、SMBクライアントのIPはいつ決まるんだ、みたいな。
398デフォルトの名無しさん:02/11/19 17:50
SAMBAだと、ソケットに対するread/writeだけど、
DOS用ソケットで無料のものなんかないし、
Packetドライバプログラミングかなー、と。
399デフォルトの名無しさん:02/11/19 17:51
でも、Packetドライバプログラムのサンプルなんかどこにも無いよー。
ならやっぱり、>>388だろ。SMBが動き出す以前に
IPは決めないといけない。DHCPなり、固定IPなり。
もちろん、クライアントの話。サーバは関係ない。
402デフォルトの名無しさん:02/11/19 17:58
>>388 の内容が正しいとして、どうやってプログラミングするのか見えないよ。

外部スペックは決まってて、
製品をLANに接続してDOSクライアントの設定はある程度可能。
で、製品からLAN上の指定したフォルダにファイルをコピー。
IPを決めるどうこうってソケットプログラミングの範疇を超えるよね
404デフォルトの名無しさん:02/11/19 18:03
あ、ソケットプログラミングってのは、やっぱ、引数にIPが必須なわけですか。
DHCPクライアントの実装やったら、まあ、
ソケットプログラミングの範疇と言えないこともない。
406デフォルトの名無しさん:02/11/19 18:06
>DHCPクライアントの実装やったら、まあ、
どうやんだ?
SAMBAのソースん中にある?
つーか、質問者はコテハンにしてくれないかな
408デフォルトの名無しさん:02/11/19 18:08
SMBのパケット形式とか、TCP/IPのパケット形式とか、仕様が書いてあるもの欲しいな。
409SMB:02/11/19 18:10
了解>>407
でも、すみませんが今日は適当な時間で消えます。ログは明日読ませて頂きますが。
(;´Д`)y━─┛~~ なんでDHCPの実装がSAMBAの中にあるんだよ、、、
DHCPはDHCP。SAMBAとは無関係。
http://www.google.com/search?q=dhcpclient
411 :02/11/19 18:12
DOS上で動くSMBクライアントが作りたいってこと?
412SMB:02/11/19 18:13
その通りです>>411
なんか、わかって貰えてうれしい。
でも、SMBのまんまだと、実装大変なんで、ファイルのコピーに絞ります。
413 :02/11/19 18:13
DOS上で動くTCP/IPがまず必要なんだよね。WinでいうWinsockみたいな。
んで、それを扱うCかなんかのライブラリとして提供されてないと
一般人には手も足もでないよね。とりあえず、おいらには手も足もでません。
414SMB:02/11/19 18:15
>>413
PacketドライバはGetしました。Socketは良いのが無いです...
415 :02/11/19 18:17
Packetドライバって何なの?
データリンク層のパケットが送受信できるの?
416SMB:02/11/19 18:19
そうです。>>415
機能的には、NDISドライバやODIドライバと同じ。
でも関数が少ない分、Socketに近い気がする(だけかも)。
417デフォルトの名無しさん:02/11/19 18:20
ttp://www2.palnet.or.jp/~matsuda/soft.html
とftpだけで作れたりして
418 :02/11/19 18:20
>>416
ってことはTCP/IP自体を自分で実装するってこと?
そんなことできたら神じゃん。
有料でもどこかにあるだろうTCP/IPを買ったほうがいいよ。
419SMB:02/11/19 18:22
>>417
鯖側をいじることは許されてません。
確かにWin2000/IISなら、フォルダのプロパティで鯖にFTPサーバ起動出来て簡単なんだけどね。
でも、環境はそういう固定じゃないので。
421SMB:02/11/19 18:25
>>418
買えばすむ問題かなー、って不安がある。
どういうことかというと、最初に書いた、
TCPソフトが環境設定ファイルとかでIPとかネットマスクとか要求してそう。
インターネット用TCPソフトはあっても、SMB用TCPソフトはあるのかなー?
>TCP/IPのパケット形式
RFC嫁よ。

それと、
>インターネット用TCPソフト
>SMB用TCPソフト
意味不明すぎ。
423 :02/11/19 18:26
>>421
そりゃ、TCP/IPで通信する以上、そういう設定は必要じゃないの?
その設定はDHCPで取得することもあるだろうけど。
424SMB:02/11/19 18:29
RFCハンドブック買うしかないな。

だから、UNIXライクなTCPソフトならIP初期値を要求しそうって心配。>>422
425 :02/11/19 18:30
TCP/IPで通信する以上必要だと思うけど。
だって、どうやってルーティングするのさ。
426SMB:02/11/19 18:30
>>423
レスがループしてるよ。
やりたいのは、IPは設定せずにLANに接続出来るクライアント。
クライアントの設定で許されるのは、ユーザ名とワークグループであって、
空きIP調べて使うなんてユーザインターフェースは不可。
427 :02/11/19 18:31
ん?
ひょっとしてSMBってTCP/IP通信じゃないの?
WinでいうNetBUIE(?)みたいなやつ?
428SMB:02/11/19 18:32
>>425
ユーザインターフェースが決まってて、どう実装するかを検討してるの。
IP通信の原理上無理だとおもうが。
DHCPを実装しても、IP設定が自動化されるだけ。
430SMB:02/11/19 18:33
>>427
SAMBAはTCP/IP。もっと言うと、NetBIOS over TCP/IP。
431 :02/11/19 18:34
TCP/IPである以上、IPの設定は必要なんじゃないの?
432SMB:02/11/19 18:34
>>429
いや、Windowsのような動作をすれば良いわけ。
Winサーバの設定されてるLANに素直に入れるDOSクライアント。
Windowsのような動作って、何さ?
てきとーにIP振るのか?
434SMB:02/11/19 18:36
いや、普通にWINSが解決してくれればよいわけ。>>433
435 :02/11/19 18:36
なんか根本的にネットワークのことわかってないんじゃないの?
おいらもわかってないけど、たぶん、それ以上に。
436SMB:02/11/19 18:37
>>435
あの、そういう競争する気は無いわけ。
製品が完成すれば。
WINS鯖って名前解決しかしないのとちがうん?
それにWindowsにはWINS鯖を指定するフィールドがあるし。

あー、なんかだんだん分かってきた気がする。
つまり、WINS鯖かなんかに、「foohost : 192.168.0.4」と登録しといて、
そのクライアントは、foohostを探して、192.168.0.4を自分のIPとして
設定する〜とかそういうことか?
438SMB:02/11/19 18:40
WINSについては知ってるので書いとくけど、
WINSが空きIPを動的にふってくれるようだよ。
http://www2.palnet.or.jp/~matsuda/soft.html
に使えそうなものが色々あるから、検証されてはいかが?
[5]DOS 上でnfs をmountするfnfs
なんて使えそうなモノですのに。
どこでその情報を手に入れたのか気になるな。
WINSがIPを振るなんてはつみみです
WINSって使い物になるのですしょうか。
442SMB:02/11/19 18:43
有難うございます。>>439
ただ、UNIXベース(nfs、ftp、telnet)のものはやめておいて、SMBベースにしようと思います。
UNIXベースだと、Win鯖側でサービス起動ということが必要になるので。
SMBプロトコルとかが何のことかよくわからない人がいらしたら、とりあえず
http://www.samba.gr.jp/project/translation/using_samba/using_samba/ch01_01.html
へどうぞ
DOSでsocketプログラムが可能ならば、実装はたしかに不可能ではないと思われ。
ソースもあるわけだし。
あとは納期と金額というのは余計なお世話な部類でしょうけど、、、
>>442
わからない奴だなぁ・・・
お前がIPアドレスがどうのって書いてるから、必然的にNetBIOS over TCP/IPになんの。
それを使わないとすると、NetBEUIって、TCP/IPと何の関係もないプロトコル使う意味になるんだよ。
少なくとも、お前の今のレベルじゃ自作は無理。DOSで使える製品探して、無かったらあきらめろ。
NetBIOS over TCP over IPv6 なら、IPの設定いらんぞ(w
わたしなら、ネットワークにちゃんと対応したOSで組むんだけどなあ
DOSで作るよりも安定度や信頼性や手間や時間が(烏賊略)
NetBIOS over TCP over IPv6 on DOSを探せと?!(・<>・)
わたしなら、
LAN <-> 専用ハードウェア <-> RS-232C <-> DOS
にして、専用ハードウェアを外注。
自分で実装しろと言っているのだが(w
451デフォルトの名無しさん:02/11/19 19:21
IPv6を実装か、、、すべての機器&ソフトをv6対応に総取替!
サーバ側を変更できないのなら、サーバとやりとりするサーバ設置して、
そのサーバにクライアントを接続させればどんなプロトコルだろうと文句は
#言われるのだろうか
>>449
DOSで使えるLANボード/カードがいつまで手に入るかわからんし、
アリといえば蟻鴨しれヌ
久々に笑えるネタでした。
SMB氏は、まずマスタリングTCP/IP入門編から読まれることをお勧めします。
>>454
こないだ「マルチスレッドプログラミング相談室」にも楽しい奴いたよ(藁
リストをロックしないで、リストの中のリファレンスカウントオブジェクトを
増減さしてたら、って香具師だな
ふー。やっとわかった。
SMB氏はsambaクライアントを作りたいのではなく
Windowsネットワークにログインしたいんだな。
その手段としてSMBでヤろうとしているだけでは。
やることはファイルの入出力だろうけど。
そして同時書き込みされてファイルがあぼーん
で、sambaってことはTCP/IPで、TCP/IPってことはIPアドレスが必要。
でも設定はしたくない。で、DHCPじゃだめなの?
DHCPじゃ、いや。WINSがイイ。WINSが空きのIPアドレスを振ってくれる。
あれっ!DHCPでいいじゃん。
ってこと?
過程はともかく、
・DOSで
・SMBを使って
つながりゃ目的達成というように詠んでるんだけどニャー
http://www.samba.gr.jp/project/translation/using_samba/using_samba/ch01_04.html
をー読むと〜
MS製品のサーバに〜SMBで接続するならMSが正式に出したドライバ経由以外には〜
不可能なわけで〜〜
MSがDOS用SMBドライバを出していないかぎり〜〜
接続は不可能〜〜ラララー♪
上の文章を読んでも自作ドライバ等で接続するのなら〜
何がおきてもヘンじゃないということ〜〜
わたしが上司なら止めます。部下なら辞めます。
464デフォルトの名無しさん:02/11/19 20:55
サーバにNetBEUIが入ってたら >>463 でよさげだねー
>>419 の状態だと、入ってなかったらアウト!って感じなようだけど。
465デフォルトの名無しさん:02/11/19 21:29
VBでWinSockをつかってサーバで監視プログラムをつくります。
おすすめの本をおしえてください。
何を監視するのでしょうか。
467ゆうき:02/11/19 21:39
連立一次方程式についてのプログラム作成なんですが・・・。教えてください!!
使っているのはbasicです。
連立一次方程式を解く。
初期値(x=0)を与えて、蜘蛛の巣のようにして連立一次方程式を解いてみる。
1)y=2x+4 y=4x
2)y=x−1 y=−2x+2
3)y=5x+4 y=−3x+1
4)y=−x−2 y=1/2x+3

問題
1)方程式を入力する順番によっては解けない。
・・これを解決するには?
プログラムの観点から、どういうプログラムにするか?
・・なぜ解けなくなるか?
数学的に説明せよ。
こんな感じなんですが、よろしくお願いします。
連立方程式を解くサーバをつくる、という事でよろしいでしょうか。
プロトコルはもうおきまりになりましたか?
469ゆうき:02/11/19 21:43
間違えました。首吊って死にます。
470>>466:02/11/19 21:45
クライアントから信号が送られてきます。
それを監視します。
よろしくお願いします。
>>470
・VBでサーバを作り、クライアントはそのサーバに接続するのでしょうか
・パケットを盗み見して監視するのでしょうか
前者なら(うちはVB6ですが)ちゃんとマニュアルに出てました。
後者ならその手のソフトのソースがころがってたらソレを見てVBにするとか。
472ゆうき:02/11/19 21:52
>>470
VB初心者スレに行ってください
473>>471:02/11/19 21:52
ありがとうございます!
前者です。
そもそも、WinSockを使うのが定番なのでしょうか?
そのあたりもまだわかりません。
マニュアルというのは、なんのマニュアルでしょうか?
VBの?
よろしくお願いします。
474ゆうき:02/11/19 21:54
(・ロ・)ホ,('ロ')ホ--ッッ!!!… VB初心者質問スレ Part17
http://pc3.2ch.net/test/read.cgi/tech/1036154952/
定番つーか、ラクをしたければ Winsock "コントロール"を使うかも。
規模にもよるけど。
マニュアルというか、MSDNライブラリですねぇ
476>>475:02/11/19 22:04
ありがとうございます!
MSDNライブラリですね。
あとは調べてみるとhttp://www.emurasoft.com/winsock2.htm
この本がよさそうですね。VCみたいですが。
たしかに本は持っておいたほうがいいかもしれませんが、、、
VBで作るなら、この本はちょっと違うような。
ネットでVBのネットのプログラムのソース見るくらいで十分事足りるかと。
買うならネットワーク系の本をどうぞ。
478>>477:02/11/19 22:14
ありがとうございます!
ネットワークの本というのは、やはりTCP/IP関係ですかね?
そのあたりをイチから勉強する時間はなさそうですが、
概念は大切だと思うので、本を勝ってみます!
TCP/IP関係は、わからなくても一冊二冊もっておくといいかもしれません
気の向いたときに読むと、だんだんわかってきますし。
VBでWinsockコントロール使うだけならさほどむずかしくはないと思いますが、
しっかりとあいまいではない情報/知識をもっておかないと、何かと不便です。たぶん。
>SMB
あんたの言うDOSって、windows付属のDOS窓上とかじゃないよね?
だったらwinsockとか調べるの完全に無駄だと思うけど。
WindowsのDOS窓でやるんだったらこんなに長いネタ、、、じゃない、話題に
ならないと思うデスが。
昔DOSで簡易FTPサーバとか作ったことあるけど
マルチクライアントとかじゃなければ簡単だった印象があるよ。
なんとかっていうモジュール組みこんで使ってた。
ちなみにWindowsでIPアドレスを設定しなかった場合は
DHCPによる決定を試みた後、Windowsが適当にIPを決定する。
この決定方法はどこかに資料があった気がするが(RFC投げてたかも知れん)
>>483
このへんか?
http://support.microsoft.com/default.aspx?scid=KB;en-us;q220874

169.254.0.0/16のプライベートアドレスから、今のセグメントで他に
使ってるやつがいなさそうなアドレスをてきとーに選ぶらしい。
485SMB:02/11/20 09:09
Sambaの本良さげ。とりあえず買おう。
Lan Managerはだめです。
というより、Lan Managerで動作してるものを置き換えるものを作成します。
MSが売る気なくてライセンスしてくれないんで。
486SMB:02/11/20 09:18
で、今興味があるのは、Sambaのソース(ソケットにread/write)と
パケットドライバ(send/recieve)の繋ぎのプログラムはどうなるかです。
パケットドライバにアクセスしてるコードを手に入れましたが、
sendをwhileでリトライしているだけ、みたいです。
つまり、sendの成功失敗はドライバが教えてくれるので、
リトライするだけでTCPみたく通信を保証できるかな、と。
で、送る内容はSambaのコードが作ったパケットだけで良いかな。
487SMB:02/11/20 09:37
みつけたコードです。intrって何だ?

int pkt_send( char *buffer, int length )
{
struct REGPACK regs;
int retries;

retries = 5;
while (retries--) {
regs.r_ax = PD_SEND;
regs.r_ds = FP_SEG( buffer );
regs.r_si = FP_OFF( buffer );
regs.r_cx = length;
intr( pkt_interrupt, ®s );
if ( regs.r_flags & CARRY )
continue;
return( 0 );
}
return( 1 );
}
MSのライセンスなしでWindowsネットワークに繋げるソフトを作って販売するわけだ。
>>486
書き方は茶化してるような感じだけど、 >>462 は的を射てると思われ。
冷静に現状を把握しないと、会社の信用すら揺るがしかねない
他に手がないわけでもないのに。
>intrって何だ?
って、intr( pkt_interrupt, ®s );
にinterruptって書いてるやん、、、
情報ソースはわすれたけど、SambaのバージョンとNT系のバージョンによって
NT側のレジストリいじったりしなくちゃいけなかったよねぇ
Samba for DOSはかなりヘビーな代物になりそうですね。
ファイル名の8.3問題も浮上?
>>488
SambaもMSのライセンスを受けてないし
Sambaをパッケージに含めて販売してる会社もあるわけだが
>>490
パスワードの暗号化問題?
>>491
http://www.samba.gr.jp/project/translation/using_samba/using_samba/index.html
を読んで、どんな歴史なのか見るといいかも
SMBに入るのが良い悪いじゃなく、
MSが独自仕様をほどこして仕様も公開していないSMBに入れないというのが難点かと。
>SMBに入れない
入れるようになってるんでないの?
>>493
はい。
ふつーにUNIXなどでSambaサーバたてて、
ふつーにWindowsで共有したりして、
ふつーにMACなどで共有したりして
やれば、問題ないかと。
495デフォルトの名無しさん:02/11/20 13:24
>書き方は茶化してるような感じだけど、 >>462 は的を射てると思われ。
>冷静に現状を把握しないと、会社の信用すら揺るがしかねない
>他に手がないわけでもないのに。

だから、こういう書き方やめてやれよ。
Lanmanのライセンスに問題があるから、別もの作ってると書いてあるじゃないか。
邪魔するレスが多いな。
単に全部読んでない人じゃないの?
いちいち邪魔するレスに気をたてても。
ま、できるものならやってみろよ
497=粘着
俺には無理だけどな。
500SMB:02/11/20 13:53
パケットドライバ上に実装した、こういうの見つけたんだけど。

static int tcp_read( tcp_Socket *s, byte *datap, int maxlen )
static int tcp_write( tcp_Socket *s, byte *dp, int len )

これ使えば、Sambaのread/writeと等価かな?
これでDOSコンパイル可能???(いや、全機能可能とは言わんが)
501SMB:02/11/20 13:56
int sock_read( sock_type *s, byte *dp, int len )
int sock_write( sock_type *s, byte *dp, int len )

やっぱ、こっちかな?
頼むから、SambaとTCP/IPの違いをわかってください。
上記コマンドでやるならば、Sambaプロトコルを自作しなければいけません
確かに煽ってるような発言もあるかもしれませんが、
有益な情報まですべて無視してるように思いうけます。
別のものを作ってると書いてあるんだから、Sambaじゃないんじゃないの?
プロトコルは何を使う予定なのでしょうか>SMBさん
504SMB:02/11/20 14:07
何を言いたいのだろう?>>502
Sambaプロトコルを自作するんじゃなくてSambaのソースの一部をDOS上でコンパイルするんだが。
505SMB:02/11/20 14:10
NetBIOS over TCP/IP。>>503
ま、Sambaのコードの通り。
506SMB:02/11/20 14:12
説明しときますが、502さんの頭の中では、TCP/IPはTCP/IP、SambaはSambaなんだろうけど、
一応SambaはTCP/IP経由でSMBにログインしまふ。
>>500-501には唐突に関数プロトタイプが出てくるだけで
そんな説明一言もありません。それで分かれと言うほうが無理
お前の頭の中ではすべての解説がそろってるんだろうけど
508SMB:02/11/20 14:18
>>507
Sambaのレスは >>313 以降から続いてるので、そこから読めばわかります。
>>SMB氏
例えばですけど、そのDOS上でGETするだけのHTTPクライアントなら作れますか?
別なものを作ってるとかいてあったから、Sambaじゃないのかとおもいました。
>504-506

>でも、sambaってNetBEUIだよね。パケットは同じ?
とか
>SMBの場合は、ログインのあとに(IPが)割り振られるのかな。
とか
>TCPとか使うにはIPが必須になるわけで、SMBクライアントのIPはいつ決まるんだ、みたいな。
とか
逝ってた人の発言とは思えませんね。笑い。
NetBIOS over TCP/IP
http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1001.html
http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1002.html

これを実装するためにsambaのソースをパクろうとしてるんだよね。
そしたらまずDOS上でTCP/IPアプリケーションが作れる環境がなきゃだめだよね。
その環境としてパケットドライバ上に実装した
static int tcp_read( tcp_Socket *s, byte *datap, int maxlen )
static int tcp_write( tcp_Socket *s, byte *dp, int len )

int sock_read( sock_type *s, byte *dp, int len )
int sock_write( sock_type *s, byte *dp, int len )
が使えるかも?っていってるんだよね。
もし、使えるならこれらの関数を使ってHTTPクライアントが作れるわけだ。
まずは、簡単なHTTPクライアントから始めてみてはどうだろう。

なんか違うかな。もー、よくわからんけどがんばるぜ。

ん?

SMB/CIFS <--ここを作るの?
-------
NetBIOS  <--ここはどうするの?
-------
TCP/IP   <--ここはどうするの?

NetBIOSとSMB/CIFSをsambaのソースからパクるってことかな?
TCP/IPはDOSのパケットドライバを探してきたから
それを使うと。
で、何が困るの?
誰が困ってるの?
僕がネットワーク管理者なら、SMB4DOSを繋がれるのは怖いかな。
518SMB:02/11/20 15:54
HTTPは自分は要りません。

で、libsmbclient.cのsmbc_open/smbc_creat, smbc_write, smbc_closeを移植しようかな、と。
その関数の前後に、nt_logon/logoffすれば完成?
完成ですね。おめでとうございます。
>>518
要る要らないの問題じゃない。

お前の言うパケットドライバで簡易HTTPクライアントくらい
ソケットの場合と同じように作れなければ、sambaの移植は無理。
そのくらい文章から読み取れよ。

テストもせずにパケットドライバでソケットをエミュレートする
コードを書けるんなら止めはしないが。
今までのレスから見てそんな技量があるようには
とても思えないが漏れが困るわけでもないしどうでもいいや
いや、本当はものすごい技量を持っているが日本語が不得手なだけかもしれないよ。
社内用のソフトで、ほかの客に渡すわけではないんじゃないの?
つながりゃいいみたいだし。
今までにあがった問題点も、さほど気にとめてないようだし。
まず、ネットワークの階層構造を理解してるかどうかが激しく謎だ。
あー!
static int tcp_read( tcp_Socket *s, byte *datap, int maxlen )
static int tcp_write( tcp_Socket *s, byte *dp, int len )
int sock_read( sock_type *s, byte *dp, int len )
int sock_write( sock_type *s, byte *dp, int len )

これってsambaのソースかー
526SMB:02/11/20 17:37
それは、wattcpのソース。
これが“SMBを使って”という前提じゃなければ支持者も沢山いたんでしょうね。
合掌。
[SERVERS(NT)]-(SMB)-[NewServer(NT)]-(OrginalProtokol)-[DOS]
にすると、今のサーバはSMBで繋がるし、SMBクライアントも移植しなくてすむし。
スペルが間違ってるのは愛嬌だ。
>>526
あれ?
じゃあ、前のであってたか。
そっかー
wattcpってのがあればDOSでもTCP/IP通信ができるんだね。
最初のころパケットドライバってのはデータリンク層の通信を
するって書いてあったからTCP/IPはいったい誰がやるんだー
って、思ってたけどすべて謎は解けた。
LANManagerってもう配布しなくなったんか。
NT3.5の頃はオマケでCD付けてたり、Niftyからダウンロードできたり
したんだけどねぇ。

しかしパケットドライバベースでいきなりSMBか。若いってすばらしい。
Linux版のsmbclientは、スタティックリンクすると2MBくらいになるけど…
もちろんTCP/IPは含んでないけど…
532SMB:02/11/21 09:28
wattcp経由にしようかと。>>530

nt_login/off、open/write/closeだけにしようかと。>>531
ところで、libsmbclient.cのsmbc_open(てのが、Winにファイル書き込むんだよね?)を
呼んでる小さなツールがあるそうですが、そのmain関数があるソースはどれになるのでしょう?
Linuxの環境作らないといけないけど、今週は無理そう...
533SMB:02/11/21 09:34
あと、SambaのクライアントのIPアドレスはDHCPかWINSから貰うような動作も可能なんだよね?
その部分のソースはどこになるんだろう?
534SMB:02/11/21 09:45
初歩的な質問ですが、Sambaのpstring、fstringってのは何だ?
WinやDOSでは見ない型だけど何に置き換えれば良いんだ?
廉価気宇材
537SMB:02/11/21 10:11
>>535
DHCPC便利そうだね。どう組み込むかはまだ分かってないけど。
539SMB:02/11/21 10:35
ネットワークへのログインは、
namequery.cの
BOOL name_register_wins(const char *name, int name_type)
で、良いのでしょうか?詳しい方教えて頂きたいです。

詳しい人なんてそうそういないと思うがどうか。
>>539
その前にこれまでの経過をまとめろや。
542SMB:02/11/21 11:15
目標 DOSをLanに接続するだけで、Win鯖にファイルコピー。
   どうも、smbclientのDOS版のサブセットが出来れば良いみたい。

多分、そこから、smbc_open/write/close(libsmbclient.c)が呼ばれてる。
次に、cli_open(clifile.c)/write(clireadwrite.c)。
その次に、cli_stup_bcc/cli_send_smb/cli_recieve_smb→write/send、
という感じ。write/sendから、wattcpのsocketを呼ぼうかな、と。
wattcpがパケットドライバを操作してくれる。
君の行く道は果てしなく遠い
なのに何故歯を食いしばり
君は逝くのかそんなにしてまで
544SMB:02/11/21 11:33
mainというかトップの呼び出しはclient.cを見れば、よく分かるみたい。
ホスト一覧とかは、これだけ。
static int do_host_query(char *query_host)
{
cli = do_connect(query_host, "IPC$");
if (!cli)
return 1;

browse_host(True);
list_servers(workgroup);

cli_shutdown(cli);

return(0);
}
545SMB:02/11/21 11:43
ファイルのコピーのトップはこれみたい。
static void cmd_put(void)
{
pstring lname;
pstring rname;
fstring buf;
char *p=buf;

pstrcpy(rname,cur_dir);
pstrcat(rname,"\\");

if (!next_token(NULL,p,NULL,sizeof(buf))) {
DEBUG(0,("put <filename>\n"));
return;
}
pstrcpy(lname,p);

if (!next_token(NULL,p,NULL,sizeof(buf))) {
p = strrchr(lname, '/');
if (p) p++;
else p = lname;
}
pstrcat(rname, p);

dos_clean_name(rname);

do_put(rname,lname);
}
コンパイラが16bitでSモデルというオチはアリマセンカ
wattcpはマスターしました。
そもそも君は、DOSベースのファイルシステムドライバを書けるのかね?
そもそも君は、Cでデバドラを書いたことがあるのかね?

生暖かい目で見守っております。
タロットカードの 0 が目に浮かぶのは僕だけでしょうか
悪いカードではないですが。
デバドラと何の関係があるんですか?
>SambaのクライアントのIPアドレスはDHCPかWINSから貰うような動作も可能なんだよね?

だから、WINSかIPはもらえないって。
552デフォルトの名無しさん:02/11/21 13:11
Netscape7.0ってDDEのサービス名変わったんだね。
昔仕事で作ったアプリが動かんもの。
で、サービス名知ってたら教えてください。
DDE
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter5/chapter5_7.asp
廃止方向なのかな、だれかしりません?
DDEスパイで見てもNetscape6が見える、、、
555デフォルトの名無しさん:02/11/21 13:57
"Netscape6" ですか、情報どうもです。>554
でも、DdeConnectで落ちるし・・・うーむ。
所で、なにやったらDDEスパイに乗りました?
556SMB:02/11/21 14:00
>だから、WINSかIPはもらえないって。
了解。WINSからIPは貰えないのね。
IP無しで、WATTCPのSOCKET動作するかな...
557553-554:02/11/21 14:00
DDE Spyは使い方よくしらないので、モニタと追跡全部出しました。
>>556
キタ━━━( ´∀`)・ω・) ゜Д゜)・∀・) ̄ー ̄)´_ゝ`)∀ ̄)▽’)´Д`)━━━!!
TCP/IPやDNSなどの本を見て知識を得てください。
そんな状態で作ったプログラムなんて、誰も使いたくないだろうし。
560557:02/11/21 14:09
出力>画面 にチェックしてないと出ないかもしれません
561デフォルトの名無しさん:02/11/21 14:14
553 どうもです。
DDE廃止といわれても困りますよ。> MS
DDEはサービス名だけの差で全アプリ互換性のある制御ができるのに。
(本当は完全にはできないんだけどぉ)
ActiveXコンポーネントでやれってか!> MS
Netscape7のバイナリ見ると、"WW_GetWindowInfo"とか "WWW_OpenURL"
とかのお約束トピックが見つかります。
なので、サポートしてないってことはさそう。
DDEなんか既につかわねーだろ。
.netは他のOSにも進出したいから、DDEは邪魔なんでしょう。
今あるソフトはDDEちゃんと使えるとおもうけれど、これから出る
ソフトは他のに移行するのかもネ
>>559
今までのアドバイスを全然聞いてないのが丸分かりだよね
どうせ話を聞く気がないんだったら質問するだけ無駄なんだから
ここでゴミを垂れ流すのやめてほしい。他の人の邪魔。
このスレにふさわしく書くなら、DDEのかわりにTCP/IPで(以下略)
>>564
>>559に対してですか?>>556に対してですか?
567デフォルトの名無しさん:02/11/21 14:37
> DDEなんか既につかわねーだろ。
無知の怖さ。> 562
エクスプローラからドキュメント開く時とかに使ってんの知らないんだね。
>>566
何が疑問かわからないが
今までの〜が559に
それ以外の行が556に対してじゃないの?
今まで気にしてなかったけどパケットキャプチャしてみると
SMBって入ってるパケットが飛び交ってるね。
>>567
アフォか ? 今ごろそんなことを自慢げに書く奴がいるとは...。

俺の周りでも、DDE は使わない方向。
DDEってなんでつか?
あれ?DDEってネットワークプログラミングなの?
もとはNetscapeのプログラムがどうこうだから、
ネットワーク(でつかうソフトの)プログラミングと・・・いうことでは・・・
はい。苦しい解釈でした。
もうSMBは放置でいいんじゃないですか?
真面目にやる気無さそうだし。
マジレスです。
放置か否かは各個判断でしょうけれど、
成功したか否かの結果報告はSMBの義務じゃないかなあ
真面目に答えていた人も多々いるわけだし
ネットワーク対応スーマリでも作るのか?
577SMB:02/11/22 08:47
報告も何も作業中。
こういうのそのまま使って大丈夫かな。

#if (SIZEOF_INT == 4)
#define uint32 unsigned int
#elif (SIZEOF_LONG == 4)
#define uint32 unsigned long
#elif (SIZEOF_SHORT == 4)
#define uint32 unsigned short

Sambaのコードは16bitも対象か?
578SMB:02/11/22 09:13
struct in_addrの宣言が無いことない?
そんなわけないけど...
579SMB:02/11/22 10:35
このプロトタイプ宣言何だろう?

proto.h 1173: void make_nmb_name __P((struct nmb_name *n, const char *name, int type));
俺、>>528の案がよいと思うのだけど。
>>580
大丈夫。SMBの案がいいと思ってる香具師はいない。
>>577-579
お前の日記など誰も読みたくないのでよそでやれ
ネットワークプログラミングじゃなくて、C言語質問所みたいだな、、、
584SMB:02/11/22 18:28
コードサイズが64k超えてしまったのでDOSで組むのは無理みたいです。
585デフォルトの名無しさん:02/11/22 18:43
huge は?
ラージモデル(以下略

>>546で出した予想、的中したか・・・
588SMB:02/11/22 19:43
584は偽者です。
ラージモデルは知ってます、ありがとうございます。>>585-586

ミディアムで、farポインタ、nearポインタ使い分けるのは苦手だけど。
589SMB:02/11/22 19:47
TCPではコネクション確立時にシステムが自動的にアドレス付けてくれるので、
コード上に出ないことがわかりました。
ここはSMBの経過報告スレですか?
ネットワークプログラミング相談室どこにあるんでしょう?
>>589
まじかよ?
>>588
>584は偽者です。
ワラタ
>>589
ポート番号とアドレスとごっちゃになってねえ?
FORTRAN を使ってないからだよ
>>594
放置だね。かわいそうだね。
596594:02/11/23 04:06
反応してくれなくて良かったのに・・・
SMB は、やっぱりネタだったのか?
何故?
599SMB:02/11/24 13:49
DOSでWinsockをつかうにはどうしたらいいのだろう?
sambaのソースはおかしいみたいでそのままではコンパイルできないところがたくさんあります。

>>597
ネタじゃないです。
>>599
…これはどうみてもネタだろう。
DOSで、Winが提供している、socketを、使うとすれば、
Winを、入れる、他に、無いじゃないですか?
sambaのソースがおかしいなんて、失礼な事を書かないで下さい。
ちゃんとした環境でちゃんとしたコンパイラでちゃんとした動作するのに。
バグみつけたとかならまだしも!!
>>599
あんたの言ってる事は
 「MAC で Winsock をつかうにはどうしたらいいのだろう?」
と同じぐらい変ですな
矢張りVirualPCだろうか
>SMB
探してきてやったぞ。
DOS用TCP/IPプロトコルスタック。Winsockではないが。
http://www.pc88.gr.jp/~teen/

探せば結構あるもんだな。

606デフォルトの名無しさん:02/11/24 15:51
607デフォルトの名無しさん:02/11/24 19:31
X11Windowにおける、ネットワークゲームなのですが。
TCP/IP通信を非同期で行うルーチンのループと、Xeventを取得するループがどうも上手くいきません。
2つをいい感じにかみ合わせるにはどうしたらいいのでしょうか?
Javaで書く。
609607:02/11/24 19:33
>>608
学校の課題なんでそういうわけにもいきません…(;´Д`)
スレッドを2つ作る。
TCP/IPのselectと
Xeventの取得を、
1回ずつ交互に行うようにすれば?
612607:02/11/24 19:36
>>611
適当なflgを立てて、0ならXevent、1なら送信or受信待ち、という形でしょうか?
やってみます。
TCP/IPの通信はちゃんと非同期にやってるのか?
(selectが即座に帰ってくるようにしているか?)
>>610
すみません…マルチスレッドプログラミングはよくわからないのです(。´Д⊂)゚
615607:02/11/24 19:40
>>613
while(1) {
 FD_ZERO(&mask);
 FD_SET(nsofd, &mask);
 FD_SET(0, &mask);
 retval = select(nsofd+1, &mask, NULL, NULL, &tm);
 if(retval < 0) Err("select");
 if(FD_ISSET(0, &mask)) {
 /* 処理 */
 }
 if(FD_ISSET(nsofd, &mask)) {
 /* 処理 */
 }
}

みたいな感じですが…これじゃ駄目でしょうか。
>>615
だいたいよいけど…まずtmは毎回初期化したほうがよい。
で、そのループの中に(whileの本体の一番最後とかに)
XPeekEventとか入れれば良いんじゃないの?
617607:02/11/24 19:55
>>616
わかりました。どうもありがとうございます。
XPeekEventの使い方から調べてきます。
Xってselectに入れるためのfdを取り出せなかったっけ?
619618:02/11/24 22:04
ちょっと調べてみたが
ConnectionNumber(Display*)
がそうらしい。(「接続数を返す」は誤りだそうだ)

これの戻り値のfdをselectの仲間に加えてやって、
if (FD_ISSET(x11_display_fd)) {
 XPeekEvent();
}
とかやればいいんじゃないかな。

>>610 安直にスレッド立てるな馬鹿野郎(5,7,5)
>>619
季語がはいっとらん!
安直に駄スレ立てるな冬厨め!
 でどう?
駄スレ立て春夏秋冬逝ってよし
無駄スレは、のがいいか
>>599
そんなレスを書いててもネタじゃないというのなら,
まじめに1から勉強し直した方がいいと思われる。
質問させていただきます。
winsock, ブロッキングモードでプログラムを組んでいます。

いわゆるサーバープログラムを組んでいるのですが、send命令というのは
ブロッキングモードでも即座に制御が返ってくるものなのでしょうか。
それともsend専門のスレッドを作り、メインではメモリーに送りたいものを保存。
sendスレッドが順次送りだすとすべきなのでしょうか

昔1回のsendで大量のデータを送ろうとしたらしばらく止まったことがあります。
これは単純に、送信バッファより多くのデータを送ろうとしたから、仕方なく止まったのでしょうか?
それともSOCKET_ERRORを返すからには通信しおわるまで待ってるのでしょうか

何回も見た気がするが。

・送信バッファに空きがあるとき
ブロックしない。一度に全部送れるとは限らない。
・送信バッファに空きがないとき
必ずブロックする。戻るのは、空きができてからか、エラーになったとき。
ブロッキングモードのsendの動作は
"送信バッファに1byte以上の空きができるまで待つ"+"送信バッファにデータを置く"
だね。ノンブロッキングなら待たない。

メインメモリに一旦バッファするという方法は、
ソケット自身も送信バッファを持ってるんだから、一見無駄に思える。
でもソケットのバッファサイズを変更できないシステムもあるだろうし、
仕方ないのかもしれない。あ、winsockか。
丁寧なアドバイスありがとうございます。
過去スレめくって検索かけたら、関係のないのまで沢山ひっかかって(;´Д⊂)すいません

バッファの空き == 0
バッファが1Byte以上空くまで待つ

バッファの空き < 送りたいデータ量
空きの分だけ中途半端にデータを送信バッファに保存

バッファの空き > 送りたいデータ
送りたいデータを送信バッファに保存(memcpyと同等の速度?)

つまり送信バッファに十分な空きがあるのなら、ちゃんとさらりとsendが終了する
という解釈でよろしいでしょうか。
逆に言えば、中途半端な量送られるなら送信バッファがパンパンだと。
バッファの大きさ変えられるようですね。デフォルト値は64KBくらいはあるかなぁ…
629607:02/11/25 02:59
>>619
滅茶苦茶亀レスですが、どうもありがとうございます。
結局今まで悩んでますた…
本気でプログラマー向いてないな(。´Д⊂)゚
>>628
setsockopt()で変えられる奴はデフォルト8KBくらいだと思ったけど。
MAXもWin32だと64KBくらいじゃなかったっけ?
とりあえずgetsockopt()して調べてみ。
人はプログラマーに生まれるのではない。プログラマーになるのだ。
632619:02/11/25 08:40
>>629
いや、あれは仕方ない。かなりX11に依存した話だし、
もしかしたらスレッド立てたほうが結果的に楽かもしれない。

selectの使い方としてはわりかし知られたパターンなので
覚えておくと後々役に立つとは思う。
633607:02/11/25 10:31
>>631-632
わかりました。これからも精進します。
あちがとうございます。
LANケーブルを引っこ抜くと、クローズしたというメッセージが送られてきません
その時sendをブロッキングモードで使用していると、どんどん送信バッファにデータがたまって
そのうち「空きがないから空くまで待とう」となってsendの部分で止まってしまうのでしょうか
634さんの環境でプログラムを作ってみて、どんな動作をするのか試してみては。
止まるよ/止まらないよ、と答えるのはできるのかもしれませんが、
ちがったじゃん、と言われても責任もてませんし・・・
636634:02/11/25 20:28
それもそうですね。PC一台しかないので友達に手伝ってもらうっす
>>636
チェックだけなら複数のPCである必要はないと思うんですけど?
あ、LANケーブルか・・・失礼。637は取り消し(汗)
639607:02/11/25 21:54
本当にたびたびスミマセン。
スレ違い覚悟でこれだけ聞かせてください…
if (FD_ISSET(ConnectionNumber(d), &mask)) {
XNextEvent(d, &event) ;
switch(event.type) {
       /* 処理 */

Xイベント取得はselectにこうやってif文書いてあげればいいんでしょうか…
今日一日いろいろ書いてみましたが、Xwindowが立ち上がってくれません…
>>639
「X11のイベントキューには入ってるけどsocketのバッファは空」
という状態もあるので不完全。

if (XEventsQueued(d,QueuedAfterReading) || FD_ISSET(ConnectionNumber(d),&mask))

にすればいけるかな。
641607:02/11/26 01:10
>>640
できました…ありがとうございました(何回目だよ
書き込みすぎ…俺…(;´Д`)
そう言えばXプログラミングスレってないみたいだね。
まー誰も今更XLibからやるやつはいないだろうし。
宿題スレに投げても誰も答え無さそうだし。
次に質問があるならC言語スレぐらいが適当か?よく分からんけど。
643デフォルトの名無しさん:02/11/26 18:53
yahooオークションの商品の終了時間をjava
で取得したいのですが、どなたがご存知な方がいらしたら教えてください。
よろしくお願いします。
>>355
知らない。
>>643
クライアントソケット作成してyahooの該当サーバに接続して、
yahooオークションの該当URLをHTTPリクエストして、
戻ってきたHTMLを解析する。簡単。
これ以上は自分で調べろよ。
>>645
直接みたほうが簡単そうだね
ブロッキングモードのsendは、タイムアウトしないのでしょうか
永久ブロッキングは困るのですが
select中に、そのソケットが別スレッドでclosesocketされた場合はどうなるのでしょう
というかそんなことして良いのでしょうか?
>>647
じゃあノンブロックにすりゃあいいじゃん。

>>648
select()が-1(SOCKET_ERROR)で返るはず。普通やらないが、
強制終了みたいな場合やらざるを得ない場合もあるかもね。
Winsock 1.1では待機中のソケットをクローズした場合
何が起こるか分からないことになってる
>650
1.1にはselect無かったような気がするけど
652デフォルトの名無しさん:02/11/27 10:54
>>643

int n;
URL url = new URL("対象オークションのページのURL");
byte buffer[] = new byte[16384];

DataInputStream htmlStream = new DataInputStream(url.openStream());
while( (n = htmlStream.read(buffer) ) > 0 )
{
bufferを調べて終了時刻をピックアップする処理
終了時刻をSystem.out.println()で表示
}
>>651
あったよ
適当なことほざくな
なかったのはWSAEventSelect
>>650
(古い)Winsockってこういう非健全性が多いね。
ノンブロッキングのタイムアウト時にsocketのデータが失われるかも知れない、
ってのもあったな…
やっぱりLANケーブル抜けたりと終了メッセージがこない時の切断がネックですね

selectで書き込みフラグ見ている場合って、
sendバッファが満杯でない限り「書き込みOK」が帰ってきてしまうのでしょうか。
「お前最近データ送れてないんだから、書き込みOKは出すなよ」
という設定はできるのでしょうか

LANケーブルが抜けているのだから、sendバッファのデータは向こうにまったく送れていない。
当然ACKも受け取れてないわけなので、winsockの内部的には相手が応答してないのがわかるはず
そのうちsendバッファがいっぱいになるから
問題ないんでないの?
送信の量が安定しないと困るよなそれ
例えばMMORPGの鯖とか。人が回りで動いてればすぐ一杯になるだろうけど、
ぽつんと荒野にひとりじゃ送信するデータが少ない

やっぱりノンブロックsendで送って、
recvで生存メッセージ(一定間隔でクライアントが送信してくる)が来なくなるか、
sendで失敗した場合に落ちるべきでは?
ping打てばいいんでない?
send のたびに、そんなに重い事をせにゃならんのか・・・。
ぶっちゃけ非同期のsendってどんな時にWSAEWOULDBLOCK返すんでしょう。
バッファに空きがある間は返さない(送信バッファにデータをコピーするだけだから)なのでしょうか

バッファに空きが無い
空くまで待とう(ブロッキング発動!)
その時に追加send命令が! って時だけでしょうかね、WSAEWOULDBLOCKがでるのは
> ぶっちゃけ非同期のsendってどんな時にWSAEWOULDBLOCK返すんでしょう。


256KBのデータを送ろうと、全部sendしようとする。
→ sendはエラーを返さないが、8KBしか送れない。
→ 次に続きの248KBをsendしようとする。
→ WSAEWOULDBLOCKが返る。
→ (しばらくしてからFD_SENDが来る)
Windowsで名前解決を非同期に実行しようとしたらウィンドウを
作るしかないんですか?
送受信はWSAEventSelectでできるのに。
マルチスレッドにしたら?
gethostbynameとかのソース見て、自作すれば?
>>663
すっかり頭から抜け落ちてますた
>>664
WindowsだとNetBIOS名の解決とかいろいろ面倒そうなので
できれば遠慮したいです
それよりSMB氏はどうなったんだろう
>>666
現在DOS用のTCP/IPスタックから自作してます
DOS用のWinsock(正しくはDossock)を自作してます
669SMB:02/11/28 09:41
config.h.inをconfig.hに変えてdefineするとコンパイルは通りますね、
ソースいじらなくても。includes.hはいじったけど。

<arpa/inet.h>とか<netinet/in.h>の実態はgccにも無いようだし、
ネットでstructやtypedef宣言手に入れましたが、
本物が欲しいので、どこから手に入るのか教えて欲しいです。
670bloom:02/11/28 09:43
だ か ら 日 記 は よ そ 逝 っ て や れ
>>669
TCP/IPスタックを作る人が作成するものです。
673SMB:02/11/28 14:58
もうレスをすることに疲れました。
これ以上自分がレスをつける意味というか目的がわかりません。
正直言ってROMしてたほうが楽です。でもいつでも出来ることなので
今は一生懸命レスしようと考えていました。今日までは。
しかし誰からもろくなレスをつけられず、自分が誰にも
必要とされてないことが、わかったとたん前向きに考えることが
出来なくなりました。
もう自分という醜くてどこにいるのかわからないような存在を
2chから消すことだけが最後のレスをつける目的かもしれません。
そしてこの「書き込む」ボタンをクリックすることによりその目的が
遂行されるわけです。
さようなら。これからはROMに徹します。
ナナメ読みか…
675SMB:02/11/28 17:49
当然ですが、673はニセです。
”WinSock使う”とか、キティなことを炒ってるのは無視してやって下さい。
なんか気持ち悪い粘着ですね。
トリップも付けないで、偽物がどーとか云う人の言葉は
まったく信じてませんから。
677SMB ◆SDXB/5gbcI :02/11/28 18:42
トリップツカテミマスタ
678SMB ◆a7SMBwKXrU :02/11/28 18:50
当然ですが、677はニセです。
”トリップツカテミマスタ”とか、キティなことを炒ってるのは無視してやって下さい。
なんか気持ち悪い粘着ですね。
679SMB ◆SDXB/5gbcI :02/11/28 20:57
やられた。678は超粘着ニセです。
トリップ使うのが恥ずかしくて、2ちゃん語使ったら足もとスクワレタ感じ...
680SMB:02/11/28 21:02
私が本物です。私はsageでは書きません
sageて書け。
682SMB:02/11/28 21:19
こいつら全部偽物。
キティばっか。
ちなみに漏れも偽物。
>>669
>config.h.inをconfig.hに変えてdefineするとコンパイルは通りますね、

はああああああああああああ!?
>>683
ほっときなよ。autoconfも知らない白痴なんだから…
彼が、せめてネットワークプログラミングなレベルの話を持って来てくれればネェ
>>684
15年前、patchを知らずにdiffの結果を手で適用していた
自分を思い出す。
ところで藻前ら、SMBなんかは死ぬほどどうでもいいが
DOS用のautoconfってあるのですか。
cygwinならあるんじゃない?
どのみちunix likeな環境を作っておかないとconfigureが実行できない罠。
cygwinもDOS用のportはなかったと思うが。djgppとか使うのかね。
> どのみちunix likeな環境を作っておかないとconfigureが実行できない罠。
御意
690デフォルトの名無しさん:02/11/29 01:34
>>687
ところで藻れも、SMBなんかは死ぬほどどうでもいいが

http://www.simtel.com/pub/msdos/pktdrvr/

くらいは、この際出しておこうか。
simtel.comには大昔お世話になりました。archieな頃の話。
>>689
Cygwinも結局はWin32コンソールアプリだからねぇ。

djgppもMingWみたいなもんで、同梱されてるのはせいぜいgcc、gas
ld、makeくらいじゃなかったかな。
DOS用B-shell互換シェルはあったけど、configureなんて実行しようと
思うとB-shellもエクステンダで動かさないと厳しそうだ。


関係ないが、djgpp作ってたDJ氏ってCygnus(今はRedHat)に居たん
だね。CygwinのChangelogに名前出てて(´・∀・`)へーと思った。
692SMB ◆SDXB/5gbcI :02/11/29 08:38
configu.h.inは、autoconfで編集するべきなのか。
はつみみですた。
693SMB ◆a7SMBwKXrU :02/11/29 09:11
692は偽者です、無視して下さい。

>>690
ありがとうございます、参考にさせて頂きます。

ネットワークプログラミング以前の知識が不足していたようで
そのことで皆様に御迷惑をお掛けしていました。すみません。
今後は、プログラムの原型が出来てから質問します。
694SMB ◆SDXB/5gbcI :02/11/29 09:14
いい加減にしろ693。

表面の本物らしさと、貶める内容で、まさに偽の内容。
てゆうか、これから名前もトリップもやめまして、単発質問します。
似てないよ・・・
>>692
すくなくともconfig.h.inをconfig.hにリネームして
手で編集するためのものではないだろう。
udp_open(&namein, NSPORT, 0L, 0, 0);
udp_open(&log, 0, logip, LOGPORT, 0) == 0)

NSPORTとかLOGPORTってのは何か教えて下さい。
698697:02/11/29 15:52
#defineNSPORT137
#defineSMBPORT139/* TCP */
#defineLOGPORT514/* UDP */

一部分かりました。ポート137はSMB名前解決、139はストリームデータ転送。
で、514は分かりません。
700697:02/11/29 16:09
syslogですか。調べてみました。
http://www.hero-island.ne.jp/hacker/syslog.html

自分で自分にログ書けよってのが、
udp_open(&log, 0, logip, LOGPORT, 0) == 0)
ですかね?
701697:02/11/29 16:30
syslogのコードの全体はこんな感じです。

if (loghost == 0 || (logip = resolve(loghost)) == (longword)0 || udp_open(&log, 0, logip, LOGPORT, 0) == 0)
{
loghost = 0;
return;
}
(void)sprintf(logbuf, LOG_TAG PROGRAM " " VERSION %d \n", nv);
(void)sock_fastwrite(&log, logbuf, strlen(logbuf));
まったく彼はひどいSMBですね
SMBさんはスレの流れがわからないのでしょうか
無知だからといって無責任な発言が多すぎますよ!!
スレ住人の人権はどうでも良いというのでしょうか?
ニュースステーションの筑紫さんが、SMBのことを、
便所のトイレって言っているのを知ってます?SMBは
どうせニュースも見ないから知らないと存じますが。
とうとう、本気で呆れています。おばあちゃんが、どれどれ?と
画面を覗きにきました。それから、おとうさんも来ました。
その6分後、妹も来ました。SMBは、我が家に笑われています。
とてもいい具合です。家族みんなが、この人おかしいね
おかしいねって、互いに罵り合っています。おかあさんは、
もう3年家に帰ってきてませんが、必ずおかあさんもおかしいね、
って云うと思いますよ。どうです?私に謝るなら、今のうちですよ。
私はこれでも気が遠いほうなんです。また3日後、ここに来ます。
お前ら! 協力してください。
http://pc.2ch.net/test/read.cgi/unix/1038175909/l50
704デフォルトの名無しさん:02/12/02 08:26

C++でソケットプログラミングをしています。
クライアントをWindowsサーバをLINUXで
動作させたく、サーバの方はバークリーソケットを使って
書いているのですが、
通信を終了させる手順がわかりません。
ウインドウズ側だとCSocketを使用して

cs->ShutDown(CAsyncSocket::sends);
//保留中のデータを受け取る
int nRet;
char szBuf[256];
while (1){
nRet = cs->Receive(szBuf,sizeof(szBuf));
if (nRet == 0 || nRet == SOCKET_ERROR)
break;
}
cs->ShutDown(CAsyncSocket::both);
cs->Close();
以上のようにしています。
サーバ側ではどのようにすべきでしょうか?
shutdown();
close();
perlで簡単なHTTPクライアントを作ったんですが、
リクエストヘッダを送った後に、
while(<SOCKET>) {
 $http_res .= $_;
}
として受信してるのですが、
リクエストヘッダ部をhttp/1.0とすると、ボディを受け取り終わった直後にwhile文を抜けますが、
http/1.1とすると多くのサーバーでボディを受け取った後でもタイムアウトになるまでwhile文を抜けてくれません。
1.1でスムーズにするにはどうしたらいいでしょう?
・Content-Lengthかchunkを見て終わりを判定
・Connection: closeを送る

下だとHTTP/1.1のメリット半減だけどな。
perlでどうやるかは知らん。
708名無しさん@Emacs:02/12/02 11:28
まったくこれはひどいRFCですね
RFCさんはスレの流れがわからないのでしょうか
無知だからといって無責任な発言が多すぎますよ!!
スレ住人の人権はどうでも良いというのでしょうか?
ニュースステーションの筑紫さんが、RFCのことを、
良いリファレンスって言っているのを知ってます?RFCは
どうせ RFC も見ないから知らないと存じますが。
とうとう、本気で呆れています。おばあちゃんが、どれどれ?と
RFCを覗きにきました。それから、おとうさんも来ました。
その6分後、妹も来ました。RFCは、我が家に重宝されています。
とてもいい具合です。家族みんなが、この RFC いいね
いいねって、互いに罵り合っています。おかあさんは、
もう3年家に帰ってきてませんが、必ずおかあさんもいいね、
って云うと思いますよ。どうです?私に謝るなら、今のうちですよ。
私はこれでも気が遠いほうなんです。また3日後、RFC 書きます。
>>708
>また3日後、RFC 書きます。

【2ちゃん発】RFC作成計画
http://pc.2ch.net/test/read.cgi/unix/1038175909/

ここ行って書いて来い。
>>707
> 下だとHTTP/1.1のメリット半減だけどな。
つーかこの場合HTTP/1.0使うのが正解だな。
どうせTransfer-Encoding: chunkedな応答返されたら
困り果てる設計になってるのを棚に上げて「バイナリに数字が混じって
壊れるんですけどバグですか?」とか言い出すこと目に見えてるから
chunkedのアレって嫌がらせに近いと思った。
なぜ他のと全く違うエンコードにするかな。
chunkにしとけば、あらゆる場面でKee-Aliveできるだろ。
それとも他ににに方法があるとでも言うのか
他ににに・・・
いや、値のエンコードの方法の話・・・
715デフォルトの名無しさん:02/12/03 09:15
Socketって、writeとsendがありますが、どう違うのでしょう?
ごめんなさい。わかりました。

http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.18
read() は recv() の flags パラメータ に 0 を与えたものと同一です。
flags パラメータに他の値を与えると recv() の振る舞いが変わります。
同様に、write() は flags == 0 のときの send() と同一です。
flagsは通常0ですか?
どういう場合に値をセットするのでしょうか。
>>716
基本的にはそう思って問題ないんだけど、実は recv() の flag == 0
と read() では微妙に動作が違うような実装もあったりする。
その辺はターゲット OS のカーネルのソース読むのが早い。

>>717
通常は 0 でいい。
他に MSG_OOB とか MSG_PEEK とかのフラグが使える。
MSG_OOB は緊急データ(Out Of Band データ)を受信するためのもの。
MSG_PEEK はその名の通り、到着しているデータを引き取らずに覗き見るもの。
けど、いまんとこ >>717 は気にしなくて良い。
719717:02/12/03 12:45
有難うございます。詳しいですね。>>718
>>711
「他」ってのはなんのことを指してる?
selectシステムコールにタイムアウトを設けたら0しか返さなくなりました。
タイムアウトを設けなかった(NULLに設定)場合にはブロックされるかわりにちゃんと受信しています。
一体何を疑うべきでしょうか?
722721:02/12/03 23:58
追記。
…あれ?最後の引数にNULLや0を与えるとブロックなのに、
メンバを0,0にしたtimevalだとブロックしないでタイムアウトするぞ…なんでやん。
>>720
ヘッダ。ヘッダはname : value<CR><LF>なのに・・・
>>722
0秒でタイムアウトするでしょ
725721:02/12/04 02:14
>>724
むしろ、0にするといつまでもブロックするはずなのです。

…違ったっけ?
落ち着いてman嫁
>>725
null pointerを渡すと無限に待つ
それ以外だとpointerの示す秒数だけ待つ。
pointerの示す秒数が0ならば当然すぐに帰ってくる。
728721:02/12/04 03:37
…ちゃんと読んでいなかったようで、阿呆丸出しでしたな(汗

問題は待ち時間の長さかなぁ?いくつか試したけど…。
select()しながら標準入力待つとかしたいときは、
fork()でも併用するのがスジなのでしょうかねぇ?
タイムアウトを数秒単位でやってたら標準入力のほうが使いにくすぎる…。
>>728
>select()しながら標準入力待つとかしたいときは、
とは?
while(){
  FD_SET(STDIN)
  FD_SET(ソケット)
  select(fds)
  if (FD_ISSET(STDIN)) {
    ほにゃらら
  }
  if (FD_ISSET(ソケット)) {
    ほにゃらら2
  }
}
じゃいかんのかえ?
730デフォルトの名無しさん:02/12/04 09:53
>>728
> fork()でも併用するのがスジなのでしょうかねぇ?

select系で頑張るの止めるとすれば、pthreadだろ。(まともなOSならば)
selectがbottle neckになりそうな局面では、
poll, /dev/poll, kqueueも検討してね。
selectは何のために呼ぶんだっけか。
>>720
それじゃ余りに冗長だからだろう。
サイズをバイナリにしなかったのはバイトオーダーの問題とか
32ビットにして後で困るとかを避けるためだな
だいたい一行目はname : valueじゃないし
ブロードキャストアドレスって、255.255.255.255だと
思い込んでたけど違うんだね。何で勘違いしてたんだろ...
ブロードキャストアドレスを求めるC/C++のサンプルコード教えて下さい。
734デフォルトの名無しさん:02/12/05 10:19
ソケットプログラミングでブロードキャストアドレスを求める例が無いってことは、
TCPやUDPの相手先のIPアドレスに0(文字列タイプじゃなくて、typedef struct in_addr)を
指定するとブロードキャストになるということかな?
735デフォルトの名無しさん:02/12/05 11:12
in_addr.s_addrと255のビットのアンドをとれば、ブロードキャストアドレス?
ま た S M B か
736=粘着
端末から、自分宛に送信するパケットを受け取るにはどうしたらよいのでしょうか?
たとえば、端末A、Bがあり、AからBへのtelnetのsyn packet をファイルに取り込む。
次に、端末Bで、そのファイルを読み込んで、宛先マックアドレスを、端末B、
送信元マックを端末A にして送信すると、
端末Bで実行したtcpdumpでは、たしかにSYNパケットが送信されたログがあります。
しかし、端末AへのACKが検出できないのです。
これはどういった理由なのでしょうか?

739738:02/12/05 13:11
追加ですが、TCPのチェックサムはOKとtcpdumpで表示されていました。
IPのチェックサムは確認していませんが、どこも変更していないので
問題ないと思います。。
740八王子市立みなみ野中:02/12/05 13:18
2ちゃんねる にいる奴はみんな糞やろうだ!!!
ハッキングなんてこわくねーんだよ!!
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死死死死死ね死ね死ね死ねね死ね死ね死ね死死ね死ね死ね死ねね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ねね死ね死ね死ねね死ね死ね死ね死ね死ね死ね死ね死死ね死ね死ね死ね死ね死ね死ね死ねね死ね死ね死ねね死ね
741:02/12/05 14:51
死ねしか言えないのか?
糞やろうって言うくらいなら、はじめから入ってくるなボケ!!
VC6で
#include<windows.h>
#include<winsock.h>
int main( int argc, char *argv[] )
{
 int sd;
 sd = socket( AF_INET, SOCK_STREAM, 0 );
 return 0;
}
をメイクすると
test.obj : error LNK2001: 外部シンボル "_socket@12" は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
となります。なにかプロジェクトの設定をしないといけないと思うんですが、なにをしていいのか分かりません。
ご教授ください。
743742:02/12/05 15:50
下げてしまいますた
744742:02/12/05 15:55
ws2_32.libとwinmm.libというのをリンクしたら上手くいきました。なぜかは分かりません。
だから日記ならここに書くのはやめてくれって
745=被害妄想で全レスが日記に見える粘着
残念ですが、ハズレですた。
UDPで通信できるデバイスに制御パケットを投げるJavaプログラムを書いているんですが、
そいつは制御命令を送ると、応答として現在のステータスが返ってきます。

socket.send( send_packet );
socket.receive( recv_packet );

で、(エラーや例外を考えないと)こう書くわけなんですが、ふと疑問が出ました。
1) receiveするときは待機状態に入り、何も来ないとそこから先に進まないのか?
2) receiveが実行される前に応答が到着したらどうなってしまうのか?バッファに溜まるのか?
3) バッファがあれば(゚д゚)ウマーだけど、もし溢れたら何がreceiveされるのか?

・・・(´・ω・`)
1.ソフトの設計次第。 UDPだと、ふつーは2秒とか待ち時間を決めて、
帰ってこなければリトライしたり、諦めたりする。まあ、相手次第。

2.基本的にはたまる。貯まりすぎるとだいたい取りこぼす。

3.あふれて消えたり、取りこぼしたデータは、それっきり。
connectしてたら、場合によってはICMPがどっかから飛んでくる
可能性もないわけではないけど。
>>746=俺がSMBのことを叩いてるという妄想に捕らわれてる粘着
単に一般論として情報価値のないレスを延々と連ねて
スレを汚すなと言ってるんだが
あ、>>742-745が非常に役に立つくらいレベルが低いってだけか
>>748
ありがとうです。
基本的にデータ飛ばしを実現するだけ、あとは自分でコード書いてねってことですね。

(´ー`).oO(TCP/IPのバッファってそんなに大きくないのかな・・・もしかしてOSごとに違うとか・・・。)
751742-745:02/12/05 20:59
>749
レベル低くてごめんなさい。
よかったら、なんでそれらのライブラリをリンクしないとダメだったのか、
なんでそれらのライブラリはデフォルトでリンクされてなかったのか、
どこを見ればそれらのライブラリをリンクするべきだというのが分かったのか、
教えていただけませんか?
752≠749:02/12/05 21:06
1.どのDLLにあるかを明示したり、インポートテーブルを調査したりするために。

2.アプリの全部が全部Socketを必要としているわけではない。
必要になった時に、必要なライブラリをリンクするのが筋。
それを認めないなら、全てのライブラリをリンクしないといけない。

3.MSDN。具体的には、MSDNのsocketの項には
>Library: Use Ws2_32.lib.
とある。
753742-745:02/12/05 22:02
>>752
ありがとうございます。MSDNの項には気づきませんでした。
>>738
いまいち状況がよくわからないが、自分宛のパケットが
ループバックインタフェースの方にルーティングされてるってことはない?
>>733-734
ブロードキャストアドレスは、255.255.255.255 でも良い場合があるみたいだが…
(DHCPとかが使う)。
で、サブネットブロードキャストアドレスは Interface の情報を取得する
必要がある。ioctl の SIOCGIFCONF あたり。
Unix なら Stevens に書いてある。Winsock なら、こんなのがあった。
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/getifaces.html

ブロードキャストアドレスってそのネットワークが使えるアドレスの終端アドレスじゃなかったの?
192.168.0.0/255.255.255.0
だったら
ネットワークアドレス:192.168.0.0
ブロードキャストアドレス:192.168.0.255
だし,
192.168.0.0/255.255.0.0
だったら
ネットワークアドレス:192.168.0.0
ブロードキャストアドレス:192.168.255.255
でしょ?
>>756
おいおい、自分のネットワークアドレスやネットマスクを知らないときには
どうするんだ? ブート時のDHCPクライアントとか。
>>757
上記では、
192.168.0.0/255.255.255.0
192.168.0.0/255.255.0.0
と、自分のネットワークアドレスが決まっているので、
ブロードキャストアドレスは、あのようになる。
>>757
クラスの規則に従ってるんなら平気じゃない?
>>757 limited broadcast でググってみれ
rfc1122 より
Limited Broadcast: {-1, -1}
Directed Broadcast: {<Network-number>,-1}
Subnet Directed Broadcast: {<Network-number>,<Subnet-number>,-1}
All-Subnets Directed Broadcast: {<Network-number>,-1,-1}

ちなみに
{network, subnet, host}
762デフォルトの名無しさん:02/12/06 16:12
Limited Broadcast/Directed Broadcast/Subnet Directed Broadcast/
All-Subnets Directed Broadcast

この説明が欲しいよー。
rfc1122
764デフォルトの名無しさん:02/12/06 16:25
教えて下さい。UDPにDestination Addressってのがありますが、
主に何に使われるのでしょうか。UDPの場合、使われ方はユーザ次第かもしれませんが。
あるサービスでは、XXX.XXX.255.255というのが入ってましたが、
ブロードキャストで応答せよ、という命令でしょうか。
765764:02/12/06 16:30
Destination Addressは日本語では、送信先なんですね。
翻訳サイトしたら終点アドレスになって混乱させられちゃった。
送信先という用語からいくと、受けたマシンが自分宛かチェックするということですか?
MACアドレスじゃなかったのか
767デフォルトの名無しさん:02/12/06 17:08
>>761
ありがとう。出来れば、ソースコードで教えれ。
768デフォルトの名無しさん:02/12/06 18:07
http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/broadcast-address.html

これらのうち、ブロードキャストアドレスとしては Limited Broadcast を用いるべき (SHOULD) と書かれています。
Limited Broadcast: {-1, -1}

とあるから、何も考えずに、{-1, -1}とすれば良いんだろうか。
サブネットが255.255.255.0だと変な動作になるのかな?
769デフォルトの名無しさん:02/12/06 20:38
送信バッファに溜まった電文を強制的にフラッシュしたいんですが、
fflushみたいな関数ってないですか?
なければどうやれば実現できるでしょうか?
よろしくお願いします。
>>769
どの言語の話ですか?
771769:02/12/06 20:47
ああ、すみません。基本的なことでしたね。
言語はPOSIXのCで環境はLinuxです。
>>771
送信バッファの低位水準を1バイトにすればいいんでないの?
で、TCPなのかUDPなのか他の変態プロトコルなのか。

TCPならとりあえずTCP_NODELAY、と云ってみる。
>>773
それだと、nagleアルゴリズムを禁止するだけじゃないの?
たしかに、改善されるだろうけど、フラッシュまではいかないのかな?
でも結局、相手が受け取ってくれなかったら、
どうあがいたってバッファには残るでしょうに。
776769 :02/12/06 21:44
buf_size = 1;
setsockopt( sd, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size) );
でもあまり改善されなかったので
buf_size = 1;
setsockopt( sd, IPPROTO_TCP, TCP_NODELAY, (char*)&buf_size, sizeof(buf_size) );
とやったら劇的に良くなりました。
>>774さんが言ってるnagleアルゴリズムってヤシですね。なんでこんな仕様なんだ、クソTCP。
>>776
SO_SNDBUF だと送信バッファサイズだね。低位水準じゃない。
>>775
残るか残らないかではなくて、書き出すか、書き出さないかではないの?
>>776
信号が赤から青に変わった瞬間、全員がアクセル全開で突っ走る
世の中が良いのか?
>>779
僕はMTなのでアクセル全開にしてもスピードは調節できまふ。
781 ◆Db/E231N/A :02/12/06 22:17
>>764
UDPのdestaddrって、それはIPヘッダの方に入ってるヤツのことではなく?
destaddrがなければ、データグラムをどこに送り出すかわかんねーべ?
ネットワークプログラミングしてるってくらいだから、最低限ネスペくらいもっておけよな。
783デフォルトの名無しさん:02/12/07 01:06
>>782
ネスペって何?
ネスケの間違いだろ。
>>784
ネスレだろ?
ネナベ
>>776
Nagleのアルゴリズムがなかったら…

データをなるべくまとめて送り出す替わりに、手元に
少しでも集まったぶんからぽつぽつと送り出すことに
なるんだよ。スループットががた落ちになる。
場合もある、だろ。
あれは一種のお節介。
>>788
場合もある、だろ。
InterQとSocket通信をしようとしてもレスポンスが返って来ません。
多分このような経験をしたことのある方も多いと思います。
これは何が原因なのでしょうか?
>>788
アフォか。
792デフォルトの名無しさん:02/12/07 18:42
ネットワークプログラミングしてるってくらいだから、最低限ネスペくらいもっておけよな。
場合もある、だる。
不覚にも笑ってしまた。
>>792
オンラインじゃ駄目か ?
Nagleのアルゴリズムが困る場合の方がInternetでは特殊だろう。
だからTCP_NODELAYがデフォルトでなくオプションになっている。
>>796
んなこたぁない。

HTTP、SMTP、IIOP、RPC、他多数でTCP_NODELAYが邪魔。
当然ながら実装がヘタレだったら別だよ。

つーか、リクエスト/レスポンス型のプロトコルで
TCP_NODELAYが役に立つのってあるんか?
>>797
んなこたぁない。
レーテンシーしか気にしないならともかく、
スループットが重要ならHTTPでもSMTPでも
Nagleアルゴリズムは役立つ。

まあ藻前は1パケット一行ずつ送ってろ。
Nagleのアルゴリズムがそんなに邪魔なら、
なぜどのTCP/IP実装でも(IPv6でさえ)
デフォルトでNagleのアルゴリズムがenableされてるんだ?

LAN環境で、クライアントが1つの時のレスポンス時間くらいしか
考えたことのない厨房はこれだから困る…
>>797
TCP_NODELAYをわかってなので文が変になってる。
>>798-799
よく見ろ。>>797は「TCP_NODELAYが邪魔」と書いている。
つまり、Nagleマンセーということだ。
>>799
むしろWAN環境のほうがTCP_NODELAYを設定することが多いね。
>>802
また知ったかが…
問題はLANかWANかじゃないだろ。
>>801
要は、>>797 の最初の一文が誤解の元だ。
>>803
関係アルよ。
LAN環境だと、小さなパケットに対するACKがはやいので、
Nagleのアルゴリズムが働かないことが多い。
WANではレスポンスが遅いので、Nagleが働く。

NAGLEわかってるの?
806デフォルトの名無しさん:02/12/07 20:57
NAGLEわかってるの?
nagleのアルゴリズムなんて初級シスアド持ってたらみんな知ってるだろ?
>>805
無関係とはいっていない。
TCP_NODELAYを使うかどうかの基準は「レスポンス」か「スループット」か
であって、LANかWANかじゃないという意味。

LANでもWANでも、TCP_NODELAYを設定したほうが良いときも悪いときもある。
>>805

>LAN環境だと、小さなパケットに対するACKがはやいので、
>Nagleのアルゴリズムが働かないことが多い。

ヲイヲイ。Nagleのアルゴリズムが働くかどうかは「送り手側が」決める。
ACKが速いかどうかは関係ないだろう。

それとも「有効かどうか」という意味?
>>808
どうも勘違いされているようですが、
TCP_NODELAYを使うかどうかの基準は、通信の内容じゃないの?
レスポンスが上がったとか、スループットが向上したとか言う話は、
Nagleのアルゴリズムを適用したとか、向こうにしたとかの後の話であって、
レスポンスを上げるために、もしくはスループットを上げるために設定するものではない
ということ。

>>809
nagleのアルゴリズムはACKが返ってない未承認の小さなパケットを
減らすことを目的としています。
>>810
いずれにせよ「LAN」「WAN」とは無関係だろ。

John NagleのRFC 896は読んだのか?
throughputを改善するためと書いてあるだろ?
>>812
でも、あんたも、なんでもかんでもnagle使えばいいわけじゃないっていってるジャン?
スループットが改善するかどうかと言うのはクライアントサーバ間の電文の種類
などの通信の内容によって変わってくる。
814デフォルトの名無しさん:02/12/07 21:34
>>813
もちろんその通りだが。
そもそも何の話だったかというと、ええと…

要するに、Nagleのアルゴリズムが不要と書いた
香具師は、無知でマヌケで恥さらしということだ。
まったりいこうぜ。
あと、ここプログラミングスレだぞw
不要かどうかは場合によるだろ。
でも、なんでもかんでもnagleは不要っていうのはマヌケだな。
>Nagleのアルゴリズムが不要と書いた香具師
って誰?
>>817

>>776>>788
あと、アフォな書き方だから良くわからんが、
たぶん>>797も。
788は813と同じような事を言ってるようだけど?
>>818
たぶん>>797は、>>796を「Nagle否定」と誤読したんだと思うよ…
>>804が言うように、>>796へのACKである一行目を除けば正しいから。
>>819
>>788が「お節介な時もある」なら同じだと思うけど…
殴るぞゴルァ
823デフォルトの名無しさん:02/12/07 23:38
Winsockを使っています。
簡単なポートスキャナ(といっても知り合いのサーバの特定の複数のポートが開いているかどうか確認するだけですが)
を作り、それは確認にConnectが成功したか否かという方法をとっています。
この場合、成功するときは数秒でConnectが返ってくるのですが、
失敗するときはConnectが返ってくるまで20秒近くかかってしまいます。
成功も失敗も数秒でわかるようにしたいのですが、どのようにすればよいでしょうか?
Connect以外でポートが開いているかどうかを確認する方法はあるでしょうか?
よろしくおねがいします。
過去ログ、というかこのスレをconnectで検索しろ。
つかそれくらいもできないヴァカは氏ね。
非ブロッキングコネクト
もっと早く知りたければ、SYNパケットだけ送るとか。
RST送って、返ってきたら「閉じてる」とか。
rawソケット使うか、データリンクに直接アクセスすれば?
connectだけじゃ芸がないだろう。

ありがとうございます。
>>824さんの言う通りまったく同じ質問が以前このスレあったのに申し訳ありませんでした。
ただ、タイムアウト方法の他に>>826さんの方法も知ることができ、
WEB検索すると役に立ちそうなページがヒットしたので、結果的に許してにゃんまげ。
winsockでデータリンクにダイレクトにアクセスするにはどうしたらいい?
bpfみたいなものないんかな。
cygwinだったら可能かな?
>>828
WinPcap じゃ駄目かい?
http://winpcap.polito.it/
830828:02/12/09 12:59
>>829
おお。ありがとうございます。落としてみます。
831デフォルトの名無しさん:02/12/09 16:10
アセンブラレベルでネットワークを利用することはできますか?
>>831
そういう質問をするヤシにはできない。
は?
...
push eax
call [imp_WSASocket]

とかか(ワラ
POP3クライアントを作るのに、winsockでWSAAsyncSelect使ってます。
FD_READとかFD_WRITEでイベントを処理するんですが、FD_WRITEがFD_CONNECT直後の1回しか来ません。
FD_READは常に発生しているようなんですが、なぜFD_WRITEは定期的に発生しないのでしょうか?
sendしてないからじゃないの
837チューボー:02/12/09 18:11
>>835
FD_WRITEってソケットに書き込めるようになったときに送られてくるんだったと思います。
だから任意のタイミングでデータ送信したい時は、
PostMessage()で強制的にFD_WRITE発行するといいんじゃないでしょうか。
半端な知識なんで変なこと言ってたらすみません。
FD_WRITEについては、このスレのpart1でいろいろ議論されてたよ。

要約すると、connect直後のFD_WRITE以外は、
sendしてWSAEWOULDBLOCKが返ってきた後の、IO-pendingからの復帰時にしか来ない。

だから、sendは(connectしたら)いつでもやっていいの。
だけど、続けてsendするといずれ失敗する。
そうなったら、「もうsendしても大丈夫だよ」とFD_WRITEが来る。
>>837
むちゃくちゃ変ですあほ
840835:02/12/09 19:23
ふむふむ。。。
みなさん、ありがとう。

もう少しがんばってみます。
データが大量に届き続けると、FD_READ が連続で発生して
UI が固まるから、止めた方がいいよ。
select で send を使うのって、どういうときなんですか?
いつでも書き込んで良さそうなんですが。
非ブロッキングソケットで、sendで止まっては困るとき。
844843:02/12/10 01:22
しまった、ブロッキングソケットで、だ
845デフォルトの名無しさん:02/12/10 12:18
BSDソケットの代わりにカーネルキュー使うと
無茶苦茶速くなると聞いたんですが
そのあたりの資料ってないですか?
その程度の知識の奴が使って「無茶苦茶速くなる」
ことなど決してない
とりあえず、
http://ghost.math.sci.hokudai.ac.jp/esehttpd/
の関連リンクをあたれ。

それと、kqueueはsocketを待つ方法の一種。
socketのかわりに使うわけではない。
848デフォルトの名無しさん:02/12/11 14:31
あげ
rawソケットとかで直接データリンクにアクセスしている場合、
自分宛のパケットを取り込むことってできるんでしょうか?
ipアドレスを自分宛、MACアドレスも自分宛にして、送信してみましたが
取り込めません。
ためしに自分宛のIPアドレスとしてループバックアドレスを指定してみましたが
取り込まないです。。。
850デフォルトの名無しさん:02/12/11 19:57
プログラミング以前なんだけど、教えて下さい。
ノンブロッキングでシングルスレッドI/Oマルチプレクシングってどういう意味ですか?
851名無し@沢村:02/12/11 19:58
銀行のATMにアクセスするプログラムはどう書くのですか?
( ゚д゚) ポカーン
つーか、また沢村かよ!! 土に還れ!!
854名無し@沢村:02/12/11 20:45
銀行のATMにアクセスするプログラムの書き方

//ネットワークに流れるデータを受信する
recive(data);
//データがATMのときは
if(data==ATM)
//あ億円を引き出す
popmoney(100000000);
855名無し@沢村:02/12/11 20:50
銀行のATMにアクセスするプログラムの書き方

//ネットワークに流れるデータを受信する
recive(data);
//データがATMのときは
if(data==ATM)
//1億円を自分の口座に振り替える。
sendmoney(100000000)from(anybank)to(mybank);
ワラタ
>>850
まったくもってプログラミング以前の話じゃないぞ。

ソケットをノンブロッキングにしてselectでイベントを待ち、
イベントドリブンっぽく記述するプログラムのモデルのことだろう。

たとえば、サーバープログラムが、複数のクライアントとの処理を
"forkせずに"おこなう場合なんかに使える。

まあ、unixならfork、win32/javaならthreadにしたほうが
楽だと思うけどね。
unixなら、自力でforkするより、inetdから起こして貰う方が楽と思うが。
シングルスレッド〜との対比で言うならforkであってると思う。
> まったくもってプログラミング以前の話じゃないぞ。

すこーし言葉がおかしいと思う。
861857:02/12/11 23:16
追記。

win32ならwinsock2とWindowMessageを使えばイベントドリブンになるね・・・
でもその格好で書いたことないや・・・
漢は黙ってIOCP
>>861
ウィンドウメッセージを使うのはWinsock2.0でなくてもできるぞ。
Winsock2.0で追加されたのはイベントオブジェクトを使った非同期処理とか
重複I/Oだとか。
つーか、WindowMessageを使うwinsockは、
threadのないWin16のために出来たと思っていたが
そして話がシングルスレッド〜に戻るわけだが
866デフォルトの名無しさん:02/12/12 01:57
>>857
ノンブロッキングでシングルスレッドI/Oマルチプレクシング
これはzeusという有料webサーバーの特徴なんですが、ググっても要領を得なかったのです。
apache2.0の性能向上はマルチスレッド対応によるところが大きいと聞きますし
世間はマルチスレッドマンセーであると思われますが、シングルスレッドであるメリットはどこにあるのでしょうか?
またI/Oマルチプレクシングについての資料やサンプルコード(perlやC)はないでしょうか?
>>866
マルチプレクシングを多重に読みかえて検索してみなされ
ttp://www.soi.wide.ad.jp/class/20000011/slides/08/index_3.html
コードは見当たらんな
868デフォルトの名無しさん:02/12/12 02:05
レベル低いね
たとえば、同時接続数10000とかになると、マルチスレッドだとスレッドが、
マルチプロセスだとプロセスが10000とかできたりして、
そのタスクスイッチだけで相当の時間が費やされてしまうし、
保存すべきコンテキストも膨大な量になるから。
>>866
理屈からいえばシングルスレッド/非ブロッキングが一番効率的になる
(スレッド切り替えだとかの問題で)が、いかんせん、余りにも処理の
流れが掴みにくくなるので一般的に保守が面倒になる、といわれている。
apacheの場合はマルチプロセスだったものがマルチスレッドも可能になった
って話でこの場合関係ない。
>>870
CPU1個ならね。
CPU複数なら、マルチスレッド、ノンブロッキングマルチプレクシングが良い。
のか?教えて、偉い人。
プロセスが1つだと、そのプロセスが落ちたとき全滅なので、
マルチプロセス・ノンブロック・マルチプレキシング、
ということになったりもするが。
>>871
以前読んだ解説記事には、例えばWebサーバみたいにI/Oリクエストを
多数処理するプログラムの場合、
(1)シングルスレッド。selectでマルチプレクシング。
(2)I/Oリクエストごとにスレッドを生成。
(3)CPU数程度のワーカ・スレッド。ノンブロッキングI/Oでマルチプレクシング。
と、下になるほどスケーラブルとあった。
>>872
初期のApacheとかだと、cgiを呼ばなきゃなんない関係で、
別プロセスにしてるんじゃなかったかなあ。

>>873
ソースキボン
875デフォルトの名無しさん:02/12/12 10:33
>>873
スレッドだけじゃ駄目な場合もあるだろうが

>>874
違う。1プロセスで扱える接続数には制限があるほか、
メモリリークを回避する意味合いや、>>872の効果もある。
876デフォルトの名無しさん:02/12/12 10:42
ちょうどマルチスレッドの話もでているので便乗させてください
不特定多数が参加するMMO(というわりには規模がちいさいけど、イメージ的にはそれ)を作っています
マルチスレッドを使おうと思ったのですが、色々訳あって現在はシングル+非同期winsockでやっております

そこで質問なのですが、winsockでconnectを同期せず(connectで止まらず)に行うには
AASyncを使うしかないのでしょうか
recv, sendはソケットのオプション変更で非同期にできたのですが…
プレイヤーがログインしたとき、データベースサーバーにコネクションを張らせたいのです
マルチスレッドにするしかないでしょうか?
>>876
プレイヤー毎にDBに接続? 。。。正気の沙汰とは思えんな。
それじゃ同時接続数は30〜100くらいしかさばけんぞ。
878デフォルトの名無しさん:02/12/12 12:32
UDPのパケット受信で正確な大きさが分からないのでsock_fastreadで受信します。
1回のsock_fastreadで処理したいのですが、
パケットってどれくらい小さく分断されるされる可能性があるものなのでしょうか?
>UNIX Network Programming" によれば、全ての TCP/IP の実装は、
>MTU の大きさに関わらず 576 バイトの最小 IP データグラムを
>サポートしなければなりません。IP ヘッダが 20 バイトで UDP ヘッダが
> 8 バイトと仮定すると、UDP メッセージの安全な最大サイズとしては
>548 バイトが残ります
thanx!>>879
じゃ、sock_fastread1回で、500byte位まで逝けるね!
>>876
WSAEventSelect
connectよりgethostbynameのEvent版がないことのほうが
納得いかん
882876:02/12/12 15:21
>>877さん, 881さん
ありがとうございます。
WSAEventSelect確認しておきます

今ひとつのサーバーにコネクションいくつ張れるかテストしてみました
43本……。
いや、Win98をサーバーにしようとは微塵も思わないけど、44本目で
「Error10055 バッファスペースに空きがない」
2kなら大丈夫かな…だといいな
クライアントとサーバーが同じPCだったからかな…
何にせよプレイヤーの数だけDBにコネクションを張るのは無謀、了解しました。

[プレイヤー] ←プレイ→ [ゲー鯖] ←セーブロード→ [DB鯖]
ゲー鯖とDB鯖には一本張って、それでやりとりするのがいいですかね
何にせよゲー鯖はプレイヤー人数分コネクト張らなきゃいけないのに、43本…


883デフォルトの名無しさん:02/12/12 16:57
>>882
めちゃくちゃ納得
というか既存のネットゲーどうやってるのか?知りたいです。
ノンブロッキングIOプレクシングとやらも関係あるのかも
DBとゲー鯖で一本コネクション張っておけば?
でも一斉に大量がセーブロードを行う場合にsendバッファ超えそう
一回セーブ内容をプールしたりする必要があるかもな
>>876
connectって非同期にできない?
リファレンス見ると、できそうに書いてあるけど。

> With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK.
>>885
どう読んだらそうなるんだ?
「connect要求は直ちに完了できない(ノンブロッキングにできない)ので
エラーになる」と書いてあるが。
>>886
Windows の設計はよくわかんなくて、エラーは返るんだけど、正常に
ノンブロッキング処理は行われる。

だから、メッセージをそのまま解釈すると、connect から SOCKET_ERROR
が返ってきて、かつ WSAGetLastError から WSAWOULDBLOCK
が返ってきたときは、正常に非同期接続が行われている(途中)ってことになる。
888885:02/12/13 00:07
>>886
え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。
EWOULDBLOCK は、本来ならブロッキングしてたはずのところを、ノンブロッキングだからすぐリターンしたよって意味ではなかった?
EWOULDBLOCKはEINTRと、意味は違うけどその後の処理は似てるね。
まあ、Winsockのノンブロッキングを知ってればあたりまえだけど、
そういう仕様だと思って納得するしかないな。

ところで、>>876
> recv, sendはソケットのオプション変更で非同期にできたのですが…
というところから、ノンブロッキングモードではなく非同期モードを使おうとしているようだが。
ちなみに俺は知らんし調べる気もない。
非同期とノンブロックは全く別ものだな。
知ったかクンがよく間違えてるが。
892デフォルトの名無しさん:02/12/13 01:06
private int DatagramSocket ds;
って宣言の仕方おかしいですか?

Eclipseをつかっていまして
トークン"ds"に構文エラーがあります。正しくは";","."です。と表示されますが、
どういうことでしょうか。
>>889
結構違うと思うよ。

EINTRはそのままリトライに入って問題ないけど、
EWOULDBLOCKはそのままだとBusy Loopに陥る。
>>892
ネットワークプログラミング以前の問題
初心者スレへ逝け
895892:02/12/13 01:16
あ・・・なんでintが入ってるんだろ(汗
スマソ
>>888
「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。
いつもWSAEWOULDBLOCKが返ってくることを前提にした
コードを書いてはならない。
897876:02/12/13 09:40
>>890-891
すいません、しったか君が間違えました
ノンブロッキングモードです。

cnnnectにもノンブロッキングモードはあるのかな
ちょっと調べてみます

>>881さん
WSAEventSelect調べてみました
ははーん…。
イベントとやらも便利そうですね。winsockのみなのが残念なところ
linuxでも試してみたいので、connectのノンブロッキングを探してみます
だめそうならイベントを
>>896
上のドキュメント見ろ。「いつも」だ。
> With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK.

ノンブロッキングソケットでは、コネクションの試みは即座には完了できない。
この場合、connectはSOCKET_ERRORを返す。WSAGetLastErrorはWSAEOULDBLOCKを返す。
>>888より
> え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。
>>896より
> 「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。
>>899より
> the connection attempt cannot ...

後は自分で判断しような>他の人
判断する余地があるのか無いのか・・・
無いね。「may not」なら「完了しないこともある」だが、
「cannot」だからね。必ずSOCKET_ERRORが返る。
903900:02/12/13 14:54
>>888より
> いつもエラーリターンでそ? recv とか send とかも。
904900:02/12/13 14:56
おっと、connect直後にFD_WRITEが来るから
send()が成功するのは当てはまらないと言われるかな。
要するに>>896が知ったかということだろ。
906900:02/12/13 14:57
connectに関しては全く異論はないよ。
907900:02/12/13 15:01
しつこいから最後。
俺には>>896が知ったかだったのではなく、>>898がよく読んでなかっただけに見えるけどね。

あ、俺は>>896ではないよ。
888がバカなのは確かだが。
nonblockingなソケットの場合

1. connect()は必ずWSAEWOULDBLOCK.が返ってくる。
2. recv()やsend()とかはいきなり正常終了する可能性がある。

connect()する時は相手からの応答を待つから、即座の復帰はありえない。
recv()やsend()ではバッファの関係で正常/WSAEWOULDBLOCK.両方の可能性がある。

ごっちゃにしたのが混乱の原因(w
そうそう、send()が一番わかりやすいから書いたけど、
recv()もconnect後にFD_READが来る前でも成功する可能性がある。
そうなると、次にFD_READが来てからrecv()しても、WSAEWOULDBLOCKになる可能性がある。

また、FD_READの処理部で複数回recv()することも出来る。
そして、2回目以降が成功する場合もある。
この場合も次のFD_READで何も受信できない場合が多い。
これは、1回目のrecv()後にバッファにデータが残っていたら、
recv()からの復帰前にFD_READが送られるから。

だったはず。

確か、FD_CLOSEの後にFD_READが来る可能性もあったはず。
>確か、FD_CLOSEの後にFD_READが来る可能性もあったはず。

普通はおきないけど、FD_CLOSE 前のFD_READ が届いたときに
(ソケットバッファ未満の?)小さな recv() しかしない場合に、
発生する可能性ありなんだっけ?

winsock 側としては、
FD_READ
FD_CLOSE
をポストして、お役御免と思っていたら、FD_READ 時に全部 recv()
してくれないものだから、そこで、あわてて FD_READ を再発行って
印象。

それ以外のシチュエーションでも、FD_CLOSE後のFD_READなどが
ポストされる場合って、あるのかな?
913デフォルトの名無しさん:02/12/13 20:22
Mobile IPv6 に対応したプログラムくみたいんですけど、誰か参考になる
ソースとかのありかおしえてくれませんか?
>>912
前スレで同じ話があったと思う。
蒸し返すようだけど、>>885-888の話の流れからして、
888は「WSAEWOULDBLOCKを知らせる時には(sendやrecvも)いつもSOCKET_ERRORを返す」
ということを言いたかったんじゃないかと思う。
とすると、888も896も898以降も、みんなわかってるのに言葉のあやでひっかかってただけかも。
日本語勉強しないとね>俺も
916名無しさん@接続しっぱなし:02/12/14 12:43
>>845
http://www.cs.rice.edu/~gaurav/papers/usenix99.ps
これ読むと、select(2)のkernel内bottle neckは、
bit操作であることが分かるよ。

だからkqueue/keventとまではいかずに、poll(2)や/dev/pollでも、
selectよりもかなり改善が期待できる。(C10Kな状況では)
http://www.kegel.com/dkftpbench/Poller_bench.html
にベンチマークがある。
917デフォルトの名無しさん:02/12/14 12:57
ウイルスをください
もちろんダウンロードしたときに
こっちのパソコンが感染しないように
してほしいです。
ダウンロードさせてくれるサイトの紹介でも
いいです。
918デフォルトの名無しさん:02/12/14 13:17
>>917
何に使うの?
919888:02/12/14 17:58
885=888です。
>>891 非同期と聞いてノンブロッキングと短絡的に考えてました。本で読んだばっかりなのに・・・鬱。
>>915 ふぉろーさんくす・・・言葉足らずだったばっかりに。許して>896,900,903,905,908
>>909 localhostの場合はすぐconnect完了するかもしれんので、必ずじゃないかも(UNIXの本にはそう書いてありました)。
あと、UNIXではEWOULDBLOCKじゃなくてEINPROGRESSだと知りました・・・いろいろ勉強不足。ごめ。もっと修行します。
>非同期と聞いてノンブロッキングと短絡的に考えてました
って?非同期=ノンブロッキングではないってこと?
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=%E9%9D%9E%E5%90%8C%E6%9C%9F+%E3%83%8E%E3%83%B3%E3%83%96%E3%83%AD%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0+%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
とか見ると「非同期(ノンブロッキング)」とか書いてあるけど…。
921919:02/12/14 19:40
>>920
>って?非同期=ノンブロッキングではないってこと?
ないです。891さんの言うとおり、やっぱりよく間違えられるんでしょう。
「UNIXネットワークプログラミング第2版Vol1」によると、入出力を扱う手法はブロッキング、ノンブロッキング、多重化(select と poll のこと)、シグナル駆動I/O、非同期I/O という5つの方法があって、
非同期I/O は aio_read、aio_write とかいうものを使う方法だそうです。Windows ではたぶん WriteFileEx と ReadFileEx で OVERLAPPED を指定した状態が、それに相当するのではないかと。
>>921
あ、そうなんですか。
うーん。何やら難しいですね。。。
923909:02/12/14 22:40
>>919
俺はMSDNに書いてある記述の要約をしただけで、
Unix系の実装について触れた覚えはないんだが。

大抵の場合はlocalhostに関してもエラーが帰ってくる可能性が高いだろ。
connect(2)が完了するためには相手がaccept(2)するためにコンテキストスイッチが
発生するから、それを待たずに即座に復帰するよう実装するんじゃないか?

それでも、nonblockingでもconnect(2)が常に失敗することを仮定して
実装すべきではないと思う。つーか、エラーチェックくらいしろ、と。

あと、Unix系ではEAGAIN、EWOULDBLOCK、EINPROGRESSの三種類がある。
Linuxでは、manページによるとconnect(2)はEINPROGRESS、recv(2), send(2)は
EAGAINまたはEWOULDBLOCK(実際は同じ値)を返すらしい。
924909:02/12/14 22:40
>>921
使い分けだと3種類だな。

同期: ブロッキング
多重化: ノンブロッキング + (select or poll)
非同期: シグナル駆動I/O or 非同期I/O

Windowsの場合も同様。
ブロッキング、ノンブロッキング、select()、Windowメッセージ、イベント、重複I/Oに分かれる。
WSAEventSelect()ではWindowメッセージかイベントに対して通知をし、
OVERLAPPED渡すやつではイベントか、コールバックに通知をする。

同期: ブロッキング
多重化: ノンブロッキング + (select or event)
非同期: 重複I/O(イベント使わずコールバック)

MsgWaitForMultipleObjectsEx()使えば、スレッドの終了イベントを待機しながら、
Windowsメッセージを処理し、さらにI/Oを完全な非同期で処理することを1スレッドで
実装することも不可能ではない。
ネットワークや分散の世界で、
非同期メッセージ通信というと、requestとacknowledgementが分かれていて、
acknowledgmentを別途取得するタイプのメッセージ通信のことです。

例えばDNSを引く時に、gethostbyname(3)を使うと、
関数呼び出しと値返しが同時に起きるので、同期メッセージ通信になります。
WSAAsyncGetHostByName(win32)だと非同期メッセージ通信です。

非同期I/Oは、kernelとのやり取りにおいて、
I/Oの結果をAPI呼び出し時に即座に返えさないタイプのI/Oです。

どのレベルのinteractionについて、同期/非同期を言っているのか、
混同している人は意外に多いようです。
APIレベルの話なんでねえの?
>>924
Stevens本はpthreadを視野に入れてないので、
(というかStevensの使っているUNIXにはまともなthreadがなかった)

> 多重化(select と poll のこと)

でもいいのですが、Windowsの場合は、

> 多重化: ノンブロッキング + (select or event)

だけじゃなくて、多重化を実現する方法に、
マルチスレッドも入るんじゃないでしょうか?
(それからノンブロッキングは必須でない。多重化をより稼げるけど)
>>926
gethostbyname(3)もsend(2)もどっちもAPIじゃん?
>>926
ん?
「send/recv(write/read)レベルの話なんでねえの?」
「UNIXでいうところのsystem callレベルの話なんでねえの?」
と言っているのかな?

そこに限ってしまうと同期/非同期と
ブロッキング/ノンブロッキングの区別がなくなるから、
同期/非同期はもう少し大きい枠組みで理解しよう、
というのが、分かりにくかったかも知れないけど>>925の主旨でした。
このスレで扱ってる同期/非同期は、
「指示した動作の、完了を知る方法の違い」
でしかないと思った。

TCP/socketはネットワークアクセスのためのAPIだけど、
APIになった瞬間にネットワークの存在は関知しなくてもいいでしょ。
というか、知りえないでしょう。

925の言う「どのレベルでのinteractionか」というくだりの、
レベルの違いっていうのが、プログラムから見て意味あんのか疑問。
931コロ助:02/12/15 12:10
すいません。WinSockの質問をしたいのですが。
サーバーにHTTP接続を試みているのですが、うまく接続できません。

ソース
sock[n]=socket(AF_INET,SOCK_STREAM,0);

WSAAsyncSelect(sock[n],hW,SM_ASYNC,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE)

lpServEnt = getservbyname("http", "tcp");

if(lpServEnt==NULL)
{
ser.sin_port=htons(80);
}
else
{
ser.sin_port=lpServEnt->s_port;
}

lpHostEntry=(LPHOSTENT)bufHostEnt;
ser.sin_family=AF_INET;
ser.sin_addr=*((LPIN_ADDR)*lpHostEntry->h_addr_list);

if(SOCKET_ERROR!=connect(sock[n],(LPSOCKADDR)&ser,sizeof(SOCKADDR_IN)))

HTTPだと駄目なのですが、SMTPやFTPならうまく接続できて、データも転送できます。
なぜ、HTTPだけ接続できないのでしょうか?
> うまく接続できません
> HTTPだと駄目

どこでどんなエラーが出てるのか、
またはエラーが出てないが応答がこないのか、
明示しないお前にコロ助を名乗る資格はない。
933コロ助:02/12/15 12:34
>>932
唯一、エラーが出ているのは、サーバーと接続(connect)したときで、

エラー

if(SOCKET_ERROR!=connect(sock[n],(LPSOCKADDR)&ser,sizeof(SOCKADDR_IN)))
{
MessageBox(hW,"connect","成功",0);
}
else
{
if(WSAGetLastError()!=WSAEWOULDBLOCK)
{
MessageBox(hW,"connect","失敗",0);
}
}

connect関数はSOCKET_ERRORを返しエラーとなりますが、その後の、if(WSAGetLastError()!=WSAEWOULDBLOCK)には引っかかりません。

そのほかはエラーは全く出ていません。
934コロ助:02/12/15 12:37
lpServEnt = getservbyname("http", "tcp");
でhttpを指定すると接続されないのですが、ftp、smtpだとうまく接続されます。

WinSockはhttp接続の際なにか特別な処理をしないといけないのでしょうか?
>>933
WSAGetLastError() ぐらい知らんのかよ...。
>>934
gethostbyname()
937935:02/12/15 12:43
すまん勘違いだった。
( ●∀●) コロ助にSYNパケットを送るモナ
実は80はwell-known-portに含まれず、servicesにhttpが書いてない罠。
>>939
その時は、80 をセットするようにしてるみたいだけど ?
ちゃんと見てないけど、ロジックがおかしいのか ?
で、結局WSAGetLastError()は何を返してるんだ?
それと、相手はちゃんと存在するのか?
942デフォルトの名無しさん:02/12/15 14:52
っつーか、ネットワークプログラミングしてるくらいなら、
パケットダンピングくらいしろよ。
>>941
取りあえず、WSAEWOULDBLOCK じゃねーのか ?
WSAAsyncSelect() で Non-Blocking-Mode にしちゃってるから、当たり前だと思う。
ftp/smtp がちゃんと動いている方が不思議だ。
とっとと教えればキレることもねーんだよ馬鹿
俺が下手に出て教えてくれっていってんだから
すぐ書けばいいだろボケ
いつみてもワラタ
inet_ntoa()とかマルチスレッドで使うときどうしてます?
inet_ntoa_r()無いので結局内部バッファ使わないのを自作してしまったんだけど
これ程度でmutexなどで排他かけるのもモタイナーイ気がして・・
>>946
環境は ? マルチスレッドサポートしてるシステムなら、普通 inet_ntoa() もスレッドセーフになってると思うが。
>>947
Solaris2.5/8,AIX4.3です
>>948
5年も前の環境じゃしょうがないかも知れないな。
素直に、排他制御しとくべし。
950948:02/12/16 00:28
やっぱりみなさん当時はそうしてたんでしょうかね・・
つーか、普通その手のライブラリってTLS(TSS)に内部バッファ確保するようになってないか普通?
5年前の段階でTLSもないのがまともなOS面してたとも思えないんだが。
TLSはwin95にすらあったねえ。
なんでそのマシンでmanして調べてみないの?
954デフォルトの名無しさん:02/12/16 05:45
windowsでは バークレーソケットではパフォーマンスでないのかな。。。
http://www-6.ibm.com/jp/developerworks/linux/020208/j_l-rt6.html#1

たしかに ab(ApacheBench) で windows上の apache と Linux上の apacheで
速度を計測してみると、ハードウェアは Windowsの方が上なのに3倍近く差が
でたしなぁ。。。 こんなの変ですよ!ゲイツさん!
Apacheのバージョンが不明だが、もし1.3系ならWin32で遅いのは
socketよりむしろApacheがタコだから

>>947
『スレッドセーフ』は各スレッドで排他制御無しで使えるって意味ではないという罠。
そろそろ新スレの季節ですが、、、
だれかテンプレまとめて。
なんならスレを立ててもいいから。
958デフォルトの名無しさん:02/12/16 22:36
>>946
inet_ntop()を使うべし
959デフォルトの名無しさん:02/12/16 23:25
rawソケットはどうして管理者権限でなければ使えないんでしょうか・・・
DoSアタックとかに使えるからでないの.
あ、技術的な問題じゃなかったんですか
詳しくはないけど、セキュリティ的に問題アリアリなんでないのかな。
あるいはその可能性があるとか。
bpfがrootにしか使えないのと似たようなもんだろ
>>960-962
パケット盗み見から始まって、IP / MAC アドレス詐称など何でもありありだからだよーん。
965デフォルトの名無しさん:02/12/17 10:45
>sock_wait_established
>This macro has been deprecated in Dynamic C version 7.20.
>このマクロは動的なCバージョン7.20で大いに非難されました。

質問です。これは使わない方が良いということでしょうか。
たしかにsock_err ラベルにgotoされると構造化し難いですが。
代替関数は何になりますか?
>>963
bpfは /dev/bpf* がopenさえできればrootじゃなくても使えるよ。
raw socketは要rootだが。
>>966
ふつーrootしか開けないようなPermissionになってない?
968真面目な開発者:02/12/17 20:42
すいません、質問があります。

たぶん、WINSOCKに関してだと思います。

今日WINDOWSを起動したら、IEでインターネットが見れなくなりました。
ネットスケープやOPERAでは普通に見れるのに、IEだと見れなくなりました。

今WINSOCKの勉強と開発をしています。
もしかしてWINSOCKの開発中に、不適切なプログラムを組んだために、IEにエラーが起こってしまったのでしょうか?
開発者を辞めたほうがいいのでは・・・
>>968
PC初心者板へどうぞ(藁
>>968
> もしかしてWINSOCKの開発中に、

結構すごい香具師だな。
きっと全角版を開発してるんだろう。
980の人は次スレたててくらはい
ネスケやオペラはwinsock使ってなかったのか。初耳。
(;´Д`) ハァハァ
winsockのどの部分をどう改造したかおせーろ。
SMBの登場以来、スレの流れがおかしい気がする
Win (Winsock) でサーバプログラム(TCP/IP)作ってるんだけど、
特定のクライアントからのコネクションを拒否する方法ってある?
Raw ソケットは使わない前提で。
ちなみに今は accept() にてリモートホストの IP アドレスをチェックして
弾くようにしてるんだけど、それだと一瞬クラアイントとコネクション張ってしまう
状態になっちゃうから、あまりよろしくないので。
>>978
WSAAcceptで出来たような気がする
>>979
ありがとう。
今 Winsock 1.1 使ってるので、そうなると WSAAccept は使えないからダメみたい。
(一応 Win95 もサポートしたいので。)
後に Linux バージョンも作る予定だけど、自アプリでやるのは邪道なのかな?
TCPWrapper や tcpserver とかにフィルタリングさせる方が一般的なんだよね?
逆に聞きたいけどLinuxだと出来るの?
>>981
まだ調べてないからわかんない。詳しい人教えて〜。
やるなら Raw ソケットで直にIPパケット使うことになるかも。
でもそこまでするのは面倒になりそうだから自前でやるのやめようかなと思ってる。
95でもwinsock2は使える。
>>983
>95でもwinsock2は使える。
ホント?
IE とか何らかのソフトインストールすればってこと? 教えて。
その手順が簡単なら考えてみたい。(PC に不慣れな人が出来るレベルなら)
可能なら自アプリのインストーラに組み込めればベストかな。
>>985>>986
ありがとう。よく見てないけど後で調査してみます。
>>987
重ね重ねお世話さまです。ここからダウロードできるね。
ライセンス等も考慮して検討してみます。
Winsock2には再配布可能なバージョンもあるらしいんだけど
リンクが見つからない…
ところで次スレは?
ネットワークプログラミング相談室 Port5
http://pc3.2ch.net/test/read.cgi/tech/1040220302/l50
>>991
乙〜
993ヘッケルリンク:02/12/18 23:13
-
/
-
\
997次スレ案内:02/12/19 11:13
ネットワークプログラミング相談室 Port5
http://pc3.2ch.net/test/read.cgi/tech/1040220302/l50
998次スレ案内:02/12/19 11:14
ネットワークプログラミング相談室 Port5
http://pc3.2ch.net/test/read.cgi/tech/1040220302/l50
999次スレ案内:02/12/19 11:14
ネットワークプログラミング相談室 Port5
http://pc3.2ch.net/test/read.cgi/tech/1040220302/l50
1000次スレ案内:02/12/19 11:15
ネットワークプログラミング相談室 Port5
http://pc3.2ch.net/test/read.cgi/tech/1040220302/l50
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。