ネットワークプログラミング相談室
- 1 :名無しさん@お腹いっぱい。 :2000/10/01(日) 05:09
- 主にソケットに関してのFAQ
- 2 :名無しさん@お腹いっぱい。 :2000/10/01(日) 05:38
- なにが聞きたいんじゃ?
- 3 :1>2 :2000/10/01(日) 13:14
- ゲームプログラミング相談室ほパクったものなのて私は特に何を聞きたいというわけではないです。
- 4 :名無しさん@お腹いっぱい。 :2000/10/01(日) 13:20
- >ほパクったものなのて
(゚Д゚)ハァ?
- 5 :1=3>4 :2000/10/01(日) 13:25
- ほパクった → をパクった
- 6 :名無しさん@お腹いっぱい。 :2000/10/01(日) 13:59
- RMI使えばソケットの知識必要なし。
- 7 :名無しさん@お腹いっぱい。 :2000/10/01(日) 14:17
- >>3
プラットフォームはなんでもあり?
- 8 :1=3>7 :2000/10/01(日) 14:25
- OKです。答えが返ってくるとは限りませんが。
- 9 :名無しさん@お腹いっぱい。 :2000/10/01(日) 17:52
- >>4 爆笑した。
- 10 :名無しさん@お腹いっぱい。 :2000/10/01(日) 19:24
- 勉強したいのですが
いい本教えて下さい
- 11 :優しい君 :2000/10/01(日) 20:08
- >>10 http://mentai.2ch.net/test/read.cgi?bbs=prog&key=960830594
- 12 :>11 :2000/10/01(日) 20:14
- う、同じスレをリンクしようとして開いていた。
リロードしてよかった・・・
- 13 :初心者 :2000/10/01(日) 22:21
- ソケットとOSI参照モデルの7層との関係を教えてください
- 14 :名無しさん@お腹いっぱい。 :2000/10/02(月) 00:37
- >>13
あんま関係ない。
強いていえばセッション層に含まれる手順だけど、
OSIモデルを意識してソケット使うことって、あんましないよね。
- 15 :名無しさん@お腹いっぱい。 :2000/10/02(月) 01:18
- OSIモデルよりソケットライブラリのほうが歴史があるんだっけ?
- 16 :名無しさん@お腹いっぱい。 :2000/10/02(月) 02:07
- OSIは、簡単に言うと標準化団体の学者馬鹿によるフライング。
部屋にこもってる世間知らずのじいさんたちの世迷言。
CMIPは誰も使わないし、TCP/IPはOSIと関係ない。
- 17 :ういろう :2000/10/02(月) 03:15
- Perlでソケット使える無料Webスペースがないので実験できないです
- 18 :名無しさん@お腹いっぱい。 :2000/10/02(月) 03:20
- OSIは、お勉強として参考にするには良いって聞いたけど
本当ですか?
- 19 :cafe :2000/10/02(月) 03:33
- OSIか。わけのわからん標準だったな。各層でダブりが多かったし、
実際に7層あるプロトコル無いし。
解説書書いてる人も、訳分からなかったんだろうな。
- 20 :名無しさん@お腹いっぱい。 :2000/10/02(月) 05:05
- >>17
もし Windows を使っているならば、
ActivePerl という無料の Perl 実行環境があるので、
それを使いましょう。
[ 参考 ] Windows 95/NTでPerl&CGIのページ
http://www.att.or.jp/perl/win/nt_cgi2.html
- 21 :>16 :2000/10/02(月) 12:12
- しかし、TCP/IP本は必ずといっていいほどOSIも載せるから勘違いしている人も多いんだよな・・・
- 22 :ソケットと :2000/10/02(月) 17:29
- http,ftp,smtpなどとの関係はどのようになっているのでしょうか?
- 23 :>22 :2000/10/02(月) 17:40
- ソケットは入出力の口にすぎんので、アプリケーションプロトコルは、
プログラムで実装してください。
- 24 :名無しさん@お腹いっぱい。 :2000/10/02(月) 20:12
- 広告バナーを先にクリックしないと、
目的とする別のURLを開けられないようにするには
どうしたらよいのでしょうか?
- 25 :ウッハウハ :2000/10/02(月) 20:32
- 広告のイメージに onClick 属性をつけて、
JavaScript でほにゃららってのはどう?
<html>
<head>
<script Language="JavaScript"><!--
function inst(){ alert("アドレスはhogehoge"); return false; }
// -->
</script>
</head>
<body>
ソケット入門中 :2000/10/02(月) 20:36- >>22
ソケット
IPアドレスとポート番号を用いて通信するインターフェース
HTTP,FTP等
ぶっちゃけて言えば、特定のポート番号の別名(HTTPは80等)
〃プロトコル
サーバーとクライアントの間でコマンドやデータのやり取りをするとき、
どういうリクエストを送り、どういう応答を返すかの取り決め。
- 27 :初心者 :2000/10/02(月) 21:54
- >ソケット
>IPアドレスとポート番号を用いて通信するインターフェース
ということは、ソケットとは、TCPプロトコルとIPプロトコルのコネクションを
確立するためのもので、これらのプロトコルとは深く関わっているが、
アプリケーションプロトコルはまた別物で、他に自分で用意しなければならない
という解釈であっていますでしょうか?
- 28 :無名 :2000/10/02(月) 23:02
- >27 You are right!
- 29 :26@あまり自信ない :2000/10/02(月) 23:05
- >ソケットとは、TCPプロトコルとIPプロトコルのコネクションを
>確立するためのもので、これらのプロトコルとは深く関わっているが、
TCPやIPのヘッダやパケットを覆い隠すという感じ?
>アプリケーションプロトコルはまた別物で、他に自分で用意しなければならない
アプリケーション毎に送る内容が違うから。
俺の勝手な解釈
IP:ルーティング(送りっぱなし)
TCP:転送の確実性の確保(含エラーチェック)
ソケット:TCPやIPのヘッダを意識せず、データを用意するだけでパケットを送れる
サーバーソケットとクライアントソケットを結ぶファイル記述子のようなもの
アプリケーションプロトコル:通信の方法
送るデータの形式("GET xxx"や"POST xxx")
BMPファイルのヘッダ形式のようなもの
- 30 :名無しさん@お腹いっぱい。 :2000/10/02(月) 23:06
- ソケットを作るときにアドレスファミリとソケットタイプを指定できるので、
必ずしも
>ソケット
> IPアドレスとポート番号を用いて通信するインターフェース
とは限らないヨ。
>HTTP,FTP等
> ぶっちゃけて言えば、特定のポート番号の別名(HTTPは80等)
ポート番号は変えられるので、こうとは限らないヨ。
>〃プロトコル
「HTTP」の「P」は「Protocol」のことだヨ。
- 31 :無名選手@投げたらアカん! :2000/10/02(月) 23:17
- アプリケーション(プログラム)からTCP,UDP等を利用して通信するためのAPI(関数郡)がソケットという理解なんだけど違う?
- 32 :名無しさん@お腹いっぱい。 :2000/10/03(火) 00:31
- 細かいね。。。
- 33 :名無しさん@お腹いっぱい。 :2000/10/03(火) 00:48
- Windowsでの話ですが。
いまはもうWinSock2を標準にしてプログラミング
してよくなった?
まだ1.1を前提にしなきゃいけないの?
- 34 :名無しさん@お腹いっぱい。 :2000/10/03(火) 00:54
- >33
Win95にwinsock2を安全に入れる方法を発見すればおっけー
- 35 :名無しさん@お腹いっぱい。 :2000/10/03(火) 01:31
- IPの偽造ってどこまで出来るものなんですか?
- 36 :名無しさん@お腹いっぱい。 :2000/10/03(火) 02:22
- >35
はあ?
- 37 :名無しさん@お腹いっぱい。 :2000/10/03(火) 02:49
- IP MasqueradeとかのNAT技術ってIPパケットの偽造っちゃ偽造だよね。
- 38 :名無しさん@お腹いっぱい。 :2000/10/03(火) 06:16
- >>22
どうも、アクティブパールって、その為に有ったんですね。
Jパールと両方いれてみようかな?
- 39 :36 :2000/10/03(火) 13:12
- >35
37みたいな意味なら、データグラムのIPヘッダ適当に書きかえれば
いくらでもできるが。そういうことなのか?
- 40 :>34 :2000/10/03(火) 14:58
- いっしょに日本語版のダイヤルアップ ネットワーク 1.3 (以下 DUN 1.3) をセットアップするという手はダメ?
関連内容
http://www.microsoft.com/JAPAN/support/kb/articles/J046/0/83.htm
日本語版ダイヤルアップネットワーク1.3
http://www.asia.microsoft.com/japan/windows/dun1_3/
- 41 :名無しさん@お腹いっぱい。 :2000/10/03(火) 16:30
- ソケットには2種類あって、
一つは同一マシンのプロセス間通信用、
もう一つは外部マシンとの通信用ということらしいですが、
どうしてこの二つともが「ソケット」と呼ばれているのでしょうか?
TCPやIPでの外部通信とマシン内部のプロセス同士の通信は
まったく別物のような気がするのですが。
- 42 :名無しさん@お腹いっぱい。 :2000/10/03(火) 19:45
- >ソケットには2種類あって、
?
- 43 :名無しさん@お腹いっぱい。 :2000/10/03(火) 19:52
- >ソケットには2種類あって、
おんなじだよ〜。ソケットってのはデータの出入り口の事だから、
データがネットワークを経由して別のマシンに逝こうが、同じマ
シンの別のプロセスに逝こうが、関係ないよ。
- 44 :名無しさん@お腹いっぱい。 :2000/10/03(火) 21:36
- ストリームとデータグラムの違いね。
- 45 :>>41 :2000/10/03(火) 23:58
- > TCPやIPでの外部通信とマシン内部のプロセス同士の通信は
> まったく別物のような気がするのですが。
違ったり同じだったり。
とりあえず内部用に127.0.0.1のIPアドレスが予約されてたり。
スタンドアロンのIPCでストリーム通信だってできたり。
- 46 :> :2000/10/04(水) 05:43
- その別物をなるべく同じようにしようという意図も
少しはあるんじゃないか?
- 47 :> 44 :2000/10/04(水) 12:22
- > ストリームとデータグラムの違いね。
これは「同一マシン」「ネットワーク経由」の違いとは関係ないゾ。
ネタ?
- 48 :名無しさん@お腹いっぱい。 :2000/10/04(水) 16:56
- unixの内部プロトコルとIPのことじゃないの?
- 49 :つまり :2000/10/04(水) 17:05
- 同一マシンの違うプロセスと通信するにも
TCP/IPスタック(?)を借りてやらなけらばならないということですか?
- 50 :名無しさん@お腹いっぱい。 :2000/10/04(水) 17:34
- socket( AF_INET, SOCK_DGRAM, 0 );
IPv4でデータグラム型。つまりUDP。外部と通信可。
socket( AF_INET, SOCK_STREAM, 0 );
IPv4でストリーム型。つまりTCP。外部と通信可。
socket( AF_LOCAL, SOCK_DGRAM, 0 );
Unixドメインプロトコルでデータグラム型。名称なし。同一マシンのみ。
socket( AF_LOCAL, SOCK_STREAM, 0 );
Unixドメインプロトコルでストリーム型。名称なし。同一マシンのみ。
ただ、45のように127.0.0.1をローカルマシンのIPアドレスとして
TCPやUDPで通信することもできるヨ。
- 51 :名無しさん@お腹いっぱい。 :2000/10/04(水) 17:37
- >49
パイプでもいいよ
- 52 :名無しさん@お腹いっぱい。 :2000/10/04(水) 19:29
- >49
バイブは違うよ
- 53 :名無しさん@お腹いっぱい。 :2000/10/05(木) 06:08
- >>52
SVR4だとパイプだろうがソケットだろうが、結局STREAMS配下だから
同じようなもんじゃなかったっけ?
# いや、最近やってないからもはやうろ覚えなんだが
- 54 :名無しさん@お腹いっぱい。 :2000/10/05(木) 12:12
- >>53
良く読め(藁
- 55 :つーか :2000/10/05(木) 14:10
- >>53
良く見ろ(藁
- 56 :名無しさん@お腹いっぱい。 :2000/10/05(木) 14:49
- やっぱり生が一番だよ
- 57 :名無しさん@お腹いっぱい。 :2000/10/10(火) 15:00
- あげ
- 58 :名無しさん@お腹いっぱい。 :2000/10/10(火) 15:52
- >>57 なんかききたいの?
- 59 :名無しさん@お腹いっぱい。 :2000/10/10(火) 17:43
- libpcap.a があると良いですよ。なんつて。
- 60 :名無しさん@お腹いっぱい。 :2000/10/10(火) 17:49
- 私のおすすめはこれ。
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI・ソケットとXTI
[原書名:UNIX NETWORK PROGRAMMING,Volume 1,Networking APIs:Sockets and XTI〈Stevens,W.Richard〉 ]
ISBN4-8101-8612-1
でも本体価格8,000円です。でもって分厚いです。
(学生の人は図書館行って探した方が良いかも)。
- 61 :名無しさん@お腹いっぱい。 :2000/10/12(木) 20:56
- 定期あげ
- 62 :名無しさん@お腹いっぱい。 :2000/10/12(木) 21:29
- Vol2出てたね。RPCだって
- 63 :名無しさん@お腹いっぱい。 :2000/10/12(木) 23:04
- Winsock2.0プログラミングに
「多数の接続を同時に処理しなければならないサーバーでは
WindowsNTとI/O完了ポートを使用する必要があります」(P388)
と書いてるんだけどI/O完了ポートについて日本語で詳しく書かれてる
webサイトを知らないでしょうか?
MSDNやサンプルを眺めてもさっぱりわからなかったもので・・・
- 64 :名無しさん@お腹いっぱい。 :2000/10/13(金) 20:30
- 定期あげ
- 65 :名無しさん@お腹いっぱい。 :2000/10/14(土) 11:23
- スティーブンスの本もうなかった・・・
- 66 :名無しさん@お腹いっぱい。 :2000/10/14(土) 11:55
- >63
ちょい前にI/Oコンプリーションポート使って、TCPでの同時接続1000台程度のサーバを組んだ。
マルチCPUを生かしやすいし、サーバの負荷も軽減する。
よくあるパターンで、クライアント接続時にスレッドやプロセスを起動して
処理させるのではコストが高く、主にselect〜recvがネックになる。
とくによいサイトや本は内容に思える。
自分は、Win32マルチスレッドプログラミングとMSDNで理解。
ちなみに、同プロジェクトの人に何度も説明したが、
誰も理解してくれなかった覚えがあり。
- 67 :名無しさん@お腹いっぱい。 :2000/10/14(土) 18:45
- うむ、俺もCreateIoCompletionPortやGetQueuedCompletionStatusを調べて
理解できる範囲の事しかわからん。
- 68 :63 :2000/10/14(土) 21:21
- >自分は、Win32マルチスレッドプログラミングとMSDNで理解。
Win32マルチスレッドプログラミング買いました。
I/O完了ポートを使ったサーバーのサンプルがそのままついているのはありがたかったです。
本をサンプルソースを眺めてなんとなくですが仕組みは理解することが出来ました。
ありがとうございました。
- 69 :問題提起 :2000/10/16(月) 05:01
- ダイアルアップソフトのつくり方わかるプログラマ−の人いますか?
@ISDN回線の2回線をパソコンの画面で制御できる。
ATAのリダイアル規制をはずして1分間に60回リダイアルできる
B1つの番号が混んでいたら他の予備に登録した番号をどんどんかけていく
このようなプログラムがわかる人いますか?
わかる人がいたら教えてください
- 70 :>69 :2000/10/16(月) 12:43
- んなもん作ってどうするんだよ。
- 71 :名無しさん@お腹いっぱい。 :2000/10/16(月) 12:49
- マルチポスト野郎かい >>69
- 72 :名無しさん@お腹いっぱい。 :2000/10/16(月) 13:53
- こいつのようなクソのためにリダイアル規制ができたんだよな>>69
氏ね
- 73 :71 :2000/10/16(月) 14:21
- あ、でもこっちには「天才」が付いてない。>>69
- 74 :>70 :2000/10/16(月) 18:21
- チケット予約とか(藁
- 75 :教えて君 :2000/10/16(月) 18:36
- HttpでURLに日本語渡すとき、JISコードの前に'%'を付ければ良いのは
分かったのですが、?が%81Hって変換されるのは何故なんですか?
エンコードの方法が良く分からないので教えていただけないでしょうか。
- 76 :名無しさん@いっぱいいっぱい :2000/10/16(月) 18:49
- ちょっとスレッドの趣旨とずれるかもしれないんですけど、
端末 → NTマシン → UNIXマシン
という構成で中間のNTサーバで複数の端末から送られてくるファイル
を一括して受け取り。その後UNIXに転送しています。
(転送方法は端末→NT、NT→UNIXともFTPです。)
現在はNTサーバに一時フォルダを設けて、そのフォルダの中身を定期的
に覗いてファイルがあれば転送するプログラムを常駐させているのです
が、これをファイルが転送されて来たのをトリガにしてリアルタイムに
転送する方法は無いのでしょうか?
NTサーバでなくUNIXならばftpの設定をいじくって(inetd.confだっけ?)
転送用のバッチを用意すればよかったと思ったけど、NTはさっぱり分かり
ません。何か参考になるURLだけでもいいですから教えてもらえないでしょ
うか?
- 77 :名無しさん@お腹いっぱい。 :2000/10/16(月) 19:23
- >>76
FindFirstChangeNotification()APIの説明を読んで
適当なプログラムを書くよろし。
俺はスプーラ書くときに必ず使う。
- 78 :名無しさん@お腹いっぱい。 :2000/10/16(月) 20:14
- >75
1) RFC1738を読め
ftp://ftp.iij.ad.jp/pub/RFC/rfc1738.txt
2)
シフトJISにおける全角?のコードは0x8148で、0x48はASCIIのH。
- 79 :名無しさん@いっぱいいっぱい :2000/10/16(月) 20:20
- >77さん
ありがとうございます。
早速調べてみます。
- 80 :名無しさん@お腹いっぱい。 :2000/10/16(月) 20:21
- 自分のパソコンにダイアルアップして外からつなぐことはできますか?
可能でしたら方法をおしえてください。
- 81 :75 :2000/10/16(月) 20:50
- >78さん
有り難うございます。どのrfcを読めば良いのか分からず困ってました。
では、もう少し頑張ってみます。
- 82 :名無しさん@お腹いっぱい。 :2000/10/16(月) 20:57
- 単に、シフトJISが2バイトコードである事と
?の文字コードが0x81で始まる事を知らなかっただけのような気が・・
- 83 :75 :2000/10/16(月) 21:23
- >82
いーえ、知ってたのですが一部の2バイト文字の2バイト目がアルファベットに
変わってるが理解できなかったのです。
あ、ひょっとして2バイト目がアルファベットと同じ場合はそのままで
送るのか。。それだったら俺すっげー間抜けだ。。
- 84 :名無しさん@お腹いっぱい。 :2000/10/17(火) 00:00
- >>83
「アルファベットと同じ場合は」じゃなくて
「ASCII文字だったら」だな。
おっとスラッシュは以下略
- 85 :75 :2000/10/17(火) 00:02
- >78,82,84氏
間抜けな俺に色々有り難う。。あー恥ずかしい。
- 86 :名無しさん@お腹いっぱい。 :2000/10/18(水) 13:29
- >>80
つまり、屋外からノートとか使って自宅マシンの
ファイルをいじったりてことか?
- 87 :80 :2000/10/18(水) 15:39
- >86さん
そうです。
自宅マシンをずっとネットに続けておけば問題ないのですが、
通信料の問題もあるしずっとつなげつづけることは不可能なんで、
屋外からダイアルアップ接続ができれば便利だなと。
- 88 :名無しさん@お腹いっぱい。 :2000/10/18(水) 15:52
- >>87 RASとか使えばできたはずなので、調べれ。Network板のほうが
いい答えが得られると思う。
- 89 :名無しさん@お腹いっぱい。 :2000/10/18(水) 15:59
- フレッツISDNに入ろう
- 90 :80 :2000/10/18(水) 16:55
- >>88さん
どうもです。
RAS…もちょっと勉強が足りんようです。
RAS系のAPI使ったサンプルプログラムさがしてみます。
その前に、家にはモデムしかないけど他に機器を買わないと無理なような…。
- 91 :名無しさん@お腹いっぱい。 :2000/10/18(水) 17:05
- >>80
今目の前にwin98SEがあるけど、
ダイアルアップサーバなるモノが入ってるから、
多分それじゃねぇかな?
- 92 :名無しさん@お腹いっぱい。 :2000/10/18(水) 18:58
- >>90
プログラムすることは必要無いと思うぞ。
Windowsにそういう機能があるって。
あと、モデムでも待ち受けできると思う。
- 93 :80 :2000/10/18(水) 23:25
- >91,92
情報ありがとうございます。
残念ながらwin98を持ってないのですぐには試せそうもないです。
なかなか見つからないですが、
win2kでもつかえるダイアルアップサーバーはないでしょうか。
できればソース込みで。
あと、モデムで待ち受けができるのは初めて知りました。
- 94 :初歩的な疑問 :2000/10/26(木) 17:19
- TCPで接続し、send で、例えば100KB のデータを送信した場合、
受信側の recv の返り値は、100KB に満たない場合があるじゃないですか?
こうなる理由はなぜなんでしょうか?
- 95 :名無しさん@お腹いっぱい。 :2000/10/26(木) 17:30
- それだけじゃなんともいえないが・・・
細い線が間に入ってパケットが分割されたとか、
何らかの原因でパケットが損失して再送してもらってる
とかいろいろ考えられる。
- 96 :名無しさん@お腹いっぱい。 :2000/10/26(木) 22:49
- >>94
recv一発で届いたら、ダウンロードの状況表示がいらないことに気がつきませんか?
- 97 :94 :2000/10/27(金) 12:27
- >96
いまいち意味がよくわからないんですけど、
それは、送信側が(例えば10MBのファイルなんかを)send一発で出す訳じゃないと思うので、当てはまらないんじゃないかと...
- 98 :名無しさん@お腹いっぱい。 :2000/10/27(金) 19:33
- >>94 普通は何回もrecvするんとちゃうの?
- 99 :名無しさん@お腹いっぱい。 :2000/10/27(金) 19:37
- データが全部そろう前にrecvしてるからでしょ。
- 100 :名無しさん@お腹いっぱい。 :2000/10/27(金) 20:18
- httpでレジュームする場合にはどういったコマンドを送ればいいのでしょうか?
- 101 :名無しさん@お腹いっぱい。 :2000/10/27(金) 23:26
- >>97
回線が混んでいて0.1KB/sしか出ないときも、
それがsendで送った最小単位だと思っているのか・・・
TCPとUDPの仕様を混同してるな
- 102 :しろーと :2000/10/28(土) 00:57
- send一発発効したあとは、
各パケットはそれぞれ違うルートを通るんだよね?!
そして中には消失しちまう輩も出るんだよね。
TCPは再送要求するが、UDPはそんなもん無視する。
全部送られるか、タイムオーバーとかして、溜まった所でrecvが成立する。
で、よろしいでしょうか?
- 103 :名無しさん@お腹いっぱい。 :2000/10/28(土) 04:28
- >>102
違う。1回の send が1回の recv で取り出せるという保証はない。
例えばさ、2000 バイトのデータを send する。このとき
(Ethernet なら) 1500 バイトと 500 バイトの 2つの IP
データグラムに分割されて送信されるわけさ。キーワードは MTU。
あと、TCP がいつデータを送信するかは TCP 層が勝手に
決めるのね。1バイトのデータを2回続けて send したら、
2回 IP データグラムが送られるときもあるし、1回に
まとめられる場合もある。
ちうか、W.R.スティーブンスの「ネットワークプログラミング
第2版 vol.1」買え。
>>100
Content-Range.
- 104 :名無しさん@お腹いっぱい。 :2000/10/28(土) 08:49
- TCPってパケット一個ごとに
「届いたよー、次のパケットよろしく」
「あれ?こないよ(変だよ)?、もう一回送ってー」
とかいうやりとりをやってるんじゃなかったっけ?
- 105 :名無しさんi486 :2000/10/28(土) 11:34
- >104
プログラムからはその動作は見えない
パケットサイズ関係なしに連続したデータに見える
- 106 :名無しさん@お腹いっぱい。 :2000/10/28(土) 15:08
- >>104
パケット一個ごとにそんなことをやっていたら致命的に遅くなるぞ
再送要求はシーケンスが連続していなかったときだけ
いい加減なことを言う前にきちんとTCP/IP本を読め
- 107 :名無しさん@お腹いっぱい。 :2000/10/28(土) 17:35
- >106
おまえもよく読め
- 108 :名無しさん@お腹いっぱい。 :2000/10/29(日) 15:08
- LinuxやNT って、最大いくつまでTCPで同時接続できるのでしょうか?
(LinuxやNTがAcceptする場合の話し)
- 109 :名無しさん@お腹いっぱい。 :2000/10/29(日) 16:53
- short型のポートを食いつぶすまで
- 110 :名無しさん@お腹いっぱい。 :2000/10/29(日) 19:16
- >109
理屈はそうだけど、実際問題そんなにつないで動くんでしょうか?
Javaのソケットだと500ポートくらいでいかれ始めるらしいけど。
- 111 :新米ギコ@すぐ出て逝きます :2000/10/30(月) 00:01
- | ∧ チラリ
|Д゚)<ポート食潰すより、衝突の方が困るッス
|⊂ 10000より大でユニークなの選んだはずなんだけどなぁ
| |
| U
- 112 :名無しさん@お腹いっぱい。 :2000/10/30(月) 00:18
- acceptの場合は、空いているポートを自動的に割り当てるので、
予約ポート以外を食いつぶすまでは大丈夫
acceptで生成されたソケットのポートを表示するプログラムを作れば分かります
- 113 :名無しさん@お腹いっぱい。 :2000/11/03(金) 18:43
- ・・・それはクライアント側のポート番号では?
- 114 :名無しさん@お腹いっぱい。 :2000/11/03(金) 22:40
- acceptで新しいポートが割り当てられると思っている人がいるらしい。
TCP/IPの入門書を読んでみよう。
- 115 :名無しさん@お腹いっぱい。 :2000/11/04(土) 14:30
- >>112
それはそーなんでしょうけど、
実際問題として、accept したらプロセスなり、スレッドなり起こして処理する場合は、
プロセスやスレッドの限界が先に来そうな気がします。
- 116 :名無しさん@お腹いっぱい。 :2000/11/04(土) 23:26
- >>113
acceptは受付ソケットが固定のポートを必要とするだけで、
接続が確立されるごとにソケットを作って新しくポートを割り当てています
- 117 :名無しさん@お腹いっぱい。 :2000/11/05(日) 09:35
- 「WinSock2.0プログラミング」(ソフトバンク)によると、非同期モ
ードとマルチスレッドを比較した場合、マルチスレッドはスレッド
の数が増えすぎると、非常に遅くなることがある、と指摘していま
す。
スケーラブルなWinSockサーバーアプリケーションを作成する場合、
非同期処理にするかマルチスレッドにするかの適切な指針というの
はあるのでしょうか?
- 118 :名無しさん@お腹いっぱい。 :2000/11/05(日) 11:10
- > マルチスレッドはスレッドの数が増えすぎると、非常に遅くなることがある、
と、書いてる通り。
だから、コネクションが二桁以上になるようなサーバに関しては、
基本的に非同期にして、ボトルネックになるような重い処理が存在する場合は、
ワーカースレッドをいくつか用意して、リクエスト毎にキューにつめて、
そのスレッド達に処理をさせるような形にすると負荷が分散されて良いと思う。
- 119 :名無しさん@お腹いっぱい。 :2000/11/05(日) 12:15
- OSによっては、ポート食いつぶす前にソケット食いつぶさないか?
- 120 :名無しさん@お腹いっぱい。 :2000/11/05(日) 14:00
- >>108さんへ
どうも、ありがとうございます。
二桁以上ということは、10以上ということですから、スケーラビリティが必要な場合は、
事実上、非同期処理が必須ということですね。
Windows NT/2000での並行処理には、マルチスレッドが高速というイメージがあったので
すが、そんな単純なものではないことがわかりました。
他のレスにもあったI/O完了ポートについても、調べてみます。この場合は、マルチスレ
ッドの同期処理ということになるのでしょうか。ワーカースレッドのキューイングメカ
ニズムを実装するか、I/O完了ポートを使用するべきか、迷うところです。
- 121 :名無しさん@お腹いっぱい。 :2000/11/05(日) 14:02
- >>118
スレッドプールって奴だね。
>>119
ちょっと表現が不適切。ファイルディスクリプタのmaxに引っかかる場合
もあるぞって事ね。limitで拡張できる事もあるが。
Win32はいくつまでだったっけか。
- 122 :名無しさん@お腹いっぱい。 :2000/11/07(火) 00:17
- Winsockを使用してIRCクライアントを作っているのですが
非同期モードにしてると、ひとつのメッセージの処理(JIS<>SJIS変換など)を
している間に、サーバから大量のメッセージが送られてきた場合
処理が終わる前に次のメッセージによってバッファが上書きされて
上手く行かないのですが、どうしたら良いでしょう?
とりあえず、4kバイトくらいのバッファを用意して、そこに転送してから
JIS<>SJIS変換などの処理を行っているんですけど、それでもバッファが
全て埋まってしまう可能性があるわけで・・・。
チャットプログラムについて詳しく解説してあるホームページや
書籍などはないでしょうか?
- 123 :名無しさん@お腹いっぱい。 :2000/11/07(火) 01:14
- >>122
> 処理が終わる前に次のメッセージによってバッファが上書きされて
> 上手く行かないのですが、どうしたら良いでしょう?
TCPなんだったら、処理が終わるまでrecv()しなければ良いと思うんだが…
UDPだったらとりあえず、データをバッファにプールすればいいんじゃないの?
いくら何でも、処理がおっつかないほど大量にデータがくるとは思えないし、
こういう方法でダメなら、構造的に無理だと思うけど。
> チャットプログラムについて詳しく解説してあるホームページや
> 書籍などはないでしょうか?
注文がニッチなので、122がそれを行え。
- 124 :名無しさん@お腹いっぱい。 :2000/11/07(火) 01:40
- 123さん、Resどうもです。
>TCPなんだったら、処理が終わるまでrecv()しなければ良いと思うんだが…
私の理解不足かも知れませんが、非同期の場合、サーバからデータが送られてきたら
現在行われている処理とは別のスレッドのようなものが自動的に作成されて
FD_READ以下の処理が行われてしまう気がするのですが、違いますでしょうか?
プログラムの動作を見ていると、ひとつのメッセージ処理を行っている間に
サーバから他のデータが送られてきた場合、FD_READ以降の処理(recv()など)が
行われているので、自動的にrecv()してしまうのですが・・・。
私自身のプログラムでは、スレッドは作成していないので、WSAAsyncSelectによって
自動的に複数のスレッド(?)が作成されて実行されているように思えます。
かといって、同期処理にしてしまうと、瞬時的に固まってしまって実用的では
ないのです。
- 125 :名無しさん@お腹いっぱい。 :2000/11/07(火) 02:24
- >>124
123じゃないが...
> 現在行われている処理とは別のスレッドのようなものが
> 自動的に作成されて
そんなことはないよ。気になるんなら、それぐらい自分で調べれ。
気になる箇所でGetCurrentThreadIdでも使えばいいだろ。
本当にPrimaryThreadしか動いていないのなら....
>>122
における
> ひとつのメッセージの処理
の中で GetMessage/PeekMessage相当のものが呼ばれるようなことを
やっていないか?要はVisual BasicにおけるDoEvents相当の処理だな。
後は、「自動的にrecvしてしまう」も何も、 recvを呼んでいるのは
どっかの小人さんじゃなくて自分だろ?
ソケットに対応するデータ構造ぐらい用意してるんだろうから、それに
「処理中」のフラグでも加えてやればいいわな。
- 126 :名無しさん@お腹いっぱい。 :2000/11/07(火) 05:22
- >>34
>Win95にwinsock2を安全に入れる方法を発見すればおっけー
これは、発見されていないですよね。
もしかしたら、ムー大陸のように、最初から存在しないのかもしれません。
- 127 :名無しさん :2000/11/07(火) 05:48
- >126
あなたは根本的に最初から間違ってます。
勘違いしていると言った方が正確でしょう。
無理です。
- 128 :名無しさん@お腹いっぱい。 :2000/11/07(火) 12:57
- >125
バッファをスタック(ローカル変数)にとってないでしょ?
- 129 :125 :2000/11/07(火) 13:49
- >>128
何が言いたい?
お爺さんにも分かるように言ってくれ。
- 130 :名無しさん@お腹いっぱい。 :2000/11/07(火) 14:52
- >125
じゃなくて124だ。藁>オレ
バッファをスタックにとれば、バッファの上書きはさけられるだろう。
ちょっとだけ工夫しないとさかさまの順番にメッセージが届いているように
見えるかもしれないけど。
- 131 :名無しさん@お腹いっぱい。 :2000/11/07(火) 15:51
- >>130
そんなことをしなくても受け取らなければ上書きされることはない
- 132 :40 :2000/11/07(火) 16:42
- >>126
>>40に書いたのですがこれではダメなんですか?
だめならその理由も教えてください。
- 133 :名無しさん@お腹いっぱい。 :2000/11/07(火) 17:43
- >>130
なんでスタックなのか知らんが、普通にリストなり標準C++のstringを使えばいいじゃん。
- 134 :名無しさん@お腹いっぱい。 :2000/11/07(火) 18:26
- 途中までいい感じだったのが、とんでもなく低レベルになってる気がする。
バッファ管理、非同期I/O、マルチスレッド、メッセージループ、ウインドウプロシージャ
の関係が理解できていないからうまく作れないのです。>124
- 135 :名無しさん@お腹いっぱい。 :2000/11/07(火) 20:36
- >128
>バッファをスタック(ローカル変数)にとってないでしょ?
ええ、その通りです。なぜ分かったのですか?
バッファをローカル変数にしてやってみます。助言ありがとうございました。
>134
>途中までいい感じだったのが、とんでもなく低レベルになってる気がする。
申し訳ありません、私のせいですか?^^;
134さんの言う通り、
>バッファ管理、非同期I/O、マルチスレッド、メッセージループ、ウインドウプロシージャ
の概念が理解出来ていないのかもしれません。
実は、C/C++とWindows環境でプログラムを組むのはこれが始めてで
以前は、ザイログニーモニックのアセンブラとBASICでプログラムを
組んでいました。
根本的な部分での理解が不足しているのかも知れません。実際、理解に苦しむ部分が多いです。
ただ、昔なら音楽をひとつ鳴らすにも、BGMドライバを作成して、ドライバ専用のデータを
作成するMMLエディタ&コンパイラを作って・・・と大変でしたが
Windows環境では、ほとんどの機能がAPIなどで用意されているので
楽だなあと感じています。始めに覚えることは多くて、慣れませんが。
- 136 :>135 :2000/11/07(火) 21:03
- >楽だなあと感じています。
それなら、楽にこなしてくれ。
組み込み関連やってるなら、すぐわかる問題点だよ。
ウインドウズのイベントドリブンな構造とバッファ制御は、
割り込み制御よりはるかに簡単なはず。
- 137 :名無しさん@お腹いっぱい。 :2000/11/07(火) 21:26
- ソケット関連に16bit時代の悪しきコードを引きずっている
MFCを使っている時点で逝って良し
- 138 :名無しさん@お腹いっぱい。 :2000/11/07(火) 21:37
- WSAAsyncSelect呼ぶとノンブロックモードになっちゃうから、
sendしたら、FD_WRITEもらうまでバッファ開放しちゃだめだよ〜。
- 139 :138 :2000/11/07(火) 21:40
- スタックにバッファ取ってお亡くなりになる馬鹿プログラムは
書かないようにね〜。
- 140 :33 :2000/11/08(水) 05:57
- >>34さんへ
>>127さんへ
>あなたは根本的に最初から間違ってます。
>勘違いしていると言った方が正確でしょう。
>無理です。
勘違いしてるらしいことはわかりました。
34さんのレスには私が理解している以上の含みがあったのでしょう。
恥をしのんで、おたずねしますが、何を勘違いしているのでしょうか?
「無理です」というのは、インストールが無理だということなのでしょ
うか? 全然、わかっていないようです。
- 141 :名無しさん@お腹いっぱい。 :2000/11/08(水) 06:00
- ↑
名前:33は126の間違い
- 142 :名無しさん@お腹いっぱい。 :2000/11/10(金) 13:07
- あげ
- 143 :>138=139 :2000/11/10(金) 15:51
- じゃあ、このプログラムはダメってこと?
http://www.nakka.com/lib/inet/httpcex.html
のHTTPSendRequest関数
- 144 :名無しさん@お腹いっぱい。 :2000/11/10(金) 15:59
- >>143
138じゃないが....
そもそも
sendがWSAEWOULDBLOCKになる場合があるのを全く考慮していない。
ダメダメ。
- 145 :132=40 :2000/11/10(金) 17:31
- >>126 = >>140
重ねてお聞きしますが、Windows95にWinsock2をインストールした後の問題を
解決する方法を >>40 に書いたのですが、この方法に何か問題があるのでしょうか?
ぜひ教えてください。
- 146 :143 :2000/11/10(金) 17:38
- まさかと思ってwwwcのソースも見てみたら、
wwwcもsendがWSAEWOULDBLOCKになる場合があるのを全く考慮していなかった。
- 147 :138 :2000/11/11(土) 02:40
- 忘れた頃にレスがついてる。
結構馬鹿プログラム多いのね。
特にsendの場合運がいいと適当に動いちゃうし、
仮にUAE起こしても、OSの中で起きるから、
作った奴は、「これだから、Windows or WinSock は!」
とか言ってるかもしれない。恥ずかしいねぇ。
- 148 :名無しさん@お腹いっぱい。 :2000/11/11(土) 03:29
- つーか、WSAEWOULDBLOCKは、エラー扱いにしないだろ、普通は。
だから、チェックが入ってなくても全然おかしくない。
sendで返ってきたぶんだけ、送るバッファのポインタをずらすとかするわけだし。
- 149 :>148 :2000/11/11(土) 12:20
- 143のページのsendは、WSAEWOULDBLOCKもエラーにしてるし、
バッファもスタックに取ってる。
NonBlokモードならいつ逝ってもおかしくない。
通常、NonBlockモードでも、socket側のバッファにコピーされるだけだから、
低負荷な状態なら、sendはWSAEWOULDBLOCKを返さない場合も多いだろう。
>だから、チェックが入ってなくても全然おかしくない。
Blokingモードで作ってるつもりなら、別の意味でチェックしたほうがいいだろう。
どこかで、NonBlockに変更されてる可能性がある。
どちらにせよ、WSAEWOULDBLOCKをもらったら、送信が完了するのを待つか、
socketをcloseしない限り、送信バッファも開放できない。
>sendで返ってきたぶんだけ、送るバッファのポインタをずらすとかするわけだし。
ポインタずらして何するのさ。FD_WRITEまで待てよ。
- 150 :>146 :2000/11/11(土) 12:46
- wwwcはNonBlockモード使ってないから別にいいのでは...
- 151 :名無しさん@お腹いっぱい。 :2000/11/11(土) 13:07
- selectで状態を調べれば非ブロッキングって
使う必要性が無いと思うんだけど一般的に何に使うの?
- 152 :名無しさん@お腹いっぱい。 :2000/11/11(土) 13:19
- >>138
漏れはsend成功したらその分のバッファはsocket側が
コピーして勝手に送ってくれるはずなので、即解放してもOKと考えるがどうか?
- 153 :名無しさん@お腹いっぱい。 :2000/11/11(土) 13:20
- >>151 ゲイツ的なメッセージベースのプログラミングに
適合しやすいので使う ヽ(´ー`)ノ
- 154 :148@NonBlocking :2000/11/11(土) 13:25
- >>149
> >sendで返ってきたぶんだけ、送るバッファのポインタをずらすとかするわけだし。
> ポインタずらして何するのさ。FD_WRITEまで待てよ。
だから、今回のsendで送れた分だけずらして、次のFD_WRITEを
待つんだよ。
あと考えてみたが、WSAEWOULDBLOCKをチェックしないと、
sendできなかったのがfatalエラーなのか、混んでるだけなのか
わかんないからやっぱチェックせんといかんな。
- 155 :>150 :2000/11/11(土) 14:56
- wwwcとは、143の http://www.nakka.com/lib/inet/httpcex.html の事?
SDKにはこう書いてある。↓
The WSAAsyncSelect function automatically sets socket s to nonblocking mode,
WSAAsyncSelect を使うと自動的にNonBlocking Modeになるようですが。
BlockingModeで使うなら、BlockingModeに戻さないといかんのじゃないの?
- 156 :>152 :2000/11/11(土) 15:00
- >漏れはsend成功したらその分のバッファはsocket側が
>コピーして勝手に送ってくれるはずなので、即解放してもOKと考えるがどうか?
そりゃ、成功したなら即開放していいでしょ。
問題は、WSAEWOULDBLOCKになった場合のことでしょ?
- 157 :名無しさん@お腹いっぱい。 :2000/11/11(土) 15:11
- 138じゃないが...
>>152
138はsendがEWOULDBLOCKにより「失敗」した場合のことを書いているように
見えるのだが。
send --> EWOULDBLOCK --> FD_WRITE --> send(再送)
>>154
> 今回のsendで送れた分だけずらして、次のFD_WRITEを待つ
も何も、sendが正常終了したのなら、待ったところでFD_WRITEは来ないぞ。
accept/connect後のFD_WRITEはともかく、それ以外のFD_WRITEは、
一旦pendingの状態になっていたsendに対するものと思え。
> あと考えてみたが
今までどんな恐ろしいモノを顧客に納めてきたかは聞かないことにするよ。
- 158 :157 :2000/11/11(土) 15:13
- かぶっちまった
スマソ
- 159 :名無しさん@お腹いっぱい。 :2000/11/11(土) 15:21
- そういえば、EWOULDBLOCKでソケットが切れるプログラムを納品してきた奴が
いたような記憶が。へたれは多い・・・
- 160 :154 :2000/11/11(土) 15:34
- >>157
>> 今回のsendで送れた分だけずらして、次のFD_WRITEを待つ
> も何も、sendが正常終了したのなら、待ったところでFD_WRITEは来ないぞ。
送るデータがバンバンにあるんだよ。
送りたい分全部おくれたらFD_WRITE待たないよ。
> 今までどんな恐ろしいモノを顧客に納めてきたかは聞かないことにするよ。
随分前にやったことなので、あんまり覚えてなかったんだよ。
sendっが0返したときがいっぱいでそれがブロックだっけ?
っていう風な記憶になってた。
いっぱいだとsend()でSOCKET_ERRORがかえって、
WSAGetLastErrorでWSAEWOULDBLOCKになるのを確認して、
FD_WRITEを待つんだよな。
ちゃんとそう作ったから安心すれ ヽ(´ー`)ノ
- 161 :152 :2000/11/11(土) 15:41
- >>156
そうか、ブロックになったときの話だったのか。
そりゃ、送れてないんだから解放したらだめなのは当たり前だな。
- 162 :>157,160 :2000/11/11(土) 18:06
- send、connectが、pending中以外は、ずーっと、FD_WRITEは、帰ってくる
FD_WRITEは、送信完了じゃなくって、送信可能を示す。
だから、送信成功後に、FD_WRITEを待ってもなんら問題ない。
- 163 :名無しさん@お腹いっぱい。 :2000/11/11(土) 18:11
- しかし、みんな、nonblockingでソケット操作するプログラム
作って事ないじゃないの?
- 164 :160 :2000/11/11(土) 19:51
- >>162
> だから、送信成功後に、FD_WRITEを待ってもなんら問題ない。
漏れが作ってたのはFTPだから、送ったら終いよ。即closeする毛
- 165 :名無しさん@お腹いっぱい。 :2000/11/11(土) 19:53
- > send、connectが、pending中以外は、ずーっと、FD_WRITEは、帰ってくる
んな馬鹿なことがあるか。
acceptやconnect直後か、sendがブロックからsend可能になった
時だけだろ。
- 166 :>165 :2000/11/11(土) 20:54
- すまん書き方が悪かった。
クライアントソケットなら、connect後の送信可能な場合。
サーバーソケットなら、acceptしたソケットが送信可能な場合だな。
selectすれば、すぐにFD_WRITEが返ってくるってことだ。
157,160は
>FD_WRITEは、送信完了じゃなくって、送信可能を示す。
ってところを勘違いしてるようだからな。
- 167 :>164 :2000/11/11(土) 20:56
- >漏れが作ってたのはFTPだから、送ったら終いよ。即closeする毛
コントロールポートはどうしてるんだ?
それに、そのFTP(サーバーか?)は一回のsendですべて送信してしまうのか?
不可解だ。
- 168 :名無しさん@お腹いっぱい。 :2000/11/11(土) 21:03
- >>166
????
WSAAsyncSelectを使っているのにselectを使うのか?
何のために?
- 169 :>168 :2000/11/11(土) 21:40
- selectは、FD_WRITEの発生する例なんだが。
ちなみに、WindowプログラムでもWSAAsyncSelectなんて使わないで、
selectを使用してソケットプログラミングは出来るよ。
というか、WSAAsyncSelect遅延が大きいから、俺は使わないけど。
- 170 :名無しさん@お腹いっぱい。 :2000/11/11(土) 21:49
- はァ???
ずーっとWSAAsyncSelectを使った非同期ソケットプログラミングの
話をやってたのに、自分だけバークレイ方式での非同期ソケットに
関する話を強引にやってた訳ね。で、あんたの言ってるFD_WRITE
とかは、要するにwrite_fdがSETされた、ってことな訳か。
この親父何訳わがんねこと言ってんのかと思ったよ。
- 171 :>170 :2000/11/11(土) 22:12
- WSAAsyncSelectを前提にしても別に構わんのだが、
非同期ソケットだからといって、WSAAsyncSelectは必須ではないんだよ。
WSAAsyncSelectのために非同期ソケットにするわけじゃないんだから。
俺がWSAAsyncSelectを使わないってのは、まったくの余談の付け足しで、
selectを例としたことと関係ないんだけどね。
それに、BSD互換ソケットでも、winsockでもFD_WRITEの考え方は、同じだよ。
selectを例にだしたのは、一番理解しやすいだろうからだが。
>この親父何訳わがんねこと言ってんのかと思ったよ。
それは、あなたの理解力が低いからだね。
困った困った。(藁
- 172 :170 :2000/11/11(土) 22:38
- 偉そうなことを言うぐらいなら
そういういい加減な書き方止めろよ。仮にも技術者なんだからな。
そして、理解されないことを他人の理解力のせいにするな。
それで良くこの仕事をやってこれたな。
> 非同期ソケットだからといって、WSAAsyncSelectは必須ではないんだよ。
WSAAsyncSelectの話をしているのに、「非同期ソケット」一般の
話を急に持ち込むな。そうするなら明示しろ。
> BSD互換ソケットでも、winsockでもFD_WRITEの考え方は、同じだよ。
「考え方」が同じだからといって、同じ用語を説明もなしに使うな。
無説明にFD_WRITEと言ったら、普通はWSAASyncSelectのソケットイベント
のことだと思うぞ。お前は本気でBerkeleyの世界で「FD_WRITE」という
という用語を使っているのか?
- 173 :>172 :2000/11/11(土) 23:01
- なんで、そんなことでむきになるの?
かるしうむ不足なんじゃないかなぁ?
私は最初から、WSAAsyncSelectの話に限定なんかしてないんだが。
もともと、nonbockモードでのsendの話だったはずだけどなぁ。
まぁ、言葉足らずだったら、謝るからさ。怒ってないで仲良くやろうよ。
でもね、
>> BSD互換ソケットでも、winsockでもFD_WRITEの考え方は、同じだよ。
>「考え方」が同じだからといって、同じ用語を説明もなしに使うな。
FD_WRITEは、WSAASyncSelectでもselectでもpollでもWSAEventSelectでも
みんな意味は同じなんだけど。
>無説明にFD_WRITEと言ったら、普通はWSAASyncSelectのソケットイベント
>のことだと思うぞ。
普通思わないんじゃないかな。まぁ、話の流れから、あなたがそう思ったなら、
言葉足らずだったのでしょうね。ごめんね。
>お前は本気でBerkeleyの世界で「FD_WRITE」という
>という用語を使っているのか?
うーん、Berkeleyの世界といのが良くわからないんだけど。
BSDより、SVR4ばっかりだったから。BSD互換の世界ばかりだね。
- 174 :名無しさん@お腹いっぱい。 :2000/11/12(日) 00:31
- 172ではないけど、Win系知らないUnix屋にFD_WRITEなんて言っても通じない
と思うぞ。WinSock用語なんだから。
- 175 :174 :2000/11/12(日) 00:42
- 今読み直したけど、やっぱ173が「FD_WRITE」と書いたせいで話を混乱
させただけに見えるな。まぁタイプ量少なくて書くには便利かもしれん
けど、俺も
>無説明にFD_WRITEと言ったら、普通はWSAASyncSelectのソケットイベント
>のことだと思うぞ。
と思うな。
- 176 :>174 :2000/11/12(日) 00:58
- 確かに、そりゃそうだ。
でも、WinSock用語でとりあえず通じてるみたいじゃん。
- 177 :170 :2000/11/12(日) 01:45
- >>173
仲良くなりたいんなら
> それは、あなたの理解力が低いからだね。困った困った。(藁
なんて言わないことだな。
お前自分の非を認められないタイプだな?(苦笑)
本当は、それまでの話の流れでWSAAsyncSelectの話をしていたのに
気づかず間抜けな書込みをしただけだって正直に言えよ。
166ぐらいで「勘違いだった」って言えばそれで話は終わったんだよ。
> FD_WRITEは、WSAASyncSelectでもselectでもpollでもWSAEventSelectでも
> みんな意味は同じなんだけど。
じゃあ、"FD_WRITE"を文字通りに使った例見せてみ。 selectでいいぞ。
>>174
通じてねえから164/165みたいなことになったんだろ。
- 178 :名無しさん@お腹いっぱい。 :2000/11/12(日) 01:57
- すまん最後のは
>>176
だった。
- 179 :名無しさん@お腹いっぱい。 :2000/11/12(日) 02:34
- >175
ああ、そういう事か、言われてみれば、selectとpollにFD_WRITEはないな。
これは、確かに誤解を招くね。
>177
そういうことで噛み付いてるとは、まったく気づかなかったよ
意地悪だねぇ。最初から、そう言えばいいじゃない。
- 180 :170 :2000/11/12(日) 04:14
- >>179
なんかどっと疲れが.....
だったら
> FD_WRITEは、WSAASyncSelectでもselectでもpollでもWSAEventSelectでも
> みんな意味は同じなんだけど。
> >無説明にFD_WRITEと言ったら、普通はWSAASyncSelectのソケットイベント
> >のことだと思うぞ。
> 普通思わないんじゃないかな。まぁ、話の流れから、あなたがそう思ったなら、
> 言葉足らずだったのでしょうね。ごめんね。
とか大嘘書くんじゃねえ。
「言われてみれば」とか言ってる場合じゃねえだろ。
- 181 :名無しさん@お腹いっぱい。 :2000/11/12(日) 05:57
- 「誤解をまねく」か… べんりないいようだこと。
- 182 :126=140 :2000/11/12(日) 08:26
- >40=132=145さんへ
40の回答が34に対するものだということを見過ごしていました。
132は数字しかなかったので、自分あてのものだということに気
づかなかったのです。
せっかく、書き込んでくれているのにもうしわけありません。
安全にインストールするという意味で、40=132=145さんの答えで
いいのだと思います。知りませんでした。有益な情報をありがと
うございます。
ただ、アプリケーションを配布する上で、ユーザーに対してモジ
ュールをダウンロードしろといえない場合もあります。そのとき
に自分が提供するインストーラで安定してインストールさせるこ
とができないならば、Winsock2.0を使えないことがあるのです。
ただ、Windows 95はじょじょにマイナーなOSになりつつあり、ま
た、古いのだから、新しいアプリケーションに対応するためにダ
ウンロードしろ、といえる環境になりつつあります。
もっとも、ダイヤルアップ ネットワーク 1.3 が安全にWinsock2.
0をインストールさせることができるならば、インストーラで確実
にインストールさせることはできるはずです。
ただ、うちの場合、ActiveXコントロールと一緒にWebベースでイン
ストールさせないといけない場合も多いので、やはり、むずかしそ
うです。
- 183 :174 :2000/11/12(日) 10:52
- 最後まで見苦しい奴だったな>>179
- 184 :名無しさん@お腹いっぱい。 :2000/11/12(日) 16:40
- じゃあ、別の話題に行ってもいいですか?
ソケット(TCP)で通信する場合の通信フォーマット(可変長電文)を決める時って、みなさんどうされてます?
データの最後を判別する場合、
1.バイナリデータで、ヘッダーにサイズを入れる。
2.アスキーコードにして、NULLとか改行コードで電文の最後を判別。
3.その他
あと、ACK(というか応答電文)みたいなものは用意しますか?
- 185 :>184 :2000/11/12(日) 18:08
- >1.バイナリデータで、ヘッダーにサイズを入れる。
ヘッダーと言うか、先頭にデータ長入れるけど。
バイナリデータはこうしないと確実な区切りを識別させるには、
もっと面倒なことするか、ソケット切るしかなくなるから。
>あと、ACK(というか応答電文)みたいなものは用意しますか?
さらに上位のハンドシェークを入れるるのは、なんだかなと・・・
たまに見かけますが。
- 186 :名無しさん@お腹いっぱい。 :2000/11/12(日) 18:42
- プロトコルに関してはその時次第というか。
簡単なのだったらPOP3みたいに全部テキストで\n区切りにするとか。
# telnetでdebugできて便利。security的には駄目だが
ACK/NAKの仕組みは必要でしょ。
- 187 :186 :2000/11/12(日) 19:00
- >>185
おいおい。いくらTCPでパケットロストが無いことが保証されてても、相手が
ちゃんとrecv()して送り側の電文を処理したかどうかは上位(APレベル)
プロトコルで確認するしかないだろ。それが冗長だと言うなら、既存プロト
コル(POP3, NNTP, FTP, and etc...)もみんな冗長かい。
- 188 :186 :2000/11/12(日) 19:05
- あ、もちろん相手が処理してようがしてまいが構わない、というデータの
場合は、必ずしも応答返す必要はないけどね。
# 処理状態報告とか。まぁそれだったらそもそもUDPでいいじゃんて話
# もあるけれど
- 189 :>187 :2000/11/12(日) 19:42
- ACK,NAK見たいな、データ確認手順はいくらなんでもいらんだろってことなんだけど。
>>186の処理状態報告という同じ意味なんだけどね。
pop3,nntpのようなアプリケーションプロトコルは、取り決めしなきゃ、
データのやり取りできないから当然必要ですよね。<いくらなんでも、これなしに通信が成立しない。
参考までに、知ってるとは思うけど、ftpのデータ転送はソケットが繋がったら、
ハンドシェーク無しで転送して送り終わるとソケットを切るだけの仕様になっています。
途中にACK/NAKのようなデータ確認手順はありませんよ。
- 190 :184 :2000/11/12(日) 20:22
- >>185
>>186
日曜日なのにわざわざレス有り難う御座います。m(")m
結局、ACK/NAK(相当?)の必要性は、システムポリシーに依存する訳でしょうね。
テキストかバイナリか、については如何でしょうか?
確かに telnet で debugできるのは良いのですが、データ量があるので辛いかも...
あと、個人的には、改行区切りとかだと改行が来るまで1バイトハンドリングしなきゃならない。っていうのが
COMポートみたいで、なんだかな〜。と思ったりもします。
- 191 :>190 :2000/11/12(日) 20:43
- 扱うデータがテキストなら、テキストでもベースで制御しても
いいかもしれませんが、扱うデータにバイナリが含まれる場合は、
テキストベースで制御するのは、それなりに、面倒な処理が必要になります。
汎用な手順を考えていないなら、[データ長][データ]の形式で処理してやる方が、
簡単でしょう。
- 192 :名無しさん@お腹いっぱい。 :2000/11/12(日) 21:24
- >>190
> 改行区切りとかだと改行が来るまで1バイトハンドリングしなきゃならない
UNIXならfdopenしておいてfgetsで読むのが普通では?効率も悪くない。
winsockならMSG_PEEK指定でのrecvで改行位置をチェックしてから本読み込み
やるのが比較的マシと思う。
- 193 :190 :2000/11/13(月) 17:56
- >>191
元はバイナリなので、テキストでやるとしたらなんらかの手段(Base64とか単純にアスキーコードに変換とか)で、
変換する予定でいます。
>>192
>UNIXならfdopenしておいてfgetsで読むのが普通では?効率も悪くない。
ソケットでfgetsって使ったことないんですけど、データ(改行)が到着する以前に、fgets を使っても大丈夫なもんなんですかね?
- 194 :192 :2000/11/13(月) 18:50
- >>193
「大丈夫」とは?
fgetsを使う場合は、ソケットはブロッキングモード、
タイムアウト監視はalarm()で、というのが普通と思う。
無論この場合は、改行前にfgetsを呼んでも単に
ブロックするだけ。
非同期モードの場合には、そもそもfgetsを使うべき
ではないだろう。
- 195 :193 :2000/11/13(月) 19:23
- >>194
>無論この場合は、改行前にfgetsを呼んでも単に
>ブロックするだけ。
ああ、なるほど、そういう方法もあるんですね。実はブロッキングモードって使ったことなかったもんで。
失礼致しました。(ちなみにOSはLinuxです)
- 196 :>193 :2000/11/13(月) 21:45
- >元はバイナリなので、テキストでやるとしたらなんらかの手段(Base64とか単純にアスキーコードに変換とか)で、
>変換する予定でいます。
通信量と要求される性能の問題だと思うけど、
8Bitコードを通せないとか特別な理由が無いなら、
非常に資源の無駄遣いじゃない?
base64でエンコードすると、およそデータ量は1.5倍ぐらいになるよ。
- 197 :名無しさん@お腹いっぱい。 :2000/11/14(火) 11:09
- >>193
コマンドはテキスト。データはバイナリでいいんじゃ
ねーの?俺はそういう作りにしてるけど。って言うか
普通そうするよね?
- 198 :193=184 :2000/11/14(火) 12:24
- >>196
個人的にはバイナリデータ希望なんですけど、(プロジェクト内の)人それぞれ考えが違うので...
(最初の質問= >>184 の意図は)バイナリデータにする為の説得材料を収集したかったといいますか...
>>197
コマンドっていうのは、POP3 で言えば、STAT とかのことですね?
で、返ってくるデータはバイナリ。
という意味ですかね?
- 199 :197 :2000/11/14(火) 16:47
- >>198
俺がサーバー組む時のパターンだと、コマンドと
リザルトはテキスト。POPの某云々の解釈でOK。
で、バイナリデータの送受信は、ファイルのアッ
プロード/ダウンロードで実装するので、そこだ
けがバイナリデータ。例えばアップロードは
→UPLOAD:"パス名",ファイルサイズ
←RESLUT:OK
→バイナリデータ
←RESULT:OK,受信したサイズ
みたいに。バイナリデータは4096バイトずつ
のパケットでぐるぐるループして送る。
構造体みたいなモンをやり取りする場合は、その
構造体をテキストに変換するんだけど、それも可
読可能な方式にエンコードする。time_t型のデー
タなんかもYYYY/MM/DD,hh:mm:ssにするとか、定数
は#defineで定義したまんまの文字列に…とか。
あと、日本語の漢字コードや改行コードの変換も
エンコーダがサーバ上の形式に変換する。
だから、コマンドやエンコーダ/デコーダが構造
体の種類毎に必要なのがちょいとアレかもな。
サーバとクライアントのエンディアンやワード長
が同じなら、バイナリで送ってもいいかもな。
- 200 :198 :2000/11/14(火) 19:41
- >>199
了解致しました。長文有り難う御座いました。m(")m
- 201 :>199 :2000/11/14(火) 20:05
- 性能悪そうなだね。
- 202 :名無しさん@お腹いっぱい。 :2000/11/14(火) 22:33
- >>201
199のプロトコルで1日中がんがん回すとかなら、性能的にもうちっと考えた
方がいいだろうけど、ワンショット送る位なら気にするほどでもないんじゃ
ない?
# データ形式やプロトコルは用途に合わせて選択しよー
- 203 :WinSNMP :2000/11/14(火) 22:48
- WinSNMPについて詳しい資料が見当たらない。
どなたか詳しく解説してある本やホームページがありましたら、
教えてください。
とりあえずTrapが打ちたい…( ゚Д゚)
- 204 :>202 :2000/11/14(火) 23:55
- つーか、198がどんな使い方をしたいのか不明だから、
パフォーマンスを出しにくいことは、触れておくべきだろう。
双方向で、ガシガシ転送するのかも知れんし。
># データ形式やプロトコルは用途に合わせて選択しよー
それは、当然だろう。プロトコルに限らんが。
- 205 :名無しさん@お腹いっぱい。 :2000/11/15(水) 03:04
- 構造体の送信はマシンやOSが同じならそのまま送ったほうがいいんだろうけど、
違うなら文字列に変換して送ったほうが無難
- 206 :たおる :2000/11/15(水) 03:15
- だれかgnutellaのプロトコルを解説した日本語サイト知らない?
あれ、簡単だと思うから、簡単にでもいいから解説のあるとこ
教えて欲しいんだけど。
- 207 :199 :2000/11/15(水) 11:34
- >>205
まさに、異OS、異アーキテクチャ混在なんで
パフォーマンス出ないのは承知でこんな仕様
なんだな。
クライアントだけでなく、サーバも同じく、
異OS、異アーキテクチャ混在だし。
- 208 :>207 :2000/11/15(水) 13:24
- エンディアンが問題であれば、ntohs,htonsで変換すればいいだけじゃん。
つーか、通信上は、ビッグエンディアンに統一するのが常識。
>異OS、異アーキテクチャ
そんこと当然として仕様は決めるもんだ。
バイナリ通信だからアーキテクチャ依存だなんてことはない。
送ったデータがアーキテクチャ依存のデータなら、文字列変換したところで、
元に戻せば、やはりアーキテクチャ依存のデータにしかならんだろ。
- 209 :名無しさん@お腹いっぱい。 :2000/11/15(水) 13:29
- つーか、コマンドラインインターフェース的なやり取りにする理由は、
キャプチャ取ったりした場合に解析しやすいとか、
tnでつついて、デバッグ出来るとか、そんなことだろ。
デバッグしやすい以外の理由はないと思うが。
- 210 :名無しさん@お腹いっぱい。 :2000/11/15(水) 14:23
- >>208
問題になるのはエンディアンだけではないだろう。
構造体を直接送るとなると、当然ワード長の違いやpaddingの問題があるし、
何より浮動小数点数のメンバがあったりすると論外だ。
- 211 :名無しさん@お腹いっぱい。 :2000/11/15(水) 14:28
- 今の流行はXMLで数値も文字列に変換して受け渡すやり方です。
- 212 :>210 :2000/11/15(水) 15:18
- >構造体を直接送るとなると、当然ワード長の違いやpaddingの問題があるし、
そんなものそのまんま送るほうが馬鹿。
たまに、こういう事して隙間だらけのパケットを送ってくる奴がありますが、
はっきり言って笑いものにされます。
ちゃんとパケットフォーマット決めて送りなさいって。
逆を言えばただそれだけのことじゃん。
- 213 :???? :2000/11/15(水) 23:17
- Xlibは構造体そのまま送ってるぜ。あれは馬鹿か?
- 214 :>213 :2000/11/16(木) 01:12
- >異OS、異アーキテクチャ
で通信したいのに
>構造体を直接送るとなると、当然ワード長の違いやpaddingの問題があるし、
を
>そんなものそのまんま送るほうが馬鹿。
ってことだろ。
- 215 :名無しさん@お腹いっぱい。 :2000/11/16(木) 02:28
- X プロトコルは
> 異OS、異アーキテクチャ
を前提としているんでないの?
いや、213 の言ってることは初耳なんだけど、ほんと?
詳細解説希望。
- 216 :213 :2000/11/16(木) 11:08
- 数年前ソースを調べた限りではそうなっていた。今どうなってるかは知らない。
詳細はソースを見てほしいけど、Xプロトコルのレコードそのものを
構造体に対応させている。アーキテクチャによっては直接実現不可能な
場合があり、その場合はビットフィールドを使って逃げている。
エンディアンが違っている場合は受信後にSWAPする。
非常に苦しい処理だけど、処理速度を最優先するとこうするしかない。
- 217 :>216 :2000/11/16(木) 11:51
- それは、通信上のフォーマットが規定されていないって事になるの?
性能のためアーキテクチャ依存する仕様だと言うことになるのかな?
しかし、異なるアーキテクチャでも変換することによって、通信可能な
訳だよね?どうやって情報を得ているの?
バウンダリする場合の規定とかを事前にネゴしてるんじゃない?
事前の設定でもいいんだけど。そうでもしなきゃ通信不能だよね。
そういう約束で動いてるのなら、構造体送信してもなんら問題ない
事だと思うけど。
212の言ってる馬鹿は、そういう約束事無しにそのまんま構造体を送信した場合のことでしょ。
- 218 :213 :2000/11/16(木) 14:45
- もちろん規定されてる。だから構造体を無理矢理合わせている。
エンディアンだけはどうにもならないが、Xプロトコルでは最初に
エンディアンの種別を通知するようになっている。変換が必要なら
受信側でエンディアンの変換する。サーバーとクライアントが同じ
アーキテクチャなら変換不要なので、エンディアンを規定して
しまう方法よりも効率が良い。
>212の言ってる馬鹿は、そういう約束事無しに...
よく見るとそうだなあ。煽ってすまん。
- 219 :名無しさん@お腹いっぱい。 :2000/11/16(木) 15:35
- ちょっと、関連で質問ですが、
VC++だた、pragmaで構造体のアラインを指定できますよね。
GCCその他のコンパイラでは同なんでしょう?
何年か前に、Solalisでパケットフォーマットの構造体きるのに、
char配列で全部作ったことがあるんだけど、あまりにしんどいから。
- 220 :名無しさん@お腹いっぱい。 :2000/11/16(木) 17:31
- >>219
info gcc
- 221 :名無しさん@お腹いっぱい。 :2000/11/19(日) 23:17
- age
- 222 :名無しさん@お腹いっぱい。 :2000/11/23(木) 18:40
- 定期上げ
- 223 :名無しさん@お腹いっぱい。 :2000/11/24(金) 17:51
- IRCクライアント作ろうと思うんだけど、
参考になるようなソースが公開されてるクライアントってあるのかな?
- 224 :名無しさん@localhost :2000/11/24(金) 17:56
- >>223
Unix向けのものはごく一部を除いて公開されてる。
http://www.irc.org/ あたりが良いのでは。
- 225 :223 :2000/11/24(金) 17:59
- なるほど。ありがとう、見に行ってみます。
もしwindowsのC++とかで書かれてるのがあったらそっちの方がいいけど、
贅沢もいってられないか・・・。
- 226 :名無しさん@お腹いっぱい。 :2000/11/24(金) 19:41
- >何年か前に、Solalisでパケットフォーマットの構造体きるのに、
>char配列で全部作ったことがあるんだけど、あまりにしんどいから。
共用体つかえばどうよ?
- 227 :名無しさん@お腹いっぱい。 :2000/11/26(日) 11:48
- 定期あげ
- 228 :>226 :2000/11/26(日) 12:00
- struct packet {
union {
char c[2];
short s;
} u;
long data;
};
とした場合、dataは構造体先頭から3バイト目になりそうな気がしないんだけど。
- 229 :名無しさん@お腹いっぱい。 :2000/11/26(日) 17:42
- >226
そんな簡単な事うだうだ考えるより確かめてみそ。
ただし、structのパディングは環境によって違うらしいから
妙な技使わないように。
- 230 :> :2000/11/26(日) 20:54
- そういう構造体はcharの配列とアクセスのための関数を作るのが
一番簡単だと思うが‥C++ならクラス化してしまえば安全だろうし‥
なぜにそんなくらいをめんどくさがる?
もしかしてメンバが2万個くらいあるのか?
- 231 :名称未設定 :2000/11/27(月) 00:02
- WinSockについての質問です。
非ブロッキングソケットのconnectをselectで待っていて、
connectできなかったときexceptfdsにそのソケットが入ってきますが、
そのときのエラーコードってどうやって調べるんでしょうか?
WSAGetLastError()では0が返ってきちゃいます…。
- 232 :名無しさん@お腹いっぱい。 :2000/11/27(月) 13:37
- >>231
以下MSDNのselect()のヘルプからの抜粋。
If a socket is processing a connect call (nonblocking),
failure of the connect attempt is indicated in exceptfds
(application must then call getsockopt SO_ERROR to determine
the error value to describe why the failure occurred).
- 233 :232 :2000/11/27(月) 13:53
- ううむ。今ちょっと試してみたけどgetsockoptでも
optvalとして0が返ってくるね。
- 234 :231 :2000/11/28(火) 00:22
- > 232
サンクスです。できました。10061(WSAECONNREFUSED)が
返ってきました。
けど233はなんででしょうね…。
- 235 :232 :2000/11/28(火) 19:39
- >>234
何故かといえば、とある関数に0x101を渡してテストしたからなのであった。
(WinSock2以降でしか↑の方法は使えないってことやね)
- 236 :あげ :2000/11/29(水) 15:45
- >>235
とある関数ってWSAStartupじゃないの?
- 237 :名無しさん@お腹いっぱい。 :2000/11/29(水) 19:46
- 非ブロッキングソケットで
複数接続可のサーバープログラム
(プロトコル:TCP、開発環境:VC++6.0、WinSock Versiion1.1、クライアント別の処理はSelect()で切り分け)
を組みたいのですが
接続してきたクライアント毎のタイムアウト設定の方法は
何か決まりきった手法はあるのでしょうか?
また、良いアイデアなどあったらよろしくお願いします
私は下の力技しか思い付きませんでした・・・
Accept()の時点でクライアント毎のタイムアウトのカウンタを生成(300秒とか)して
Selectの直前でタイマはってSelect直後でカウンタから減算
カウンタが0以下になったらshutdown()
データ処理があったらカウンタをリセット
- 238 :名無しさん@お腹いっぱい。 :2000/11/29(水) 21:41
- >>237
selectにタイムアウトの指定がモロにあるだろう
何で使わないんだ?
- 239 :名無しさん@お腹いっぱい。 :2000/11/29(水) 23:00
- >>237
以下は別に「決まりきった方法」という訳じゃないが...
1. connect/入出力発生時に、「次のタイムアウト時刻」を計算してそれを
保持しておき、タイムアウトチェック時は単にそれと現在時刻を比較する
ことにすれば、カウンタ管理などは要らない。
2. タイムアウト管理情報をキューの形で保持し、先頭の方からチェックして
いくことにより、毎回全ソケットに対してタイムアウトのチェックを行う
必要がなくなる。ただしこれは、「任意の場所からの削除」が行えなければ
ならないので、厳密にはキューではない。
>>238
シングルスレッドのサーバで、複数のsocketを1度のselectで同時監視するから
だろ、どう考えても。
- 240 :237 :2000/11/30(木) 12:18
- >>239
早速のレスありがとうございます
今のところクライアント数はそれほど多くは考えていないので
1.の方法で行こうと思います
ただ、クライアント数が増えると厳しいので
2.の方法をキュー管理スレッドを1個立ててやっても良いかな
と思っています(シングルだとselect()のタイムアウト値に絡んでくるから・・・)
ただ、select()、rcve()、send()、shutdown()、close()などの処理中に
別スレッドからshutdown()した時の動作が確実なのか?(タイミングの問題)が
疑問なのでそれらを調べてからやってみます
- 241 :>240 :2000/12/01(金) 02:49
- >別スレッドからshutdown()した時の動作が確実なのか?(タイミングの問題)が
>疑問なのでそれらを調べてからやってみます
そういう時は、クリティカルセクションやミューテックス等で同期を取りましょう。
全ての条件での動作の検証は、現実的に不可能です。
- 242 :名無しさん@お腹いっぱい。 :2000/12/01(金) 13:49
- >>237
Winsock1.1ということだが、
setsockopt SO_SNDTIMEO
setsockopt SO_RCVTIMEO
は使えるのだろうか。これが使えればソケット毎にタイムアウト値を
設定できるので、↑のような苦労は一切不要になる。
試してみては。
- 243 :名無しさん@お腹いっぱい。 :2000/12/01(金) 13:51
- 確かSO_SNDTIMEOやSO_RCVTIMEOはWinsock1.1では使えなかったと記憶してるが・・・
- 244 :242 :2000/12/01(金) 14:16
- >>243
うんMSDNのsetsockoptのヘルプには「Version2でサポート」
と書いてあった。
のに、WSAStartupでバージョン1.1を指定しても使えた。
厨房で赤ちゃんでドキュソな僕ちんにはWinsockは良く分かりまへん。
- 245 :242 :2000/12/01(金) 14:47
- >>237
まあでも良く考えたらブロッキングモードでないと意味が無い
ものだから、忘れてくれい。
- 246 :名無しさん@お腹いっぱい。 :2000/12/02(土) 01:18
- Winsock1.1、2.0両方で起こるんだけど、
ノンブロックのクライアントソケットで、
connectしたときに、sinがリトライすると、
サーバー側が遅れてsinを返してもconnectが、
タイムオーバーで失敗するんです。
うまく回避した人いたら、回避方法教えてください。
私は、ブロッキングモードに書き直して納品に間に合わせたんだけど、
なんだか気持ち悪いんで。
- 247 :名無しさん@お腹いっぱい。 :2000/12/02(土) 21:36
- > 246
sinとは3ウェイハンドシェークでいうところのSYNのことですかな?
SYNがリトライするとはどういうこと?
ノンブロッキングソケットでconnectしたらselect()かWSAAsyncSelect()で
完了を待たないとだめっすよ。
- 248 :246>247 :2000/12/03(日) 00:28
- あれ?synだったか?どちらにせよ、
>connectしたらselect()かWSAAsyncSelect()で
は、話が噛み合ってません。
具体的には以下のような動作をした場合TCPプロトコル上は、
接続されてるにも関わらずconnectがエラー(無論selectで)
検知するということです。
Client Server
1 sin ->
2 sin ->
3 sin ->
4 <- sin
ダイアルアップルーターなどを使用した場合、
最初のsinでダイアル開始する為、この事象が発生します。
- 249 :246>247 :2000/12/03(日) 00:59
- synが正しいですね。
ずっと、sinだと思い込んでいました。(恥
- 250 :名無しさん@お腹いっぱい。 :2000/12/04(月) 18:51
- たしか、connect()はノンブロッキングにしても
タイムアウトを縮めることはできても
伸ばすことはできないと記憶してます
でも、ブロッキングモードで問題が無いならそういうわけでもなさそうですね・・・
- 251 :246 :2000/12/04(月) 20:25
- 1から3までのSYNのシーケンス番号は同一で(再送ですから当然ですが)
4のサーバー側からのSYNを受信しても、connectは完了しているはずなんですが、
selectは暫く終わらず、動作としては、SYNを受信できなかったような、
動きにをするんですよ。早い話が、Winsockのバグだと思うんですけどね。
逆にこういうやり方なら問題なかったとか、知りたいんですよ。
- 252 :名無しさん@お腹いっぱい。 :2000/12/04(月) 21:55
- Winsockのselect()はBSDのそれとは違うらしいのでそれが原因では?
WSAAsyncSelect()でもおんなじなんですか?
- 253 :246>252 :2000/12/04(月) 23:51
- プログラム構造上ウインドウを持たないので、
WSAAsyncSelect()は試していません。
隠しウインドウを作ってもよかったのですが、
その時は、うまくいったり駄目だったりで、
(どうもSYNの再送回数と関係が有るようでした)
アナライザ見ながらカットアンドトライした結果、
ブロッキングモードにすることを選んだんです。
もう少し時間があれば、やってみたんですが。
- 254 :名無しさん@お腹いっぱい。 :2000/12/05(火) 09:43
- でも、聞けば聞くほど、connect()の動作が怪しいですが・・・
connect()が本当に成功しているならソケットは必ず読み取り可になるんで
select()の動作自体を疑いたくは無いですね・・・
- 255 :名無しさん@お腹いっぱい。 :2000/12/05(火) 18:50
- ブロッキングモード、非ブロッキングモードでのsend()関数の
失敗する条件を教えてください
大きなデータ(ブロッキングモードで5MB前後)の場合、
エラーになる場合(-1)と送りきれる場合の
区別がつきません(まったく同じ条件で結果が分かれます)
現在、プラットホームを限定しないで情報を集めております
- 256 :しろーと :2000/12/05(火) 19:27
- 大きいデータを送る場合、
1初回のsend(バッファに空きあり)
成功した大きさが返ってくる(ブロックしない)
2次にポインタをずらしてもう一回sendする(まだ空きがない)
ブロックする/エラー(WSAEWOULDBLOCK)
3selectで待つ/FD_WRITEが来るので、
2のsendをもう一回(ブロックしない)
成功した大きさが返ってくるので、2に戻る
こう考えているんだけど、合ってます?
- 257 :>255 :2000/12/05(火) 20:59
- これこそ、ちゃんとselectで送信完了を待ってるのかどうかの問題のような。
送信データサイズと送信エラーとに直接の相関関係はないでしょ。
相手局の問題や、通信経路(OSのバッファ等を含む)の問題の方が重要だとおもうけど。
win95のwinsockで、ノンブロックのsendで数M送信したら
Winが固まったことはある。
もちろんselectで送信完了を待って順繰りに2Kづつ送信した場合。
同じプログラムで、win98,NT4では問題なかったんだけどね。
- 258 :255 :2000/12/06(水) 09:53
- 説明不足があったので条件を限定して詳細を述べます
ブロッキングモード
ストリームソケット
クライアントのポートはconnect()に選ばせる
送信バッファ8KB
送信データ5MB
select()で送信可の確認
プログラム起動直後に1回のsend()で全部送る
受け側でデータ全体の受信を確認後終了(デバッグの意味)
受け側TAIME_WAIT後に同じプログラムを走らせる(受け側も再起動)
この状態で、send()の成否が分かれます
失敗する時には、ほとんど一瞬で帰ってくるのです
送信バッファに対してデータが大きいですが、直接原因になるのでしょうか?
実際には切り分けて送るので問題ないのですが
成否が分かれるのが気持ち悪くて相談したわけです
心当たりはないでしょうか・・・
- 259 :>258 :2000/12/06(水) 10:58
- そもそも、失敗するというのは、どういうエラーになるの?
>受け側TAIME_WAIT後に同じプログラムを走らせる(受け側も再起動)
>この状態で、send()の成否が分かれます
このあたりに問題がありそうな気がするんだけど。
サーバー側のポートは、再起動する時点で本当に開放されてる?
ゾンビになってるとか無いよね?
- 260 :名無しさん@お腹いっぱい。 :2000/12/06(水) 11:25
- sendの戻り値や、errnoなりWSAGetLastErrorなりの値が・・・
- 261 :名無しさん@お腹いっぱい。 :2000/12/06(水) 12:12
- >>259
ポートが解放されていなければ、bindでエラーになるだろう。
setsockoptでSO_REUSEADDRオプションを指定していない限り。
>>258が
「TIME_WAIT後に」と云っているのはそういう意味だと
俺は受け取ったのだが。
- 262 :259>261 :2000/12/06(水) 16:19
- >ポートが解放されていなければ、bindでエラーになるだろう。
実はそうなんではと疑ってるんだけど。
- 263 :261 :2000/12/06(水) 20:27
- >>262
実はbindエラーのせいでサーバ側が起きてねえというオチ?
それならクライアントからのconnectも失敗するだろう。
bindエラーを見逃し、しかもconnectエラーも見逃すということを
やるだろうか。まあ俺ならやりかねんが。
それはともかく、サーバ再起動直後という特殊なタイミングのみに
起きる問題かどうかは切り分けたい。
サーバにずっとrecvさせておくようなパターンでも、
sendのエラーは発生するの? >>255
それと、h_errnoの値は教えてくれな。
- 264 :259>263 :2000/12/06(水) 23:28
- >それならクライアントからのconnectも失敗するだろう。
>bindエラーを見逃し、しかもconnectエラーも見逃すということを
いや、connectが失敗するのも、sendが失敗するのも、
どっちもselectで待ってるものはおんなじだから怪しいなと。
改めて、見直してみると原因はこんなもんって結構おおいじゃない。(爆
クライアントがエラーになるから、必死にクライアント調べてみて、
FD_SETしてるのは、送信の方だから、送信エラーと思ってるとか・・・
つーか、255さん、なんか否定してよ。
- 265 :名無しさん@お腹いっぱい。 :2000/12/07(木) 01:40
- ここで語られているようなことをするには
どんな言語が必要ですか?
- 266 :>265 :2000/12/07(木) 01:45
- たぶん、Cができれば何とかなります。
- 267 :>258 :2000/12/07(木) 02:36
- 全然関係ないけど。
>送信バッファ8KB
8Kってあんまり意味ないと思うよ、
普通ウインドウサイズ2Kぐらいだし、
OSのオーバーヘッドを緩和したいなら、もっと大きくした方が良いだろうし。
まぁ、8Kが悪いわけじゃないけど、中途半端だなと。
- 268 :255 :2000/12/07(木) 10:30
- お騒がせしました
サーバー側に問題がありました
サーバーは受取ったデータをファイルに保存するように作られていたのですが
これが、消えてなかったです、ファイルが重複してると接続を切るようにできていたので
connect()直後クライアント側は送信可能を感知して送信し、send()中にサーバーが切断してしまうという状態でした
接続が成功していたので安心しきって見落としてました
Winsock2.0ではsend()の戻り値はSOCKET_ERRORだから-1かな(書いたと思ってましたけど前々スレッドでしたね)
直後のWSAGetLastError()は10057でした(数値ですみません)
関数の存在自体を忘れてました・・・
それと、TIME_WAIT後という意味は261さんのとおりです
TIME_WAIT状態終了後と書くべきでした・・・
送信バッファはWinsock2.0のデフォルトじゃないんですか?
バッファいじってない状態でその値が取得できたのでそのまま使ったのですが・・・
自分の置かれている状態を正確に他人に伝えるのは難しいですね・・・
今回は色々と勉強させてもらいました
- 269 :267>268 :2000/12/07(木) 17:42
- >送信バッファはWinsock2.0のデフォルトじゃないんですか?
>バッファいじってない状態でその値が取得できたのでそのまま使ったのですが・・・
ああ、そういうこと。ソケット内のバッファの事ね。
アプリケーション上のバッファサイズ(送信単位)かと思った
確かWinsockについてはほとんど意味なしだったと思う。
詳しくは、前回号のMSDNに解説を読んでみてくれ。
- 270 :名無しさん@お腹いっぱい。 :2000/12/14(木) 13:35
- WSAGetLastError()で得た値からエラーすとリングみたいなの
を取得する方法はあるのでしょうか?
FormatMessage()見たいなやつです。
- 271 :名無しさん@お腹いっぱい。 :2000/12/14(木) 15:11
- >>270
Winsock特有のエラー以外は、標準的なBSDのエラーコードに
WSABASEERR(=10000)を足した値になっているので、FreeBSD
あたりのsys_errlist定義をパクってくれば大概は事足りる。
もちろん日本語のメッセージにはならないけどね。
- 272 :270 :2000/12/14(木) 18:04
- >271
ありがトン
パクってくる ε≡Ξヽ(´ー`)ノ
- 273 :。>270,271 :2000/12/14(木) 21:27
- というかFormatMessageでWSAGetLastErrorの
エラーメッセージ取得できるんだけど。
駄目だったエラーコードはどれ?
- 274 :270 :2000/12/14(木) 23:18
- WSAENETDOWNでやってみました(*'ー')ノ
FormatMessage()がFALSEを返したのでだめだと思ったのさ。
でも多分僕のやり方が逝けないんだね(●´▽`●)
- 275 :。>274 :2000/12/15(金) 00:00
- FormatMessage()のエラーコードは、なんだったの?
後、環境差異もあると思うんだよね。
私がここんとこ、見てたのは、W2Kだから。
ERROR_FILE_NOT_FOUNDとかの、ネイティブなエラーはメッセージ取れてる?
- 276 :271 :2000/12/15(金) 00:54
- ウーン。気になるので後で試す。
多分環境依存。NT4でもサービスパックN以降はOKとかな。
>>270
いちいちソケットエラーおこさんでも次のようにして試せば良い。
#include <stdio.h>
#include <string.h>
#include <windows.h>
char *squeeze(unsigned char *s, const char *set)
{
int c;
unsigned char *d = s;
char *res = s;
whle (c = *s++)
if (!strchr(set, c))
*d++ = c;
*d = '\0';
return res;
}
int main()
{
int i;
char buff[1024];
for (i = 1; i < 12345; ++i) {
buff[0] = '\0';
if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
i, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
buff, sizeof buff, NULL) || !buff[0])
{
continue;
}
printf("%5d %s\n", i, squeeze(buff, "\r\n"));
}
return 0;
}
- 277 :270 :2000/12/15(金) 15:07
- 上のコードで試しました。当方WIN98
最後に表示されたメッセージは
6118 このワークグループのサーバー一覧は、現在使えません。
で、
FormatMessage()がしぱいした回数は
0x2da7 回でした。
- 278 :271 :2000/12/15(金) 15:37
- >>277
俺会社のNT4(Service Pack6)で試したけど同じ結果。
最近のMSDNでは、Win32 Error Codesの中にWSA関係のエラーコード
も含まれているんだけどな。
- 279 :。> :2000/12/15(金) 16:13
- うーん、W2KServer+SP1で試したけど、10004から11034まで取得できるね。
98、NT4はダメなのかな。
- 280 :名無しさん@お腹いっぱい。 :2000/12/16(土) 10:35
- WSAのエラーは、昔、試してみて駄目だったから、
MSDNのエラーコード表をぱくってエラーメッセージ取得関数を作ったことがある。
そうか最近は取得できるんだ…。
- 281 :名無しさん@お腹いっぱい。 :2000/12/17(日) 07:03
- コネクションを保持することが必要なプロトコルをHTTPトンネリングしようとしているのですが
可能でしょうか?
プロキシサーバからサーバってKeep-Aliveできるのでしょうか?
- 282 :名無しさん@お腹いっぱい。 :2000/12/19(火) 07:59
- HTTPで www.yahoo.co.jp にGET / HTTP/1.1すると
レスポンスヘッダとボディの区切りが\r\n\r\nになって
くれないんですけど何でですか
- 283 :>282 :2000/12/19(火) 08:02
- ふつー\r\rだろが
DOSに洗脳されてんな
- 284 :名無しさん@お腹いっぱい。 :2000/12/19(火) 10:07
- >>282 Yahooは変なんだよ。「送信はstrictに、受信は寛容に」ということで頑張れ。
>>283 馬鹿。HTTPの規約資料読めよ。
- 285 :名無しさん@お腹いっぱい。 :2000/12/19(火) 10:56
- >>284
YahooのHTTPDって何つかってんの?
- 286 :名無しさん@お腹いっぱい。 :2000/12/19(火) 11:57
- telnetで
headすりゃいいじゃん
ちなみに俺がやらないのは
Socks串がかんでる環境なんで
設定いじるのがウザイだけ
- 287 :名無しさん@お腹いっぱい。 :2000/12/19(火) 12:07
- >>284
そういう詳細情報はヘッダに出てこない。
HEADリクエストでページ内容全部送ってきたり、
CRLFじゃなくて全部CRで送ってきたり、邪悪この上ない。
- 288 :名無しさん@お腹いっぱい。 :2000/12/19(火) 12:37
- Yahooは完全オリジナルじゃないか?
何かのカスタマイズかもしれないが、Yahooのサービス内容に
そこらのhttpdは不要だしな。
- 289 :名無しさん@クリスマスもひとり。 :2000/12/21(木) 00:32
- Winsockについて教えてください。
まだWinsockの勉強をはじめて一週間くらいです。
サーバーはポートを指定してクライアントの接続を待機すると思うんですが、
クライアントも接続するサーバーのIPとポートを指定しますよね?
そのとき、クライアントはどうやってサーバーのポートを知ればいいのでしょうか?
それとも、きめうちで作るものなのでしょうか?
- 290 :名無しさん@お腹いっぱい。 :2000/12/21(木) 00:41
- >>289
決め打ちです。
ポート決め打ちがいやなら、CORBAのネーミングサービスサーバ
みたいなの自作してちょ。(それでもネーミングサービスサーバ
への接続は決めうちになるが)
- 291 :名無しさん@お腹いっぱい。 :2000/12/21(木) 00:48
- >そのとき、クライアントはどうやってサーバーのポートを知ればいいのでしょうか?
クライアントは、IPアドレスもポート番号も、ユーザーが指定したものを使うのが原則。
ただし、メジャーなプロトコルの標準的なポート番号はIANAで登録管理されているので、
そこで管理されている値で当てはまるものをデフォルトとして用意するのが親切。
参照: http://www.isi.edu/in-notes/iana/assignments/port-numbers
- 292 :名無しさん@クリスマスもひとり。 :2000/12/21(木) 00:49
- >>290 さん、お返事 ありがとうございます。
ガーン、そうなんですかー・・・
じゃあ、サーバー側でポートが使用されてた場合には、
クライアントは変な動作しちゃうのかなぁ?
それと、IPメッセンジャーみたいなのは、
IPの最後の桁を総当りで試してるんでしょうか?
- 293 :名無しさん@お腹いっぱい。 :2000/12/21(木) 01:02
- >>292
変な動作しないようにすれ。
接続したらサーバーから接続メッセージ投げるようにして、一定期間たって
も送ってこなかったり、期待した内容と違うものがきたら「このサーバー
違くない?」といって切断すればいい。
>それと、IPメッセンジャーみたいなのは、
ブロードキャストするとか、マルチキャストするとか。
- 294 :名無しさん@お腹いっぱい。 :2000/12/21(木) 01:02
- >292
見当違いのサーバプロセスにコネクトしても、とりあえず
ソケットは出来ちゃうね。普通はソケットできたらサービス
ごとのプロトコルで接続確認のメッセージ投げ合って、それが
お互いの意図するプロセスなのか確認して、間違ってたら落とす
とかするんじゃないでしょうか。
- 295 :293 :2000/12/21(木) 01:04
- >ブロードキャストするとか、マルチキャストするとか。
あ、これローカルに限るからね。
- 296 :名無しさん@クリスマスもひとり。 :2000/12/21(木) 01:06
- >>291 さん
参照を見させていただきました。
まったくのオリジナルなものは49152以降を使って良いって事ですよね?
実際、バッティングしちゃう事は無いのかなあ?ちょっと不安。
細かいとこまでありがとうございました、
明日、仕事中にでもながめてみますー!
- 297 :名無しさん@クリスマスもひとり。 :2000/12/21(木) 01:12
- >>293 さん
ネゴシエーションって言うのかな?ハンドシェイクっつーのかな?
そういった確認プロセスを実装するべきなんですねー・・・
ブロードキャストとマルチキュストはまだよくわからないので、
勉強してきます。UDPで出来るやつですよねー!
- 298 :名無しさん@お腹いっぱい。 :2000/12/22(金) 00:56
- つーか、ポートはservices引いてほしいなぁ。
- 299 :名無しさん@お腹いっぱい。 :2000/12/25(月) 00:37
- 非同期ソケットでソケットを閉じるとき、いきなり
closesoket()を呼んで後は無視、というようなことをしてもいいのでしょうか?
それともちゃんとshutdown()を呼んでからFD_CLOSEを待たなければ
ならないでしょうか?
- 300 :名無しさん@お腹いっぱい。 :2000/12/25(月) 02:26
- >>298
servicesって引く意味あるの?
localのことがわかっても意味ないようなきがする。
localhostにTCP/UDP開くこともあるが、remote相手の方が圧倒的に多い。
- 301 :>300 :2000/12/25(月) 03:05
- servicesがなぜ存在するか考えた事ないのか?
- 302 :名無しさん@お腹いっぱい。 :2000/12/25(月) 03:27
- >お互いの意図するプロセスなのか確認して、間違ってたら落とす
>とかするんじゃないでしょうか。
それが理想なんだけど、たいていメジャーなプロトコルの実装って
何もしない(セパレータ待ちのまま止まる)のが多いんだよね・・・
- 303 :名無しさん@お腹いっぱい。 :2000/12/25(月) 11:32
- closesocket()はそのプロセスのソケットを閉じる
shutdown()は複数のプロセスで同じソケットを使っていようと
そのソケットのすべてのインスタンスで閉じる
あと、SD_SENDなら、向こう側はEOFを受取るがこちらはまだ受信は可能
- 304 :名無しさん@お腹いっぱい。 :2000/12/25(月) 11:35
- Winってservicesいつ読んでるの?
あれ、手書きしてちゃんと動くんですか?
- 305 :名無しさん@お腹いっぱい。 :2000/12/25(月) 13:55
- >>304
自分で試せばいいダロ。
少なくともNTの場合はgetservbynameが内部的に
%WINDIR%\system32\drivers\etc\services
を直接読みに行っているっぽい。書き換えるとすぐに反映される。
- 306 :名無しさん@お腹いっぱい。 :2000/12/26(火) 16:32
- windowsのselect()に関して質問させてください
select()で待機中に同プロセス、別スレッドから
待機状態を強制解除(エラー)させる方法が知りたいのですが
そういうイベントってあるのでしょうか?
シグナル投げようかとも思ったんですがwindowsのプログラマが意識できるものは
どれも致命的なのばかりで、できれば横取りしたくないです。
- 307 :名無しさん@お腹いっぱい。 :2000/12/26(火) 19:07
- プロセスやスレッド自体を殺したくはないし、
当該のソケットをclose/shutdownしたくもないということだよな。
そういう必要があるのであれば、ソケット監視にはWSAEventSelectを
使うことにして、
一方ではスレッド間通信用のEventオブジェクトを作成して
WaitForMultipleObjectで両者を一緒に見張るか、
いっそIOCPを使うかするのが真っ当なやり方だろう。
しかし、やや汚い手であるが、ダミーのリスナーを起動して
おき、selectでそのリスナーも一緒に見張らせておく。
で、問題がある場合はそのリスナーにconnect()する、という
やり方で、どうにかなるような気もするな。
- 308 :。>306 :2000/12/27(水) 23:13
- selectの待機時間をある程度短いサイクルにして
チェックするのではダメなの?
WSAEventSelectは、Winsock2.0未満は使えないから、
Win95とかではダメなんで、もしselectで待つのが送信・受信だけなら、
send recvを使わないで、WriteFile・ReadFile+OverlappedI/Oを使って
WaitForMaultipleObjectで待つという手も有るよ。
- 309 :306 :2000/12/28(木) 10:33
- 実は、汎用のサーバーC++ classを作ってます
winsock1.1でも動くかたちになってるからできればWSAEventSelect使いたくないんですよね
selectが見張ってるのは複数ポートのソケットの送信、受信(受付も)、エラー、タイムアウトです、(同期)
内部の命令をどうやって受取るか?というのが問題で
今のところ、SIGABRTなげて対処してますが・・・というのが現状です
サーバ機能はシングルスレッドなので余計なスレッドを足したくは無いんですが
良く考えればシグナルだって内部的にはスレッドだな、
シグナル打つスレッドが他に必要になってくるし・・・
PS
.Winのシグナルハンドラ定義って一回シグナル入ると再定義しなきゃいけないんですね
ちょっと賢くなった
- 310 :デフォルトの名無しさん :2000/12/28(木) 11:00
- >>300
俺はWindows系ではservicesは見ない。昔はgetservbyname()
してたけど、Windowsアプリの場合ポート番号変更するような
機能付ける事が多いからINIファイルやらレジストリから読む
仕様にした。Windowsの流儀としては自然だし。
ちなみにクライアントアプリしか作った事はないし、ポート番
号は非ウエルノウンポートなサービスばっか。
UNIX系はservicesを見るようにしているが、クライアントア
プリでは今後Windowsアプリのような方式にする可能性もある。
- 311 :。>309 :2000/12/28(木) 17:32
- >実は、汎用のサーバーC++ classを作ってます
Winsock独自拡張の機能は使わないでやりたいと言うこと?
- 312 :309 :2000/12/28(木) 18:39
- >Winsock独自拡張の機能は使わないでやりたいと言うこと?
CHATSRVR のこと?
Winsock 2.0にしたら
select()がsignalで飛ばない・・・シクシク
MSDN見たらWSAEINTRは1.1のみだった
- 313 :ごめんね〜 :2001/01/05(金) 23:32
- 94まで下がっているんですものぉ〜
- 314 :デフォルトの名無しさん :2001/01/05(金) 23:46
- 非同期ソケットをつかってプログラミングしてるんですが、
データを受信してるとき、受信スピードを落とすのは
どーやってやればいいですか?
いちいち切断なんてことはしませんよね。
- 315 :デフォルトの名無しさん :2001/01/06(土) 01:05
- age
- 316 :>314 :2001/01/06(土) 01:09
- recvしなきゃいい。
- 317 :デフォルトの名無しさん :2001/01/06(土) 07:56
- >>308
昔Win95でsocketにoverlapped I/O使ってFTP転送みたいにがんがん転送する
奴作ったら、swapしてまでOS内部にデータためこんで、しまいにOSごとハング
アップしてしまったよ。
間欠的に少々のデータを送るにはいいかもしれないけど。
- 318 :。>317 :2001/01/06(土) 10:08
- そうだね、俺もそうなったよ。
というか、nonblockで普通にsend+selectでも同じ事象になるけど。
ディレイかませれば、死なないで済むから、FTPみたいな、
ハンドシェークなしの一方的な転送じゃなければ大丈夫だよ。
win98、NT3.5以降では問題起きないから、利用環境が特定できる
ものなら心配する必要はないと思うけど。
- 319 :デフォルトの名無しさん :2001/01/06(土) 13:11
- >>316
ありがとうございます。
FD_READのときはかならず全部読まなきゃいけないと
思ってたんですが、そんなことはないんですね。
とりあえずやってみるです。
- 320 :デフォルトの名無しさん :2001/01/06(土) 16:13
- >>318
Win95でソケット使ったこと無いので参考までに
質問させて。
ガンガン送るという意味がよく分からないのだけれど
1. selectでSNDBUFが開くのを待つ
2. EWOULDBLOCK、もしくはデータが無くなるまでsendループ
3. EWOULDBLOCKの場合は1へ
の繰り返しと思っていいですかね。
これで駄目なら、Win95のselectは、WinsockレイヤーのSNDBUFが
fullであっても writableであると返すような間違った
実装がなされているということになるな....ちょっと信じ難い。
>>319
受信が速すぎて困ることって想像がつかないのだけれど、
なぜ困ってるの?
- 321 :。>320 :2001/01/06(土) 16:38
- >これで駄目なら、Win95のselectは、WinsockレイヤーのSNDBUFが
>実装がなされているということになるな....ちょっと信じ難い。
うーん、selectの実装だけの問題かどうかは、わかりませんが、
バッファリングの機構のどこかに問題があるのは確かですよ。
それ以上掘り下げる事はしていませんが。
私の場合は、select+sendで317の言うような現象になったんで、
WriteFile+OverlappedI/Oに変えてみたんだけど改善しなかったんで、
しょうがないから、blockmodeに変えたけどね。
同一のプログラムををNT,98でも検証してたから、
win95の問題であることはまず間違いないです。
>なぜ困ってるの?
たぶん、流量制限したいんじゃないんですか?
- 322 :317 :2001/01/06(土) 17:45
- >>318
>というか、nonblockで普通にsend+selectでも同じ事象になるけど。
ほえ?
nonblockだったら、送信できなきゃWSAEWOULDBLOCKでsend()から戻って
くるんだから、OS内部にためこんで自滅なんて起きないけど。
- 323 :デフォルトの名無しさん :2001/01/06(土) 17:47
- >たぶん、流量制限したいんじゃないんですか?
そです。
- 324 :デフォルトの名無しさん :2001/01/06(土) 17:56
- オイオイどっちが本当なのだ。
>>322
sendはSNDBUFがfullな場合にEWOULDBLOCKを正しく返すが
(Win95の)WriteFileはERROR_IO_PENDINGを返すべきときに返さない
という解釈で良いの?
- 325 :317 :2001/01/06(土) 18:22
- >>324
少なくとも俺はそうだと認識してる。
ただ、NT4でも同じだったけど(流石にWin95のようにハングはしなかったけど、
仮想メモリ不足のダイアログは出た)
なので、ハンドシェーク無しの場合はsocketにoverlapped I/Oを使うのは危険
だなと。
- 326 :320=324 :2001/01/06(土) 19:53
- >>325
ちょっと普段使わないOSR2立ち上げてテストしてみた。
仕事じゃないのでマジメにやった訳じゃないが...
(本当ならACKが帰ってくるタイミングとI/O がpending
でなくなるタイミングを比較検討したいところだ)
1. Win95でもデフォルトのSNDBUFのサイズは8192のようだ
2. sendは一応SNDBUFのサイズを見ており、1024バイトずつの
パケットを送ってやると、ちょうど9回目でEWOULDBLOCKを返す
ようになる。
3. しかし、サーバ側はacceptしたあと寝たフリをさせている
にも関わらず、selectが即リターンする。ここでもう一度send
を実行すると当然のようにEWOULDBLOCK。selectがちゃんと
寝てくれないのは困り者だな。無論BSDならselectが帰ってこない
ところだ。
WriteFile版も試したが、ERROR_IO_PENDINGを「必ず」返す。
だが、GetOverlappedResultがマトモに機能しないようだ。
これが致命的なのだろう。試しにOverlapped構造体にセットした
イベントをWaitForSingleObjectで待ってみたが、いずれに
せよ即リターンする。
最初はこの版を止まるまで無限ループというコードで試したら、
プログラムではなくシステムが停止してしまった(苦笑)。
- 327 :。>326 :2001/01/06(土) 20:56
- 追試ご苦労様です。
>プログラムではなくシステムが停止してしまった(苦笑)。
そうそう、こちこちにかたまっちゃんだよ。
sendでも、WriteFileでも結果的におんなじことになる。
OSR1,OSR2両方ともおんなじだったはずだよ。
- 328 :デフォルトの名無しさん :2001/01/08(月) 02:34
- telnetツールを自作したいのですが
23に接続した後何したら良いかわかりません
たぶん、ターミナル情報をやり取りが必要なのでしょうが(telnet.exeの通信にsniffer使うと何かやり取りしてるので・・・)
実際、具体的にどうすれば良いのでしょうか?
開発環境は
VC++6.0、Winsock1.1or2.0(2.0でなくても動作させたいですが)です
- 329 :デフォルトの名無しさん :2001/01/08(月) 10:09
- >>328 まずはTELNET関連のRFCを読め。
- 330 :デフォルトの名無しさん :2001/01/08(月) 10:16
- >>328
RFC読みなはれ。番号忘れたけど結構若い番号だから。
プロトコルの話しだからWinSockのバージョンには関係しないよ。
IAC WILL, IAC DO
- 331 :。> :2001/01/08(月) 10:52
- というか、snifferまである環境なら、
tnぐらい知ってる人周囲にいないのかなぁ?
最近はそうでもないのかな・・・
- 332 :,,a,,,,,,, :2001/01/08(月) 17:34
- ,,,a,,,,,a
- 333 :328 :2001/01/09(火) 01:37
- 318ですよね?
一応読んでから質問してるんですけど・・・
あれ見ただけで、コネクション張って、次に何やるかわかるんでしょうか?
コードとか、送受信の定義しか、無かったように見えたんで質問したんですけど?
その他に、オプションで854、858・・・(死ぬほど)
があったんで、その中に書かれているのですか?
一応、854は見てみたんですが
いきなり、「Go Aheadを送信するホストの場合」みたいなところで
つまづきました・・・
- 334 :328 :2001/01/09(火) 10:24
- もしかして
IAC WILL TERM TYPE を
FF FB 18
に編集して送るってことですか?
- 335 :デフォルトの名無しさん :2001/01/09(火) 11:14
- 編集って?
RFCに「IAC WILL」とか書かれているのは単なる解説。
スニファしていても、そういう文字列が出てくるわけではないし、
ユーザーがIAC WILLと打ち込んだからといってそれをコマンドに
翻訳して送れといっている訳でもない。
基本的には送受信データは全部そのまま生で送る。
ただし、TELNETの制御コマンドの始まりを意味するコードと
それに続く数バイトだけは特殊扱いをする。
制御コマンドの送受信コードはRFCに16進で書かれている通り。
- 336 :名無しさん小学1年生 :2001/01/09(火) 16:31
- socketでサーバーを書いているですが、
一度しかクライアントしか受け入れない場合、
acceptした後にそのソケットはshuntdownしちゃっていいのでしょうか?
- 337 :328 :2001/01/09(火) 19:02
- 日本語がおかしかったです
編集じゃなくて変換が正しかったです
でも、FFとかFBを送るのはどうやってやるのですか?
ASCIIは7bitですよね
unicodeにするんですか?
>>336
受付ソケットは閉じても問題ないです
その場合、回線不良で切断したら当然、再接続で来ません
ソケット用意してもTIME_WAITの問題でうまくいかない可能性大
まあ、TIME_WAIT回避する方法もありますが、
極希に問題が起こる可能性があります(パケットの生まれ変わりの問題)
特別、shutdownする理由も無いように思うのですが?
- 338 :名無しさん@お腹いっぱい。 :2001/01/09(火) 19:13
- >>337
7bitにこだわる理由を教えてくれ
説明できないことが、その答えだ
- 339 :328 :2001/01/09(火) 21:56
- sendの引数 signed char だから勘違いしてました
なるほど、全然送れてますね
- 340 :>336 :2001/01/10(水) 03:57
- 単一のクライアントだけしか受け付けないんだよね?
それなら、一度acceptしたら、listenしているソケットを閉じてしまえば、
いいだけだよ。ソケットを閉じればバックログの待機中の接続には、rstが返るから、
心配ないよ。
- 341 :336 :2001/01/10(水) 11:15
- ありがと。
shutdownってしなくてもよかったんですか。
データが残っている状態(この場合バックログ?)では
closesocketする前にshutdownしないといけないものと思ってました。
- 342 :>341 :2001/01/10(水) 14:53
- listenソケットはデータの送受信しなないから、
shutdownは、必要ないと思うけど。
バックログとは、listenの第2パラメータで指定する、acceptするまで、
保留させる接続のことだよ。acceptしなければ、synは応答しないから、
接続は確立しない。よって、データの送受信は発生しないよ。
この時点ではrstが応答されれば、クライアント側にはサーバーソケットが
生成されていないように見えるから。
acceptしてすぐ切断すると、すれ違いでデータを送信してしまう可能性があるので、
あまり良くないです。shutdown(s,SD_SEND)で呼んでrecvで拾ってやらないと、
いけなくなるし、クライアントが輪は接続確立後に切断されたように見えるから
(まさにそうの通りなんだけど)データが正常に受け取られたのか、判断しずらいよね。
- 343 :336=341 :2001/01/10(水) 17:07
- >acceptしてすぐ切断すると
acceptしたソケットとは通信を続けるので、すぐ切ることはないです。
3つの接続要求がきた場合、1回acceptを発行して、
すぐにlistenしていたポートをclosesocketしてしまえば残りの2つからは
サーバーソケットが存在してないように見える、ってことですよね?
それとも、一度acceptすると3つとも接続が確立しちゃうってこと?
俺の勘違いだと思うけど
- 344 :デフォルトの名無しさん :2001/01/10(水) 17:25
- >>343
342のaccept後すぐにcloseすると云々というのは、
listening socketではなく、acceptにより返された
descripterのことを云っているので、
343のような処理を行う分には問題がない。
- 345 :342>343 :2001/01/10(水) 17:58
- >すぐにlistenしていたポートをclosesocketしてしまえば残りの2つからは
>サーバーソケットが存在してないように見える、ってことですよね?
そういうことです。
acceptしてすぐ切る云々は、
>>336の
>acceptした後にそのソケットはshuntdownしちゃっていいのでしょうか?
から、acceptして取得した記述子をshutdownしているのかと思ったので、
それは、良くないよという話です。
- 346 :デフォルトの名無しさん :2001/01/10(水) 18:34
- >>342
>synは応答しないから、接続は確立しない。
うそだろ?
listenしてればsynハンドシェークを完了させる
バックログがなんなのかを勉強し直せよ
>acceptしてすぐ切断すると、すれ違いでデータを送信してしまう可能性があるので・・・
ソケットレベルでacceptされたかどうかはわからないと思うが?
shutdown(s,SD_SEND)した後recvしてどうするんだ?
もう、クライアントには応答できないし
ソケット破棄しても、受信バッファが破棄されるのはかわらんと思うが?
- 347 :342 :2001/01/10(水) 19:00
- >>346
>listenしてればsynハンドシェークを完了させる
>バックログがなんなのかを勉強し直せよ
勘違いしてたかな。ちょっと、確かめてみる。
誤情報流してしまったかもしれん。すまん。
単一接続にするには、バックログ数を減らすのが正しかったか。
>ソケットレベルでacceptされたかどうかはわからないと思うが?
それならば、複数のバックログを設定されていれば、
接続確立したかは、確かに判別不能になるね。
>shutdown(s,SD_SEND)した後recvしてどうするんだ?
へっ?仕掛かり中の受信を終わらせるためだけど。
応答できるかどうかとは、関係ない話しだけどな。
別に捨てるだけなら無理にする必要はないけどね。
通信が会話形式を取らない場合なら、クライアント側は正常に
送信したように見える可能性があるから、
サーバー側は後始末する必要があるんじゃない?
- 348 :デフォルトの名無しさん :2001/01/15(月) 05:09
- だから下がりスギだって
- 349 :デフォルトの名無しさん :2001/01/16(火) 12:56
- socketでもtelnetでも良いのですが、proxyを経由させるとき、最初にproxyに接続しますよね。
で、httpなら"GET http://***/index.html HTTP/1.0"とかコマンドを送りますけど、
このコマンドにスペースを使いたい場合ってどうすれば良いのでしょうか?
例えば、httpプロトコル以外で、"SHOW STATUS ***/index.html"とか送ると、
"SHOW"をコマンド、 "STATUS ***/index.html"をアドレスと認識してしまってうまくいきません。
"や'でコマンドを囲んだりしてもうまくいきません。
どう処理すればよいのでしょうか?
- 350 :デフォルトの名無しさん :2001/01/16(火) 15:19
- http proxyはhttp命令しか受け付けないから当然の結果。
専用プロトコルのproxyをさがそう。
- 351 :名前ついてますか? :2001/01/16(火) 19:14
- Socks使え。って問題でもないんだろうな。
- 352 :デフォルトの名無しさん :2001/01/17(水) 10:08
- HTTPトンネルをしたいのか?
GetのQueryString or Postして
cgiで受けて代用できないようなことなのか?
- 353 :デフォルトの名無しさん :2001/01/22(月) 12:59
- 同じLAN内で自分の相手してくれるサーバ探すのって普通どうするの?
DirectPlayのEnumHostsに相当する処理を行いたい場合。
- 354 :デフォルトの名無しさん :2001/01/22(月) 15:28
- >>353
使いたいポートにUDPでブロードキャスト投げろ。
- 355 :354 :2001/01/22(月) 15:29
- 補足
サーバ側はブロードキャストによるリクエストを受け取ったら、Senderに応答を
返すようにしておく。
- 356 :353 :2001/01/22(月) 16:09
- やっぱそうなのか、結構面倒くさいのね。
どうもありがとう。ただいま実験中……
- 357 :353 :2001/01/22(月) 16:46
- 使いたいポートにUDPでブロードキャスト投げたら
TCPで使えなくない?
普通どうすんの? 別のポート使うの?
- 358 :353 :2001/01/22(月) 16:54
- acceptといっしょにできないのなんかもったいないな。
- 359 :デフォルトの名無しさん :2001/01/22(月) 17:12
- >>356
面倒くさいから、上位に抽象化されたライブラリを作るわけです。
>>357
TCPとUDPは独立にbindできる。つまり、同じポートでTCPの待ち受けと
UDPの待ち受けを同時にできます。
>>358
TCP用のサーバsocketとUDP用のサーバsocketをbind後、select。
読み取り可になったsocketに応じた処理をする。
- 360 :353 :2001/01/22(月) 17:30
- ウヒョーありがとー。
いろいろ試してみます。
- 361 :353 :2001/01/22(月) 17:41
- ところで俺の用途だと、ゲームだから、
非ブロッキング+適当に休む+ポーリングで
ぜんぜん問題ないから単なる話のタネなんだけどさ、
ブロッキングモードで使いたいときは
サーバーを終了したいときってどうするの?
- 362 :デフォルトの名無しさん :2001/01/22(月) 18:02
- シグナルでも投げたら?
当然、分岐を書いておく
- 363 :353 :2001/01/22(月) 18:10
- やっぱシグナルかー、いまいちかっこわるいなあ。
WaitForMultipleObjectでスレッドもWin32シグナルもタイマも
あり、って方がいいなあ。
selectで終了用のダミーの入力fd持つとかできる?
そんなみょうちくりんなことするよりシグナルの方がマシか……
- 364 :デフォルトの名無しさん :2001/01/22(月) 18:31
- >>363
select使う時点でblockingもnon-blockingも関係無いような気がするけど。違ったっけ?
blockingで、read、recvを使うんなら、シグナル(か、その他の割り込み)以外思い付かない。
select使うんなら、timeoutしたところで終了判定。
- 365 :デフォルトの名無しさん :2001/01/22(月) 23:49
- SOCKETに対してWaitFor〜()が使えればいいんだけどねぇ。
ReadFile(), WriteFile()にはSOCKET渡せるくせに、変な所で手抜きだよな。
- 366 :デフォルトの名無しさん :2001/01/22(月) 23:53
- SOCKETに対してWaitFor〜()が使えれば悩まずに済むんだけどね。
ReadFile(), WriteFile()にはSOCKET渡せるくせに、変な所で手抜きだよなぁ。
- 367 :デフォルトの名無しさん :2001/01/23(火) 18:49
- >>364
send時に動作が変わりそうな気配が・・・
- 368 :デフォルトの名無しさん :2001/01/23(火) 19:02
- >>363
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970344582&st=306&to=309&nofirst=true
あたりに同じ話題があった。
306が結局どうしたのかはしらん。
- 369 :デフォルトの名無しさん :2001/01/23(火) 22:50
- Javaでabstractメソッド(仮にfunc())を持つInterfaceをImplementsした
Serializableオブジェクトインスタンスを、Socket→ObjectInput/OutputStream
つかって投げ合って、相手先でfunc()を起動するっていうコーディングって、普通かな?
RMIやCORBAでネーミングサーバ立ち上げるほどの事でもない(一対一が確定してる)
なら、普通はこのやり方だよね?
- 370 :デフォルトの名無しさん :2001/01/29(月) 12:24
- age
- 371 :デフォルトの名無しさん :2001/02/03(土) 16:45
- 99
- 372 :デフォルトの名無しさん :2001/02/06(火) 09:30
- >>363
AfxEventSelect()で設定したEventと終了のEventをWaitFor〜()で
待つってのはどう?
- 373 :372 :2001/02/06(火) 11:06
- WSAEventSelect()だった。
WinSock2だけどね。
- 374 :デフォルトの名無しさん :2001/02/08(木) 17:51
- ブロードキャスト受けた時に
それが、ブロードキャストと判定するにはどうしたら良いのでしょう?
また、ブロードキャストを投げて、誰から、帰って来たのかは
どうやって知るのでしょうか?
- 375 :デフォルトの名無しさん :2001/02/12(月) 07:50
- TCP/IPなら、宛て先アドレスが255.255.255.255とか。
そういう話じゃなかったっけ?
- 376 :デフォルトの名無しさん :2001/02/12(月) 15:00
- >>374
(;´д`)学校の宿題は自分でやりましょう
- 377 :374 :2001/02/13(火) 11:55
- 宛先をソケット情報のどこから取れば良いのかと言うことです
やりたいことはブロードキャストを使ったデータ送受信です
ノード数はそれほど多くないのでトラフィックは問題ない程度です
あと、環境はC言語 OSはUnix&Windows でお願いします(出来ればバークレー型ソケットで・・・)
ちなみに、宿題ではありません
- 378 :374 :2001/02/13(火) 11:55
- 宛先をソケット情報のどこから取れば良いのかと言うことです
やりたいことはブロードキャストを使ったデータ送受信です
ノード数はそれほど多くないのでトラフィックは問題ない程度です
あと、環境はC言語 OSはUnix&Windows でお願いします(出来ればバークレー型)
ちなみに、宿題ではありません
- 379 :デフォルトの名無しさん :2001/02/13(火) 11:56
- 2重すみません
- 380 :デフォルトの名無しさん :2001/02/13(火) 12:03
- IRCプロコトルをカプセル化したコンポーネントってどっかに転がってないですかね。
IRCクライアント CHOCOA のCOMオブジェクトを使うと面倒で面倒で。←タコ
- 381 :デフォルトの名無しさん :2001/02/16(金) 18:15
- age
- 382 :デフォルトの名無しさん :2001/02/22(木) 16:59
- age
- 383 :デフォルトの名無しさん :2001/02/24(土) 11:40
- shutdownとclosesocketの違いを教えてください。
(少なくともMSDNでは)shutdown後のソケットを再利用してはいけない
書いてあったので、さっさとcloseしちゃっても同じだと思うのですが。
送信(受信)のみ禁止したい状況が思いつかないので。
#複数のスレッドにまたがって1つのソケットを使いまわすことは無い
#という前提でお願いします。
- 384 :デフォルトの名無しさん :2001/02/24(土) 12:40
- >383
こことか参考になるかも
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.6
- 385 :デフォルトの名無しさん :2001/02/25(日) 17:03
- >>384
ありがとう。お行儀好く逝きましょうということですね
- 386 :デフォルトの名無しさん :2001/02/26(月) 01:31
- hostent構造体のh_addr_listメンバでipアドレスのリスト取れると思うのですが、
肝心のh_addr_list要素数が無いのですが、どうやってすべてのリストを取得するのでしょうか?
- 387 :デフォルトの名無しさん :2001/02/26(月) 23:07
- >>386
ケツがNULLポインタになってるから、そこまでループで回して処理
- 388 :デフォルトの名無しさん :2001/02/26(月) 23:35
- ソケットに対してのI/Oは何でやってます?
送信はsend/writeのどちら?
受信はrecv/readのどちら?
待ちはselect/pollのどちら?
BSDかSYS/Vの違いだろうけどさぁやっぱ好みってあるじゃん。
- 389 :デフォルトの名無しさん :2001/02/27(火) 15:21
- >388
俺はwindowsだからsend/recv/select
UNIX使うようになったら、read/write/selectでやりたいな。
楽そうだし。
- 390 :age :2001/03/05(月) 17:26
- age
- 391 :デフォルトの名無しさん :2001/03/05(月) 17:31
- >待ちはselect/pollのどちら?
pollの方が監視できる記述子が多いからなぁ。
- 392 :デフォルトの名無しさん :2001/03/09(金) 20:07
- win32で
プロミスカス・モードの指定の仕方を教えてください
どうも、Unix系、Linux系のキーワードでMSDNにHitしないんですけど・・・
- 393 :デフォルトの名無しさん :2001/03/09(金) 21:31
- kqueue, keventはどうよ?
- 394 :デフォルトの名無しさん :2001/03/24(土) 21:49
- >>392
おまえ、どこにでもでるよな
bosscatだっけ?
- 395 :デフォルトの名無しさん :2001/03/28(水) 04:41
- あげ
- 396 :デフォルトの名無しさん :2001/04/16(月) 03:02
- P2Pによりなまsocket通信復活!
CORBA?SOAP?そんな遅いもん使ってられん!!!
yotte あげ
- 397 :デフォルトの名無しさん :2001/04/16(月) 04:53
- JavaでP2PはRMIでやる羽目になるだろね。
- 398 :(゚Д゚) :2001/05/05(土) 15:21
- Linuxでtcpdumpのまねをしてスニッファーもどきを作ったんですけど。
Winsockで、スニッファーを作ってみたいんですが。
プロミスキャスモードに変更とかどやんの!?
ドライバー作らないとだめとかいううわさを聞いたんですけど・・・。
- 399 :デフォルトの名無しさん :2001/05/05(土) 15:28
- >298
うわさどおりです。詳しい人よろしく。
- 400 :ころ :2001/05/05(土) 16:44
- 本ばかりよんでいてプログラムはぜんぜん組んでいないのですが
わからないことがありましたので質問します。
ビジュアルベーシックなのですが、FTPやHTTPは対応している
ようなんですが、TELNETに接続するときのやりかたが
どうも良く分かりません。いろいろ本はよんでいるのですが
だめです。
- 401 :デフォルトの名無しさん :2001/05/05(土) 21:17
- 本なんて読まなくていいから、こっちをきちんと読め。
http://RFC.net/rfc854.html
- 402 :ころ :2001/05/06(日) 20:17
- 見たんですが、さっぱり訳がわかりませんでした。
- 403 :名無しさん :2001/05/07(月) 01:38
- telnetはただのソケット接続です。
送信するものを自由にタイプできるだけです。
- 404 :デフォルトの名無しさん :2001/05/07(月) 07:31
- >>403みたいにRFCを読まずに、そう思いこむ馬鹿がいる。
- 405 :ころ :2001/05/07(月) 19:31
- 毎日、このスレッド確認しております。ど素人なので、RFCがなんなのか
まったくわかりません。FTPサーバーなどにはウインドウズの関数を
つかってアクセスできるようなのですが、テルネットは、その関数では
対応してないようなんです。なにか他にあるんでしょうか。
- 406 :デフォルトの名無しさん :2001/05/07(月) 20:56
- 明日の「教えてクン」を目指す、>>405 に以下の文章を捧げる。
日々精進し、パソコンヲタクどもの親切を蹂躙してやれ。
努力を放棄すること。いやしくも「教えてクン」たるもの、努力をしては
ならない。過去ログを読んだり、検索してはいけない。「英語は苦手なの
で、分かりません。」は、高く評価できる。辞書片手にマニュアルやReadMe
を読むなど、決してしてはならない。他力本願と言われようと、自分で調
べたり試行錯誤したりせず、他人の努力の結果を搾取するのが、正しい
「教えてクン」である。
また、「もう何が悪いのかサッパリ分かりません。」と言ってふてくされ
るのも有効である。「サッパリ」という単語が「やる気の無さ」を効果的
に表現している。「原因を特定するには、何をすべきでしょうか?」と訊
いてしまうと自己の積極性が現れてしまうので、「教えてクン」失格であ
る。
情報を開示しないこと。使用OSや、機器構成などの必須の情報を知らせ
てはならない。マザーボード名やBIOSのバージョンも同様だ。具体的
なアプリ名やバージョンも隠蔽すべきだ。「DVD再生ソフト」のように
曖昧に表記しておけばよい。反対に「前から欲しいと思っていた○○」と
か「安売りされていた○○」 等の「どうでもいい情報」は、どんどん書
いてやれ。
トラブルの場合は、状況を正確に記述してはならない。「なんだかうまく
動きません。」とか「エラーが出ます。」等と具体的なことは何も書かな
いことが重要である。また、自分の試してみた事も具体的に書いてはいけ
ない。考えられる組合せのマトリックスを作成し、状況を整理するなどもっ
てのほかである。最悪の場合、それだけで問題が解決してしまうこともあ
るのだ。
「いろいろやってみたけど、動きません。」が理想的だ。
答える人間のことを考えないこと。「教えてクン」は、孤高の戦士である。
相手のことを考えるようでは教えてクン失格というものだ。以下のような
行動が、望ましい。
初心者であることを高らかに宣言し、初心者向けの丁寧で分かりやすい説
明を強要する。専門用語の使用を禁じておくとさらに効果的である。簡潔
な説明を禁じられたヲタクどもは、同じ内容を説明するのに、何倍もの労
力を強いられる。自分は努力せず、相手には多大な努力をさせることこそ
が「教えてクン」の真骨頂である。
マルチポストも有効である。そのBBSを信用していないことを明確に示
せる。「どうせ、お前らじゃ分からんだろう。」という意志表示として高
く評価できる。もちろんマルチポストの非礼をあらかじめ詫びてはならな
い。それでは、単なる「急いでいる人」になってしまう。それは、教えて
クンではない。
質問のタイトルは、「教えてください。」で良い。タイトルを読んだだけ
では「何に関する質問」か全く分からない。そういう努力は、答える人間
にさせれば良いのだ。とにかく、答える人間が答えやすいように気を使っ
て質問してはならない。傲慢で不遜な態度が必須である。「聞きたいこと
があります。」など、プロの仕事であろう。
最後に、言うまでも無いことだとは思うが、答えてくれた人達にお礼の言
葉を返すなど言語道断である。せっかく「教えてクン」を貫いてきたのに、
最後にお礼を言っているようでは、臥竜点睛を欠いていると言わざるを得
ない。質問だけしておいて、後はシカトが基本である。上級テクニックと
して、「そんなことはもう試しました。」とか、「そこまで初心者じゃあ
りません。」などと言って、回答者の神経を逆なでしておけば完璧である。
以上のことを踏まえて質問すれば、君も立派な「教えてクン」である。
ビバ! 教えてクン! 教えてクンに栄光あれ!!
- 407 :ころ :2001/05/07(月) 21:43
- ご指摘の通り、まったく努力していませんでした。
もうすこし、自分なりにチャレンジしてみます。
いろいろ本は立ち読みしたんですが、なかなかこれだ!
っていうのに出会えないんです。今後のライフワークの
ひとつとしてがんばっていきたいと思います。
- 408 :デフォルトの名無しさん :2001/05/07(月) 21:51
- >>406
まぁまぁ。
FAQ スレなんだから勘弁してやれよ。
コピペだけど。
- 409 :デフォルトの名無しさん :2001/05/07(月) 22:23
- >>400
っつーか、本気でやるつもり?相当ダルいよ、マジで。
- 410 :デフォルトの名無しさん :2001/05/07(月) 22:35
- プロトコルにあわせてプログラムを組むなら、
最低限RFCを読まないと話にならないよ。
普通は、RFCを読みながら四苦八苦してプログラムを組んで動作を確認していくもの。
ちょろっと眺めて出来ないと言う人間は、出来なくて当たり前。
- 411 :デフォルトの名無しさん :2001/05/07(月) 23:41
- >>407
ライフワークがそんなにいくつもあってたまるか!
- 412 :デフォルトの名無しさん :2001/05/08(火) 00:39
- 質問すれなのだろうけど、
上の見てたら何にも質問できないね
よってさげまんせー
- 413 :ころ :2001/05/09(水) 17:33
- いろいろためしてみて、VBからテルネットサーバーにアクセスすることができました。
まだデータのやりとりの部分は試していないのでこれから暇をみつけては前進して
いきたいと思います。ただ個人的にプロトコルの詳細およびしくみをよく理解していないので
そのへんの勉強していきたいと思っております。
- 414 :デフォルトの名無しさん :2001/05/10(木) 16:08
- age
- 415 :ころ :2001/05/13(日) 01:41
- >409
自分では組めないと思っていたプログラムを過去になんとか
完成させたことがありますので、多少時間はかかるかもしれませんが
がんばってみます。ただウインドーズ系のプログラムがほんと初めてなので
その辺でとまどっていますが、すこしづつ理解しつつあります。
- 416 :>415 :2001/05/13(日) 01:45
- >ウインドーズ系
カコイイ
- 417 :デフォルトの名無しさん :2001/05/13(日) 02:50
- >>403
TELNETプロトコル以外ならな
TELNETプロトコルのときは端末性能のチェックとかするだろ
- 418 :ころ :2001/05/13(日) 20:58
- とりあえず、データも完璧とはいえませんが、受信できました。
しかし、受け取る量がでかいのかわかりませんが、うまく表示できていません。
あとはすこしVBの勉強でもすればなんとかなるかなと、思っています。
あまいでしょうか。完璧にするには、あとしばらくかかると思いますが、
なんとかなると思います。結局、ここでは何も教わりませんでしたが
やる気みたいなものを与えてくれたことを感謝いたします。
- 419 :ころ :2001/05/13(日) 23:26
- サーバーからのデータは受け取れるのですが、
こちらからの送信した内容を相手が処理してくれません。
このあたりから難しいですね。テルネットは。
- 420 :デフォルトの名無しさん :2001/05/13(日) 23:52
- ころくんはtelnetがなんなのかわかっているのかな?
- 421 :デフォルトの名無しさん :2001/05/14(月) 17:46
- 火葬短足
- 422 :承認のロジックについて教えてください。 :2001/05/15(火) 10:46
- 承認のロジックについて教えてください。
acceptした後、その相手が対象のソフトからであるかどうかの
チェックはどのようにやってますか?
私はacceptの後、タイムアウトのために、SetTimerを行い
クライアントから固定長のデータを送信させ、
そのデータ内容により対象のソフトからの接続かチェックします。
そのデータが間違っていた場合、又は、タイマーメッセージがきた時までに、
承認が完了していなかった場合はそのSOCKETはclosesocketします。
関係ないかもしれませんが、selectで接続・送受信とも非同期を設定しています。
Winsockは1.1を使用しています。
皆さんはどのような方法をとっていますか?
- 423 :デフォルトの名無しさん :2001/05/15(火) 15:11
- acceptでソケットが生成されたら、
認証用スレッドに回し、そこからキーデータを送信、
相手がキーに対応したデータを返したら承認。
- 424 :デフォルトの名無しさん :2001/05/15(火) 22:34
- Winsock難しいすぎないか?
- 425 :デフォルトの名無しさん :2001/05/17(木) 00:22
- アギョ
- 426 :デフォルトの名無しさん :2001/05/17(木) 07:29
- UNIXのUDPマシン間通信で サーバ落ちてたりして、パケットが帰ってこなかった場合
どのようにタイムアウト処理をすればよいでしょう? select() を使うべきですか?
それとも他にいい手段ありますか?
- 427 :デフォルトの名無しさん :2001/05/17(木) 09:11
- >>426
select()がいやならalarm()つかえば?
どっちがいいのかはよくわからん。
- 428 :デフォルトの名無しさん :2001/05/17(木) 10:01
- 伝統的にselectかpollじゃない?
単純なタイムアウトなら簡単だし。
複数だと結構めんどくさいけどね。
- 429 :426 :2001/05/18(金) 03:03
- なるほど alarm() poll() なんて関数があったんですね 調べて試してみます
ありがとう
- 430 :デフォルトの名無しさん :2001/05/18(金) 15:44
- つか、帰ってくるとなぜ解る?
- 431 :デフォルトの名無しさん :2001/05/18(金) 15:46
- 初カキコなんですが、ビギナーみたいなこと聞いていいですか?
- 432 :ころ :2001/05/19(土) 17:36
- テルネットのプログラムで愚問いばかりしていたものです。
結局のところいきついたところはRFCでした。やはりRFCを読まずに
なんとかしようと思ったのは馬鹿でした。
はじめにRFCを読めっていってくれた方に感謝いたします。
だいぶ、テルネットのプロトコルについて分かってきました。あとは
トライ&エラーでがんばっていきたいと思います
>431
とりあえずなにが知りたいのですか。愚問いでもなにか、突破口みたいな
ものは開けるかもしれません。
- 433 :デフォルトの名無しさん :2001/05/24(木) 18:24
- 一応優良スレですので、
- 434 :Winsock :2001/05/24(木) 19:30
- 一度 listen開始したソケットのlistenを止めるには
どうしたらよいのでしょうか?
- 435 :デフォルトの名無しさん :2001/05/24(木) 22:44
- listenを0にすれば?
- 436 :434 :2001/05/24(木) 23:27
- えー?
でも、引数に指定する数は1〜5ってあったよ?
大丈夫なのかなあ?
- 437 :デフォルトの名無しさん :2001/05/25(金) 04:42
- >>434
close()
- 438 :ころ :2001/05/26(土) 09:50
- テルネットのクライアントできました。送受信ともにokになりました。
割と簡単にできたのでびっくりでしたが。ほとんどwinsockの知識はないんですが
なんとかなるもんなんですね。
- 439 :デフォルトの名無しさん :2001/05/28(月) 22:01
- WindowsでIRCクライアント作ってるんだけど、思ったより難しいなあ。
一つのチャンネルだけなら問題無いんだけど、二つ以上のチャンネルの処理が
全然分からない・・・。
- 440 :デフォルトの名無しさん :2001/05/31(木) 16:27
- メールソフトみたいにmail.hoge.comと指定すれば、
サーバに接続して受信するプログラムを作ろうとしましたが、
connect()で指定するのはIPアドレスなので、
ドメイン名からIPアドレスに変換する方法がわかりません。
変換する関数や、アルゴリズムを教えてもらえませんでしょうか?
Windows,UNIXどちらでも結構です。開発言語はC言語です。
よろしくお願いします。
- 441 :デフォルトの名無しさん :2001/05/31(木) 16:31
- >>440
gethostbyname
- 442 :デフォルトの名無しさん :2001/05/31(木) 16:46
- >>440
それぐらいは、googleででてきますよ。
- 443 :440 :2001/05/31(木) 17:32
- >>441
gethostbyname
使ってみましたが、HOSTSファイル内での検索しかしていないみたいです。
>>442
ドメイン IPアドレス C言語 プログラム
などで検索してみたのですが、見つかりませんでした。
見落としたのかもしれないので、もう1回調べてみます。
- 444 :441 :2001/05/31(木) 18:15
- >>443
それはリゾルバの設定をしていないから。
あるいはDNS等がまともに動いていないから。
もう少し自分で調べてから書き込もうね。
- 445 :デフォルトの名無しさん :2001/05/31(木) 20:04
- nslookupのソースを読もう
- 446 :443 :2001/06/01(金) 11:06
- >>444
リゾルバ
この単語、初めて聞きました。
これを元に何とかなりそうです。
ありがとうございました。
>>445
nslookupのソースを読もう
この手もありますね。
googleで検索して、ソースを見てみます。
- 447 :くまたん :2001/06/05(火) 20:07
- ころ改め、くまたん
自作テルネットクライアントで
ネゴシエーション状況を表示させたいのですが。。。
- 448 :デフォルトの名無しさん :2001/06/08(金) 15:46
- TCP接続で教えて下さい。
現在、特定のServerのTCP-portに対して接続が出来るかチェックするプログラム
を書いてます。
単にconnect()が成功するかどうかを見るだけなんですが…
この機能自体は簡単に実装できたのですが、問題は相手のServer自体が
完全に落ちている場合に、connect()発行後にタイムアウトするまで
結構な時間がかかりますが、これを短縮させる方法がわかりません。
このタイムアウトするまでの時間を短縮する事は可能なのでしょうか?
可能であれば方法を教えて下さい。宜しくお願いします。
- 449 :448 :2001/06/08(金) 15:47
- sageてどうする>俺
- 450 :デフォルトの名無しさん :2001/06/08(金) 16:23
- >>448
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.5
- 451 :デフォルトの名無しさん :2001/06/08(金) 17:01
- VCでwinsockの使い方をおしえてください
- 452 :デフォルトの名無しさん :2001/06/08(金) 17:01
- VCでwinsockの使い方をおしえてください
- 453 :デフォルトの名無しさん :2001/06/08(金) 17:09
- >>452
何をどう教えればよいのか教えてください
- 454 :448 :2001/06/08(金) 17:42
- >>450
connect前にsignalしかけてalarm()置いたらばっちり期待通りの動作になりました。
回答有難う御座いました。
- 455 :452 :2001/06/08(金) 18:30
- >>453
どんなことでもいーんです
おねがいします
- 456 :デフォルトの名無しさん :2001/06/08(金) 18:51
- >>455
じゃぁ一つだけ教えてやろう。
「お前にはプログラマとしての適性が全く無い」
- 457 :デフォルトの名無しさん :2001/06/08(金) 19:45
- >>456
親切だね。ここまで適切なコメントしてあげる人は滅多にいない。
- 458 :デフォルトの名無しさん :2001/06/08(金) 23:58
- wininet.h って何に使うのですか?
- 459 :デフォルトの名無しさん :2001/06/09(土) 00:04
- >>458
wininet.hを何に使いたいのですか?
- 460 :458 :2001/06/09(土) 00:35
- afxwin.hって何に使うんですか?
- 461 :458 :2001/06/09(土) 00:36
- ファイヤーワォールを作りたいのですが。
- 462 :デフォルトの名無しさん :2001/06/09(土) 00:38
- テルネットのオプション設定できるひといますか。
接続した瞬間にログインメッセージがきてしまいます。
ネゴシエーションの状況も受け取りたいのですが
うまくいきません。なんでかな。
- 463 :デフォルトの名無しさん :2001/06/09(土) 00:43
- SSL(https)でwebサーバ(NES)と通信するクライアントプログラムを作成したいのですが、
WinsockのAPIだけでは無理ですよね?
もしそうだとすると、一体なんのライブラリを使えば可能でしょうか?
ふと世にあるフリーソフトなんか見るとSSLには対応してないことが多く、
あまり参考になるようなソースを得ることができません。
ひょっとしてあまりSSL対応のフリーソフトが無いのはライセンスの問題とかありますか?
やはりIEやNeckoなんかのCOM(?)を利用するしかないのでしょうか。
コンポーネントプログラムってやったことないので・・・。
SSLのハンドシェイクを1から実装するのは現実的ではないと思いまして・・。
回答よろしくお願いします。
#あとWWWクライアントでSSL実装してるソースなんか落ちてたら教えて頂けませんでしょうか。
- 464 :458 :2001/06/09(土) 00:51
- >>460
afxwin.h はMFCがらみじゃなかったっけ?
- 465 :&Hearts; :2001/06/09(土) 01:31
- 2chのIDから、IPを割り出すにはどーすればいーのですか?
- 466 :デフォルトの名無しさん :2001/06/09(土) 01:39
- >>465
ご自分でお調べなさい
http://www.google.com/
- 467 :♥465♥ :2001/06/09(土) 01:41
- サンクス >>466
- 468 :デフォルトの名無しさん :2001/06/09(土) 01:56
- >> 463
http://www.openssl.org
- 469 :超初心者 :2001/06/09(土) 03:01
- UNIXで使用しているUDPのポート番号の範囲を調べるにはどうすればよいでしょうか?
- 470 :超初心者 :2001/06/09(土) 03:33
- >>469
ポートスキャンすればいいんでしょうか?
ほんと何も知って無くてすいません
- 471 :デフォルトの名無しさん :2001/06/09(土) 03:34
- APIをフックして、ファイヤーウォールみたいなものを作る事って可能でしょうか?
- 472 :デフォルトの名無しさん :2001/06/09(土) 03:42
- >>469
netstat
>>471
可能。つーか何がしたい?
- 473 :471 :2001/06/09(土) 05:00
- >>472
どこかへ勝手にアクセスしているかどうか調べたいのです。
他人の作ったツールは怖くて使えません。
- 474 :デフォルトの名無しさん :2001/06/09(土) 19:46
- >>473
ログがとれるルータ買えば?
- 475 :デフォルトの名無しさん :2001/06/10(日) 01:18
- WinInit って WinSockを使わないでインターネットにアクセスしていませんか?
WinInit.dllをデバッガで見ると、WSock32.dll から関数をインポートしていません。
- 476 :デフォルトの名無しさん :2001/06/10(日) 02:04
- >>475
ほんと?
他のDLLやコンポーネント経由とかじゃなくて?
- 477 :デフォルトの名無しさん :2001/06/10(日) 03:26
- ほんとだ。 モジュールとしてロードされていない。
- 478 :デフォルトの名無しさん :2001/06/10(日) 05:14
- selectについて詳しいサイトって無いですか?
- 479 :デフォルトの名無しさん :2001/06/10(日) 05:40
- >>478
socket, poll, pipe というキーワードと一緒に検索すると
いいかもしれない。
- 480 :デフォルトの名無しさん :2001/06/10(日) 05:50
- >>478
ありがとうございます。
色々出てきました
- 481 :デフォルトの名無しさん :2001/06/10(日) 06:46
- windowsのselectって、
openやpipeとかのハンドルも認識する?
- 482 :デフォルトの名無しさん :2001/06/10(日) 07:12
- >>481
winsockのselectに入れられるのは、winsockで作ったソケットだけだと思う。
WaitForMultipleObjectsのレイヤまで降りれば、
ソケット/ファイル/パイプ/スレッド/プロセス/メッセージキュー/etc.
(ぶっちゃけた話、非同期処理ほぼすべて)
のイベントを待つことができるんだが...winsockとの絡みが分からん。
詳しい奴の登場を待つ。
- 483 :デフォルトの名無しさん :2001/06/10(日) 09:23
- >>475
plugable protocol handler とかそのへんのドキュメントを
読めば、http(s) や ftp のプロトコルハンドラがTCP/IP を
使っているわけで、wininet はその層については関知していない
ということがわかります。
- 484 :デフォルトの名無しさん :2001/06/10(日) 09:25
- >>482
Windows NT 系列の Winsock2.0 なら、ソケットも
WaitFor*Objectで待てる。
- 485 :デフォルトの名無しさん :2001/06/10(日) 11:17
- >>482
CreatePipeで作ったパイプはWaitFor〜が効かない。
CreateNamedPipeにFILE_FLAG_OVERLAPPEDを与えて
作らないと駄目じゃないかな?
>>484
正しいやり方はWSAAsyncSelectでイベントに結びつけるか、
WSARecvでオーバーラップにしてWaitFor〜でしょ。
どちらにしても、WSAAsyncSelect以外はselectでのポーリング
とロジックの作り方が変わるので注意が必要。
- 486 :デフォルトの名無しさん :2001/06/10(日) 15:43
- VCでネットワークプログラミングを勉強したいのですが
何かいい本、またはホームページはありませんか
あったら教えてください。お願いします
- 487 :デフォルトの名無しさん :2001/06/10(日) 17:40
- >>486
俺は昔のCマガの特集と、極めるVisualC++で勉強した。
結論:いい本で勉強した方が遙かに吸収が早いです。
- 488 :486 :2001/06/10(日) 19:36
- >>487
そう思うんですが地方に住んでいるのでなかなか本の内容が
わからずに買うのをためらってしまうんです。
書評とかがもっと増えれば安心して買えるんですが...
- 489 :481 :2001/06/10(日) 20:51
- ということは、windowsで単一スレッドコンソールの
チャットクライアントを作るような場合、
selectをタイムアウト付きでポーリングして、
ユーザー入力にはkbhitで判定するのが一番自然でしょうか?
(WaitFor〜レベルまで降りたくないので)
- 490 :デフォルトの名無しさん :2001/06/10(日) 22:57
- age
- 491 :デフォルトの名無しさん :2001/06/10(日) 23:22
- sendする時に、selectで待たないで、
連続してsendしていくと何か問題あるでしょうか?
selectの2番めの引数の使い方がわからないです。
recvならメッセージが着るって事で理解できるんですが。
- 492 :475 :2001/06/10(日) 23:59
- >>475
動的にロードしていた。
- 493 :デフォルトの名無しさん :2001/06/11(月) 00:08
- よくポートが空いていると言いますが、
これは、そのポートがlistenになっているって事ですか?
そして、要求があれば、acceptするのですか?
そして、例えばプリンタポートが空いていたら、
外部からプリンターの操作が可能になるのですか?
良く分からん。
- 494 :デフォルトの名無しさん :2001/06/11(月) 00:12
- >>491
(sendできない状態ってのを、相手が送信を受け付けて無い状態って前提で話すけど)
sendできない状態でsendしていくと、
ソケットのバッファに溜まっていくんじゃない?
溢れたらエラー返ってくるとか。
(「溢れた場合」ってのがあるのか疑問だけど、恐らく一定サイズで切り上げるんだと思う。)
結局、相手が受信しない限りは、ソケットのsend内部バッファ?に
どんどん溜まっていく筈だから、selectして送信状況を把握していく処理は必要だと思う。
ちなみにこれは推測だから実際の所は知りません。ごめんね。
詳しい人が現れるのを待ちましょう。
- 495 :デフォルトの名無しさん :2001/06/11(月) 00:18
- >>493
恐らく、何らかのサーバーアプリがそのポートにbindしてなければ、
「ポートが空いている」という事では?
使ってたらbindは失敗すると思う。
- 496 :デフォルトの名無しさん :2001/06/11(月) 00:58
- オフラインで、ソケットを使ったアプリ間の通信したいのですが、
どうするのでしょうか?
socket関数がINVALID_SOCKETを返すので先に進みません。
- 497 :デフォルトの名無しさん :2001/06/11(月) 01:02
- localhostでやれば?>496
hosts参照
- 498 :デフォルトの名無しさん :2001/06/11(月) 01:38
- >>496
INVALID_SOCKETって、socket()が失敗するってこと?ソケット層
のレベルではオンラインもオフラインもないと思うんだけど。
WSAStartup()を呼んでないだけ、なんてオチじゃないよね?(藁
とりあえず、WSAGetLastError()で理由を調べてみましょう。
- 499 :496 :2001/06/11(月) 01:54
- WSAStartup()を忘れていました。
うまく行きそうです。
487さん、498さんありがとうございます。
んー、他のプロセスが一度でもWSAStartup()を呼んでいれば、
エラーにならないのかなぁ。
WSAStartup()が無くてもエラーにならない事があったから…。
- 500 :デフォルトの名無しさん :2001/06/11(月) 02:19
- >> 493
ソケットとかでいう「ポート」とプリンタポートっていうときの「ポート」は
別物だぜよ。
- 501 :デフォルトの名無しさん :2001/06/11(月) 02:22
- >>494
sendは1度の呼出しで送信可能状態になるまでブロックする。
そのブロックしている間に何かしたいならば、selectを使用する。
ってこと。
sendでブロックしてもいいならsekectしなくても良い。
- 502 :デフォルトの名無しさん :2001/06/11(月) 22:54
- afe
- 503 :デフォルトの名無しさん :2001/06/11(月) 23:26
- まともなの作るつもりならselectでタイムアウト検出は必要だと思われ。
- 504 :デフォルトの名無しさん :2001/06/12(火) 04:32
- WSAStartup() がエラーを返した時も、
WSACleanup() を呼ぶ必要があるのでしょうか?
以下ヘルプ。
>There must be one WSACleanup call corresponding to every successful
>WSAStartup call to allow third-party DLLs to make use of a Windows
>Sockets DLL on behalf of an application. This means, for example,
>that if an application calls WSAStartup three times, it must call
>WSACleanup three times. The first two calls to WSACleanup do nothing
>except decrement an internal counter; the final WSACleanup call for the
>task does all necessary resource deallocation for the task.
- 505 :デフォルトの名無しさん :2001/06/12(火) 10:06
- >>499
他のプロセスは関係ない。自分のプロセス内のDLLが初期化した
場合は使える。>>504の記述にあるとおり、DLLが勝手に初期化
しても平気なように、WSAStartupを呼んだ回数分WSACleanupを
呼ばなきゃいけない仕様になっている。
>>504
内部の実装は知らんが、常識的に考えて失敗した場合も内部の
カウンタを増加するように実装する?つまりそゆこと。
#M$は何でWSAStartupを呼ばなきゃいけないように作ったんだ?
- 506 :デフォルトの名無しさん :2001/06/12(火) 12:17
- M$ わ、というか元の (Win3.1 の頃の) Winsock がライブラリ
レベル (DLL) でのソケット API サポートだったからでわ。
UNIX はカーネルレベル (って表現で良い?) のサポートだから
初期化はいらない。
- 507 :デフォルトの名無しさん :2001/06/12(火) 12:28
- 補足: Win3.1 の頃のしょっぱなは Win 標準で Winsock をサポート
していたわけではなかった (と記憶する)。サードパーティから DLL
形式で Winsock が出ていた。Trumpet Winsock とか、わけ分からず
設定した覚えがある (DNS とか何のことか分からんかった)。途中で
M$ がそれを買ったのかパクッたかして Win 付属の標準ライブラリと
なった。今の Winsock はそのままずるずる引きずってんじゃないの?
(確かに Winsock2 に変わったときに OS レベルでサポートしても
良かったのでは、と思う)
- 508 :505 :2001/06/12(火) 12:58
- そろそろsocketをkernel32.dllのAPIにして欲しいね。
他のファイル関係のAPIと同じように、UNIX風の関数は
Cライブラリに取り込めば使い勝手よくなると思うぞ。
CreateSocket()を_socket()で包むような感じで。
ついでにパイプやコンソールもselect出来るようになれば
嬉しいね。何でCreatePipeのハンドルをpolling出来ない
仕様にしたんだろうね。まったく。
- 509 :デフォルトの名無しさん :2001/06/12(火) 23:53
- 標準入出力モナー>508
select使えなさスギ
- 510 :デフォルトの名無しさん :2001/06/13(水) 04:25
- __WSAFDIsSetって何に使うのですか?
- 511 :デフォルトの名無しさん :2001/06/14(木) 04:34
- WinSockを使わないとすると、インターネットへのアクセスはどうなるのでしょうか?
直接デバイスドライバとやり取りするのですか?
でも、これだとハード毎に異なりますよねぇ〜。
WinSockのフックは出来たのですが、検出できないアクセスがあるもので…。
- 512 :デフォルトの名無しさん :2001/06/14(木) 20:18
- rawソケットを使ってTCPソケットと同じことをやろうとした場合、
パケットの送受信って何を使えばいいのでしょう?
- 513 :デフォルトの名無しさん :2001/06/16(土) 04:49
- Windowsでソケット使う場合ってBSDスタイルのワーカスレッド形式が良いですか?
- 514 :デフォルトの名無しさん :2001/06/16(土) 04:52
- test
- 515 :超初心者 :2001/06/16(土) 23:43
- pingのTオプションについて教えてもらえませんか
どうやって指定するのでしょう。マルチキャストがいまいち・・・
またこれを使ってtracerouteの替わりにできるとも聞いたのですが
実際どうなんでしょう。
- 516 :デフォルトの名無しさん :2001/06/17(日) 00:35
- >>515
そんなあなたに ping -f がオススメです
- 517 :デフォルトの名無しさん :2001/06/17(日) 00:47
- >>515
Tオプションと言われても実装されている環境によって意味が違うの
では?Win98ではそのようなオプションはありませんでした。
多分「ping -T 値」って指定するのでは?
- 518 :超初心者 :2001/06/17(日) 01:23
- >>517
usage: ping [-QRadfnqrv] [-c count] [-i wait] [-l preload] [-p pattern]
[-P policy] [-s packetsize] [-S src_addr] [-t timeout]
[host | [-L] [-I iface] [-T ttl] mcast-group]
こんな感じの環境です
fオプションはないみたいですね。
- 519 :デフォルトの名無しさん :2001/06/17(日) 01:56
ソケット通信ほとんど素人の者です。
ソケット通信で Send メソッドで通信する場合
一度で送るサイズをこうした方が良いとかありますか?
1MBのデータを送る場合、1回の Send で1MB送るのではなく
10KBに分けて100回 Send を行った方が効率的ってことありますか?
(自分で試せ!ってツッコミはイヤ〜ン。)
それとMSDNのサポート技術文書「[SDK32] 送信サイズが小さいと TCP/IP のパフォーマンスが低くなる」ってところにMTUサイズがどうのこうのって書いてありますがこれはどう言うことでしょうか?
1460バイト単位らしいですが普段気に留める必要はあるのでしょうか?
環境はVC++6.0です。
お・し・え・て
- 520 :デフォルトの名無しさん :2001/06/17(日) 02:01
- い・や・よ
- 521 :デフォルトの名無しさん :2001/06/17(日) 03:13
- >>518
TTLの値はIPパケットの生存時間で0なら破棄されたと思います。
この値の減り方はよく知りませんが、ルータなどを超えると減ったと
思います。
pingとtracerouteは同じICMPのECHOリクエストとECHO応答を使う
プログラムですが、tracerouteはTTLの値でパケットが破棄される仕
組みを利用していたと思います。詳細はtracerouteのソースを読ん
でください。それに合わせてpingを利用するなら使えそうな感じが
します。
- 522 :超初心者 :2001/06/18(月) 22:04
- 結局Tオプションはどのようにアドレスを指定すればいいんでしょう。
224.0.0.1としてみたら何かは表示されましたが
普通のアドレスだとこうなります。
> ping -T 10 アドレス
ping: -I, -L, -T flags cannot be used with unicast destination
- 523 :デフォルトの名無しさん :2001/06/18(月) 22:14
- >>515
板違い。通信技術板へいきませう。
- 524 :超初心者 :2001/06/18(月) 23:35
- >>523
そうします
- 525 :デフォルトの名無しさん :2001/06/21(木) 03:33
- WinSock1と
WinSock2って何が違うんですか?
- 526 :デフォルトの名無しさん :2001/06/21(木) 06:40
- UNIXネットワークプログラミングは基本ですか?
- 527 :デフォルトの名無しさん :2001/06/21(木) 15:06
- >>526
というかマトモな本がそれしかない
- 528 :デフォルトの名無しさん :2001/06/21(木) 15:30
- >>519
素人です。
自分は2000バイトずつに分けてます。
1回ずつACKを受け取ってから送信するようにしてます。
正しいかどうかわからないけど、動いてます。
1MBを1回のSendでは無理だと思います。
- 529 :デフォルトの名無しさん :2001/06/21(木) 18:41
- >>528
サンキュ。
これから本格的なMLに聞いてくる。
とりあえずレスありがと。
- 530 :512 :2001/06/22(金) 16:18
- 結局この板にはrawソケットでプログラミングできる人が居ないのね。
- 531 :デフォルトの名無しさん :2001/06/22(金) 16:35
- >>530
Berkeley Packet Filterでも使えば?
- 532 :512 :2001/06/22(金) 17:21
- >>531
Berkley Packet Filterをちょっと調べてみたらパケットのスニファー
みたいな用途っぽいですね。やりたいのはconnect()などの制御
とデータパケットの送受信をrawソケットで実現させること。
環境は書いてませんでしたが、AIXかHP-UX。あるいはLinuxでも
OK。
- 533 :デフォルトの名無しさん :2001/06/23(土) 04:06
- >>532
LinuxでいいんならTCP実装のソース読めばいいんでねえの?
- 534 :512 :2001/06/24(日) 23:06
- >>533
Linuxカーネルって全くといって良いほどソースを読んだことが無いです
が、rawソケットで実装されてるのですか?なかなか奥の深い助言です
ね。
カーネルソースをみてみましたが、net/ipv4辺り?としかわかりません。
ソースを読むにあたって、システムコールに対応するソースは何処か
解説のあるサイトはご存知でしょうか?
- 535 :デフォルトの名無しさん :2001/06/25(月) 00:45
- <form method='POST' action="http://aaa/ssss.cgi">
<input type=hidden name="get" value="143242341324">
<input type=submit value="abcd">
</form>
このCGIの出力結果を見るにはどんな文ををサーバーに送れば見ることが出来ますか?
おしえてください
- 536 :デフォルトの名無しさん :2001/06/25(月) 03:39
- > あるいはLinuxでも OK。
BPFってありました? 相当する機能はあったと思うけど..
- 537 :512 :2001/06/25(月) 23:21
- Berkley Packet Filterをしっかり調べれば問題解決するということ
ですね。詳細を調べてみます。
- 538 :デフォルトの名無しさん :2001/06/27(水) 20:52
- DirectPlayってルータとか通すときプロコトルがNATでないといけませんよね。
うちのはNATeなのですがヤフメなどは使えます。
で、ポートの役目リストみたいなページで、ヤフメのポートが記述してあったのですが、、
WinSockなど特別な方法を使えばふつーに通信できるのでしょうか?
判りにくくてスミマセン(汗
具体的に言うとマイクロソフトメッセンジャーなどは1:1で会話や通信できるのに
(どこかでサーバ介している??)
DirectPlayを使うと(というよりわたしの技術では)東急ケーブルなどのローカルIPなプロバイダの人とは
ネットワークゲームが出来なかったりするのです。(どうにかNATeにも対応させたいし、、)
回避する方法はないのでしょうか。。
資料などありましたらこのバカにも判りやすく具体的によろしくお願いします
(ここの何処にあるとか。。)
- 539 :デフォルトの名無しさん :2001/07/02(月) 12:30
- TCP/IPのパケットデータを覗くソフトってあるんでしょうか?
Win2000使ってます。
- 540 :デフォルトの名無しさん :2001/07/02(月) 14:34
- >>539 PacMon
http://www.layer.co.jp/
- 541 :デフォルトの名無しさん :2001/07/02(月) 19:59
- フリーウェアならethereal、Analyzerがあります。
メニューなどが英語ですけど十分使えます。
Analyzerの英語(日本語ならベターだけど)ドキュメントが欲しいところ。
- 542 :デフォルトの名無しさん :2001/07/03(火) 13:11
- >>538
NATって何なのかもう少し理解してから書き込んで下さい
- 543 :デフォルトの名無しさん :2001/07/03(火) 15:32
- NATの理解がNATらん
- 544 :デフォルトの名無しさん :2001/07/03(火) 23:59
- >>543
回線で足つってください。
- 545 :デフォルトの名無しさん :2001/07/04(水) 00:38
- NATく行かん
- 546 :デフォルトの名無しさん :2001/07/04(水) 00:56
- >>545
回線で足つって氏んで下さい
- 547 :デフォルトの名無しさん :2001/07/05(木) 19:41
- 厨房質問ですいません。
ftp-data 20/tcp
や
netbios-dgm 138/tcp nbdgm
netbios-dgm 138/udp nbdgm
のように実際のセッションがあるときにしか使われないポートが
開いているかどうかを調べるには対応する
ftp 21/tcp
とか
netbios-ssn 139/tcp nbssn
が開いていることで判断すればいいのでしょうか?
それとも上記のデータ送信ポートが開いていることを
セッションを作らずに直接調べる方法があるのでしょうか?
- 548 :s :2001/07/05(木) 19:54
- おまえらたいどがNATらん.
- 549 :デフォルトの名無しさん :2001/07/06(金) 00:44
- 厨房警報NATるで
- 550 :デフォルトの名無しさん :2001/07/06(金) 00:49
- 怪傑ズNAT
- 551 :デフォルトの名無しさん :2001/07/06(金) 01:05
- (ソケット使うならTCP/IPって普通に勉強するもんじゃなかったのか。。。
- 552 :デフォルトの名無しさん :2001/07/06(金) 02:16
- >>545
激しくワラタ
- 553 :デフォルトの名無しさん :2001/07/06(金) 05:28
- >>551
ソケット使う「だけ」ならそれほど勉強する必要はない。
- 554 :デフォルトの名無しさん :2001/07/06(金) 11:03
- 1、CGIでURLエンコードするときのデフォルトの文字コードは決まってるんでしょうか?
2、SJISのエンコードは %XX で言いと思うんですが、他の文字コードのエンコードは
どうやってやるのでしょうか?
UNICODEとかの場合は %XXXX で良いのでしょうか?
- 555 :デフォルトの名無しさん :2001/07/06(金) 12:53
- >>554
%xxは文字コードのエンコードじゃなくてバイナリのエンコードだから
S-JISだろうとEUCだろうとunicodeだろうと全部%xxの組み合わせダヨ。
デフォルトの文字コードはどうなんだろうね。発信元依存じゃないのかな?
- 556 :デフォルトの名無しさん :2001/07/06(金) 13:13
- >>554
URL-Encode は単にエンコード方式を規定しているだけで、charset の規定はない。
- 557 :554 :2001/07/06(金) 20:05
- 555さん556さん、ありがとうございます。
わかりましたです。
- 558 :デフォルトの名無しさん :2001/07/07(土) 00:06
- このスレ、レベル低いね。
- 559 :デフォルトの名無しさん :2001/07/07(土) 01:27
- 甘NATう
- 560 :七夕 :2001/07/08(日) 01:05
- 願いがかNATいいね
- 561 :デフォルトの名無しさん :2001/07/09(月) 12:56
- NATって大豆を水につけて煮たものに納豆菌をつけてワラの中に入れて発酵させたものでしょ?
- 562 :デフォルトの名無しさん :2001/07/09(月) 17:09
- そら納豆や
- 563 :デフォルトの名無しさん :2001/07/09(月) 23:20
- NATゃん
- 564 :デフォルトの名無しさん :2001/07/10(火) 12:55
- age
- 565 :デフォルトの名無しさん :2001/07/10(火) 17:05
- おもしろかった
- 566 :デフォルトの名無しさん :2001/07/10(火) 17:19
- Windowsで、WinInet使わずにWinSockでHTTPするのはバカですか?
- 567 :デフォルトの名無しさん :2001/07/10(火) 17:30
- ・WinInetのバージョンに左右されたくない
・IEが入ってなくても使えるようにしたい
等の理由があれば馬鹿じゃないだろ
- 568 :デフォルトの名無しさん :2001/07/10(火) 18:39
- わたしもWinsock派だよん
- 569 :デフォルトの名無しさん :2001/07/10(火) 18:43
- >>567
なるほど、じゃあ、そういうことにしておきます。
プロトコル調べて、自力で動かすのが楽しいからやってただけなんですが(笑)
- 570 :デフォルトの名無しさん :2001/07/11(水) 11:54
- すにっふぁしたあい('-`)
- 571 :デフォルトの名無しさん :2001/07/11(水) 12:03
- proxy とか使ってる人がいるかもしれないから、
WinInet 使えるんなら使っておいたほうが良いと思う。
- 572 :デフォルトの名無しさん :2001/07/11(水) 12:32
- winsock2使えアホボケ
- 573 :デフォルトの名無しさん :2001/07/11(水) 12:37
- >>571
proxyも自分でつないじゃ駄目?
- 574 :デフォルトの名無しさん :2001/07/11(水) 13:02
- >>573
IEの設定を使いたいって事でしょ
自力で探ると結構面倒だし
- 575 :デフォルトの名無しさん :2001/07/11(水) 14:13
- JavaScriptで自動構成とかされてると自力じゃどうやっても取れない。
厳密にはJavaScriptエンジンまで作れば取れるだろうけどそこまでする
ならWinInet使うぞ。
WinInetで困ったのがIE5あたりで追加されたフラグをうかつに立ててると
IE3環境でERROR_INVALID_PARAMETERになること
- 576 :デフォルトの名無しさん :2001/07/11(水) 14:27
- あと https がタダで使えるのも美味しいぞ>WinInet
- 577 :デフォルトの名無しさん :2001/07/12(木) 03:20
- Winsockのselectは効率割悪いってよ。>使ってる人
詳しくはアスキーのマルチスレッドプログラミングって本参照
- 578 :デフォルトの名無しさん :2001/07/12(木) 06:13
- IriaやらRegetのレジューム機能
ってどうやって実現されてるの?
- 579 :デフォルトの名無しさん :2001/07/12(木) 06:36
- >>577
NTならIO完了ポートを使うのが常識。
- 580 :デフォルトの名無しさん :2001/07/12(木) 06:38
- >>578
要求ヘッダで「ここの位置からのデータを頂戴」と書いてサーバーに伝えてるだけです。
詳しくはIriaやRegetのログ出力を見れ。
- 581 :デフォルトの名無しさん :2001/07/12(木) 10:34
- >>578
その手ことが知りたいならRFC嫁やゴラァ
- 582 :デフォルトの名無しさん :2001/07/14(土) 01:29
- winsockレベルでproxy経由でアクセスってどうやるんですか?
- 583 :デフォルトの名無しさん :2001/07/14(土) 02:31
- GET http://www.2ch.net/ HTTP/1.0
- 584 :デフォルトの名無しさん :2001/07/14(土) 12:29
- HTTP1.0/1.1のRFC読めって?
- 585 :デフォルトの名無しさん :2001/07/14(土) 12:37
- >>582
おいおい(ワラ
- 586 :デフォルトの名無しさん :2001/07/14(土) 14:41
- プロキシサーバに接続した後、>>583 みたいに URI 部分に
スキームやホスト名まで指定してやれば可能。プロキシが
対応していれば ftp:// ってのも HTML 形式で返してくれるぞ。
あとは Cache-Control とかだな。
- 587 :デフォルトの名無しさん :2001/07/15(日) 00:19
- >>585はなんでワラってるの?
- 588 :デフォルトの名無しさん :2001/07/15(日) 01:24
- >>587
winsock使ってる時点で、自力で串とお話する以外ないからだろ?
- 589 :デフォルトの名無しさん :2001/07/15(日) 01:28
- ?
そのやりかたを教えてくれって言ってるんじゃないの?>588
- 590 :デフォルトの名無しさん :2001/07/15(日) 01:36
- >>589
winsock使ってる時点で、プロキシ経由しようが
しまいがあんまり変わんないんだよ。
- 591 :デフォルトの名無しさん :2001/07/15(日) 01:40
- >>589
ということで、それを聞くということは、
プロキシ経由しないやり方もよく分かってないんじゃないかと
思うわけさ(ワラ
- 592 :デフォルトの名無しさん :2001/07/15(日) 02:26
- で、>>589と>>591はなんでワラってるの?
- 593 :デフォルトの名無しさん :2001/07/15(日) 02:37
- Raw Socket反対!!!!
IPヘッダー書き換える
馬鹿なクラッカーが増えるだけ!!!
- 594 :デフォルトの名無しさん :2001/07/15(日) 05:50
- 包丁反対!!!!
人を刺す
馬鹿な犯罪者が増えるだけ!!!
- 595 :デフォルトの名無しさん :2001/07/15(日) 10:24
- Raw SocketないとPingもできないから困る
- 596 :デフォルトの名無しさん :2001/07/15(日) 10:26
- HTTPわかってない奴は無理にSocketでHTTPを実装しようとするな。
RFC読めとまではいわないからせめて本でも買って仕組みを勉強しろ!
- 597 :デフォルトの名無しさん :2001/07/17(火) 00:29
- HTTP1.1のRFCは日本語訳もあるし、本など不要
それすら読まない奴は、公害垂れ流しになるから、
インターネット上にパケットをとばすプログラムは組むな
- 598 :デフォルトの名無しさん :2001/07/17(火) 00:33
- >>595
Windowsに関しては生ソケットを使わなくても、PINGはとばせる
- 599 :デフォルトの名無しさん :2001/07/17(火) 19:34
- >>598
Windowsに関してはっていってもどうせWinsock2のRawソケットじゃたいしたことできないから関係ないな。
- 600 :デフォルトの名無しさん :2001/07/18(水) 20:51
- ソケットの持ってるバッファのサイズって知ることはできますか?
また、変更することはできますか?
- 601 :デフォルトの名無しさん :2001/07/18(水) 22:43
- >>600
getsockopt
- 602 :デフォルトの名無しさん :2001/07/19(木) 00:12
- >>594
料理できねーよ。
- 603 :デフォルトの名無しさん :2001/07/19(木) 12:19
- >>599
たいしたことできないって何が?
- 604 :デフォルトの名無しさん :2001/07/22(日) 00:29
- Windows 上で現在の DNS サーバー名を取得するにはどうすれば良いのでしょうか?
うちのマシンだと HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NameServer も
GetComputerNameEx(ComputerNameDnsDomain,lpBuffer,&nSize) もヌル文字列しか返らなくて役に立ちません
- 605 :デフォルトの名無しさん :2001/07/22(日) 17:23
- ヌル文字列しか帰らないのは単にDNSサーバーが本当に設定されてない
だけでないかい。
ipconfigでは表示されるの?
- 606 :デフォルトの名無しさん :2001/07/22(日) 18:23
- うちはルータ通してるので、DhcpNameServer
- 607 :デフォルトの名無しさん :2001/07/22(日) 21:52
- >>606
どんな環境だろうとルータを通らないとインターネットは使えないぞ
- 608 :デフォルトの名無しさん :2001/07/23(月) 01:03
- ウェブオブジェクトってなんですか?
- 609 :デフォルトの名無しさん :2001/07/23(月) 16:45
- >>605
DNS引けなきゃ2chにも来れんと思われ
- 610 :デフォルトの名無しさん :2001/07/24(火) 03:33
- >>609
ダイヤルアップのときしかDNSサーバが設定されてないとか
- 611 :デフォルトの名無しさん :2001/07/24(火) 03:45
- IP直打ちで来れるはず。
165 KB [ 2ちゃんねるも使っている 完全帯域保証 専用サーバ Big-Server.com ] 30,000円/月
★ 転送量無制限タイプも新登場。
新着レスの表示
掲示板に戻る 関連ページ 全部 次100 最新50read.cgi ver7.36p (04/12/10)