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

このエントリーをはてなブックマークに追加
1名無しさん@接続しっぱい。
前スレに引き続き、主にソケットに関しての質疑応答スレです。

前スレ
http://pc.2ch.net/test/read.cgi/tech/970344582/
2名無しさん@接続しっぱなし。:01/11/20 22:15
前スレの>>946
> タイミングが重要だったので、バッファに溜められると困るのです

それならTCPじゃなくて、UDPでprogram書き直すべき。
受信側の要件を知らないけど、かなりヤバーイ可能性高し。
3名無しさん@Meadow:01/11/21 00:18
Port 2 は compressnet Management Utility に割り当てられてるようです。
http://www.iana.org/assignments/port-numbers
4前スレの946:01/11/21 02:49
>>2
アドバイスありがとうございます
タイミングも重要なんですが、パケットが落ちたり、順番が変わるのはもっと困る
ということで TCP にしています
あまりスマートではありませんが・・・
>>4
ゲームってそんな感じだよね
ホントにゲーム作ってたら買いたくないゲームだな(w
バッファに溜まって送信が遅れるというのが重要ってことなら、問題なし。
しかし、複数の send がまとめられるのが困るってことだったら、大問題。
8デフォルトの名無しさん:01/11/23 12:13
<net/netinet.h>がみあたらないんですがどうすればいいでしょうか?
たぶん、/usr/inlcude/netinet/*.hを適当に使い分ければいいという
見当はついているのですが、確信を持って使えるようになりたいので
どうか教えてください。おねがいします。
>>1
「Port2」ってわざと?
わざとだろうね。なかなか洒落が利いている。
11デフォルトの名無しさん:01/11/24 15:02
>>4
TCP_NODELAYでは根本的な解決になっていない

このオプションを付けても、sendした時にバッファリングされずに
即座に送信されるだけで、受信側がsend毎にrecv出来る保証はない

例えば、受信側が何かの処理をしていてrecv出来ない時に、複数回
sendされると、データが混ざってrecvされることになる

どうしてもTCPでやりたいなら個々のメッセージの境界を判断できる
プロトコルを自作した方がいいと思う。

ただ、一つのメッセージが一度のrecvで受信できるとは限らないので
うまく作らないと、受信側がブロックしてしまう場合もある
各クライアントに対して一つずつスレッド作っていれば問題ないが
>>6
そうでもないよ
作ってから言え
>>7
複数の send がまとめられても、結果的には同じ処理ができますが、
受信時に一気に処理されて見た目が思わしくないのです

>>11
ふむふむ。勉強になります
今回の場合、個々のメッセージサイズは固定なので、
境界の判断はとりあえず問題なさそうです

1度の send や recv で全データが送受信できるとは限らない、
とは、どこかの解説書でも読んだことがありました
指定サイズ分データが来るまで send/recv を繰り返すコードが紹介されていましたが
あんな感じでいいのかな?
>>13
複数のsendが別々に処理されても一度のrecvで受信されるかも知れませんよ?
そういうのに依存するのは良くないと思いますが…
15デフォルトの名無しさん:01/11/25 00:39
ノンブロッキングモードWinSockのsendについて、
ヘルプを見ると戻り値は送れたサイズ(バッファに?)らしいけど
試して見たら-1か送ろうとしたサイズで、中途半端になることがない。
でもちゃんと考慮してくんだほうがいいのかな?
大きいサイズをsendする時は
1回目→送れたサイズ
2回目→-1(WSAEWOUOLDBLOCK)
FD_WRITE
3回目→送れたサイズ
4回目→-1(WSAEWOUOLDBLOCK)
FD_WRITE
5回目→送れたサイズ
6回目→-1(WSAEWOUOLDBLOCK)
の繰り返しだと思うんだけど、違う?
それとも2回目や4回目はsendしなくてもFD_WRITEが来たっけ?
>>8
プラットフォームは何よ?
18デフォルトの名無しさん:01/11/25 15:55
サーバーソケットをioctlsocketで非同期に変更すると、
acceptで生成されるsocketも非同期になるので改めて
指定してやる必要はない?
>>18 http://msdn.microsoft.com/library/en-us/winsock/wsapiref_13aq.asp
The accept function extracts the first connection on the queue of
pending connections on socket s. It then creates a new socket and
returns a handle to the new socket. The newly created socket is the
socket that will handle the actual connection and has the same
properties as socket s, including the asynchronous events registered
with the WSAAsyncSelect or WSAEventSelect functions.
20氷解:01/11/25 17:10
>>19
すんまそん。助かりました。
21ジャバジャバ:01/11/25 18:19
初めて書き込みをします。ジャバジャバと申します。
ジャバスクリップを使って、OnClickで10個の内のどのラジオボタンがチェックされたのかをラジオボタン
Valueを取得したいんですが上手くValueを拾う事が出来ません。

ラジオボタンは複数選択不可です。
ボタン押下時にどのラジオボタンが選択されているか知るにはどのように
Valueの値を取得したらいいか分かりません。
ラジオボタンのnameは同じで、Valueの値を0〜10までしにセットしました。
どなたか教えてください。お願いします。
誤爆?
>>21
ジャバスクリップはものを挟むのにしか使えませんよ。
Port2というのはわざと?ネットワークプログラミングだから?
258:01/11/25 22:28
>>17
Linuxです。

>$ gcc -v
>Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
>gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)

間抜けな質問のような気がして来たので、sageます。
26名無しさん@接続しっぱなし。:01/11/27 03:51
>>25
で、net/netinet.hってのは何のために使うのん?
netinet/in.hの間違いじゃねーだろうな。

>>15
マニュアルに従え。帰納的に勝手な仕様を編み出すのは止めよ。

>>13
パケット境界を保存しない、というTCPの仕様を尊重して書かないと、
特定のWindowsの特定のSP?じゃないと動かないprogramになってしまうぞ。
面倒だからといってさぼらずに、プロトコルやAPIの仕様をよく反映したprogram書くのは、
脱厨房の第一歩だな。
2725:01/11/27 04:13
>>26

ip(7)に↓こう書いてあったので、さがしてみて、おやー?
となったので、ここで伺った次第です。


SYNOPSIS
#include <sys/socket.h>
#include <net/netinet.h>

tcp_socket = socket(PF_INET, SOCK_STREAM, 0);
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
udp_socket = socket(PF_INET, SOCK_DGRAM, protocol);
28名無しさん@接続しっぱなし。:01/11/27 05:28
>>27
$ zgrep netinet /usr/share/man/man7/*
/usr/share/man/man7/ip.7.gz:.B #include <net/netinet.h>
/usr/share/man/man7/raw.7.gz:.B #include <netinet/in.h>
/usr/share/man/man7/raw.7.gz:.B <netinet/in.h>
/usr/share/man/man7/tcp.7.gz:.B #include <netinet/in.h>
/usr/share/man/man7/udp.7.gz:.B #include <netinet/in.h>

なわけで、ip(7)の間違い。
2927=25:01/11/27 08:29
>>28
有り難うございます。貴重な経験になりました。
それにしても、頼みの綱のmanなのに...
30Nanashi_et_al. :01/11/27 18:12
皆さん、ハードの勉強してますか?
この業界、ソフトの勉強だけでも食っていけるのですかねえ。
厨房ですまん。
31Nanashi_et_al.:01/11/27 21:39
どうなんすか、実際。
ハードまではいらんだろ
どこまでをハードと言ってるのかわからんが
食っていけるかってことなら、食ってはいけるだろう。きっと。
世の中、何で食っていってるのかわからんような人もいるし。
34デフォルトの名無しさん:01/11/27 22:10
理系某板ではマは無条件でドキュ扱いです
例えて言うならここでの「VB使えます」

くやしいのです
35Nanashi_et_al.:01/11/27 22:53
一流になりたいんですが。(ぇ
インターネットに関わりたいです。

ソフトとハードは深いかかわりがあると思います。
ある程度ハード知ってると、ソフト書くとき周りのソフト屋の人と差別化図れますかね?
3635:01/11/27 22:58
情報業界の中でも、やっぱりネットワークって一番面白いですよね。
無限の可能性がある!!!
世界中の人と人が繋がるんですよ!

あと、自分寝ないとダメなタイプなんすが、向いてないですかね?
たくさん寝て、要領よくやるのは不可能?会社が許さん??
>35
条件:インターネットに関わりたい、& ハードウエアを知る必要がある
推論1:ASIC等を用いたバグボーンルーティングシステム開発?
推論2:Linuxなどでネットワークデバイスドライバ開発?
推論3:「ネットワークが混んでいますね」からオシロ・ロジアナ等を
持ち出してきてのボトルネック究明?
推論4:1チップマイコンに何とかEtherとTCP/IPを通す?

結論:つか、socket以上なら、ネットワークハード有る程度以上
知ってても、ネットワークアプリ開発ではそんなに変わらない。
抽象化のおかげだ、感謝しる。これ以上は通信技術板逝け。
3835:01/11/27 23:08
>>37
???
学生の厨房なんで。。。。
雰囲気はわかりました。どうもありがとうございます。

あと、自分寝ないとダメなタイプなんすが、向いてないですかね?
たくさん寝て、要領よくやるのは不可能?会社が許さん??
39 :01/11/27 23:38
俺も一流になりたい!
「あ゛ー、あいつ、俺が徹夜で苦労しているときにのほほんと
帰りやがって‥‥怨嗟」 みたいな可能性はあるかもね。
いや、会社がどうこうではなくて、日本特有の「空気」っ奴サ
41デフォルトの名無しさん:01/11/27 23:45
独学でハードについて深く勉強したいんですが
なにか良い本とかありますか?
42Nanashi_et_al.:01/11/27 23:49
>>40
その程度(つったらおかしーか。)?
縛られるわけじゃねーのですか?
>42
反空気罪で受ける刑罰で一番軽いものは村八分@山本七平
これ以上はマ板逝け。

>41
つか、何のハードだよ。深く、って事は網羅的なやつではいかんのだろ。
SONET/SDH? ATM? FDDI? Ethernet? TokenRing? ISDN? MODEM?
まあ、通信技術板のほうが適当だと思うが。
44Nanashi_et_al.:01/11/27 23:56
マ板って?
すいません。マジレスお願い。
とほほ‥‥ http://pc.2ch.net/prog/
46Nanashi_et_al.:01/11/28 00:01
ありがとう。
プログラマのマか
47デフォルトの名無しさん:01/11/28 01:01
この程度なら。それなりに簡単。
>>30
ネットワークにしても、コンピュータにしても、アーキテクチャくらい勉強しろよ。
アーキテクチャ分からん奴は、根本的な所で設計ミスをすることがある。
50デフォルトの名無しさん:01/11/28 03:47
Ethernetヘッダのether_typeフィールドが取りうる値のリストって
何処かに無いでしょうか?

てっきりIPとARPと逆ARPくらいで尽きていると思ってたんですが、
自分でパケット拾ってみたら、無数に種類があるみたいで途方にくれてます。
51名無しさん@接続しっぱなし。:01/11/28 04:17
>>50
じゃ、
http://www.iana.org/assignments/ethernet-numbers の後半
http://www.cavebear.com/CaveBear/Ethernet/
あたりで途方にくれまくってください。
5250:01/11/28 04:32
...

み、見なかったことに....エヘ♥
53デフォルトの名無しさん:01/11/28 04:48
FTPのListコマンドで日付に年が入ってこないサーバがありますが、
どうすればいいのでしょうか?
MDTMはファイルにしか使えませんと怒られます。
5453:01/11/28 04:53
53は、FTPクライアントを作るという場合において、どうやって日付を表示するのかという話です。
>>54
未来のファイルが置いてあることなんてまずないから、もっとも近い過去で
その月日になる日付けにすればいいんじゃないの?
>>55
それだと去年以前に作ったディレクトリなのに今年作ったみたいな表示になっちゃうんじゃないの?
57デフォルトの名無しさん:01/11/28 10:38
>>53
"LIST"に対する返答の書式は決まってないので、
"MDTM"を理解するサーバに対して、
"NAME LIST"で返ってきたfileごとに"MDTM"する。

"MDTM"を理解しないサーバもいるので、
「その場合は」"LIST"で頑張るしかない。ない情報は諦めるしかないわけだし。
「年」を取得できぬなら、「年」を表示しない仕様にしてしまえ。
5953:01/11/28 11:33
年を返すけど時間を返さぬサーバもいるのね…
マジでRFCに無いし……
とりあえず >>55 の方式で適当に表示しときます

まさかこんなものだとは思わなかったから、オレが知らないだけで実はなんかスイッチがあるんじゃないかと思ってさ
LIST -l とか
デルファイ5によるネットワークプログラミングのサンプルがどこかのURL
にありますか、知っているならば、ぜひ教えてください。また、これに関するいい本
をご存知なら、教えてください。
>>59 >>55
必要な情報が足りないのもコマルが
嘘を表示されるのはもっと嫌だ、、

#そのFTPクライアントの要求仕様がどんなものか知らないけれど
#情報が取得できないなら出来なかった事を明示してほしい。
#一般論として、、
既存のGUI系FTPクライアントだってみんな嘘ついてるだろ。
いままで全然問題になってないんだからいいんじゃないのかなぁ。
63Nanashi_et_al.:01/11/28 20:08
>>49
物理とか、数学は?
電磁気とか、電気回路とか、電子回路とかPLDとかは?
みなさん、勉強してんの?
>>62
> いままで全然問題になってないんだからいいんじゃないのかなぁ。

んなこたぁない。
NextFTP なんかでもバグ扱いされてる。
バグ報告できるから、ユーザも一寸は溜飲がさがるんだと思うよ。
とりあえずそのまま、コマンドとその応答を表示できる機能があるので
見たい人はそれを見たり、ログをとったりして確認している。

>>61
必要な情報がサーバ側に無いんだったら、あきらめて…。
クライアント側ででっち上げるのは、極力避けたほうがいいのでは?
>>63
数学はともかく、物理は勉強しても意味無し。
数学、電気回路、電子回路は勉強した。
物理は、そりゃ勉強はしたけど、コンピュータアーキテクチャとは関係ないな。
電磁気は、やってないか、やったとしても忘れた。
んで、PLDってなに?
68デフォルトの名無しさん:01/11/28 22:22
Programable logic Device

GALとかPALだと思う。身近なものでフラッシュROMみたいなものかと。
>>63
離散数学はやっとけ。
後は必要ない可能性が高いな。やりたければやればいいが。
理三?
無理。
71デフォルトの名無しさん:01/12/01 18:00
すみませんが
telnetとsshのRFC日本語訳どっかにないでしょうか?

よろしくお願いします
7271:01/12/02 01:47
誰か教えて―
73sage:01/12/02 01:55
素直に英語で読めよ。
74デフォルトの名無しさん:01/12/03 12:17
みんなRFC原文で読んでるの?
みんなとは言わないが、英語のまま読む人も多いと思うよ
76デフォルトの名無しさん:01/12/04 12:32
詳解TCP/IPシリーズと
Unixネットワークプログラミングシリーズ

を比べるとどっちがどうなの?
後者が上級者向けって感じがしたんだけど実際のところは?
それとも両方必要なのかな?
おれは RFC と Linux の man で大体の使い方覚えたな。
詳細な仕様は後者で覚えた。
>>76
プログラミングに限った話だよね?
前者のプログラミング例は、現実的な実装を目指していると言うよりも、
プロトコル、アーキテクチャ、APIフレームワークを理解するため、だね。
後者は、システム組む人が参照するための詳細な解説、かな。

いい本だから、両方買って順番に読めば?
マトモなシステム作るには両方の知識が必要になるんだから。
>>71
とりあえず、googleで探してみれ。あるかもよ。

>>74
日本語訳がある場合でも、原文を用意しておいた方が良いと思います
(訳が意味不明な場合は、英語版で読む方がわかりやすかったりする)。
80デフォルトの名無しさん:01/12/05 10:52
非ブロッキングI/Oが優れている点とはなんでしょうか?
selectで各ディスクリプタを見張っている時にそのディスクリプタが
ブロッキングだろうと非ブロッキングだろうと見ためにはselectでブロッキングしているので
同じ事だと思うのですがいかがでしょうか?
むしろ常にポーリングしてCPUを浪費している非ブロッキングI/Oのデメリットしか感じません。
>>80
非ブロッキングI/Oならselect使わなくていいでしょうが。
ポーリングしながら送受信関数の戻り値で判断できるのがメリット。

だいたい受信待ちの間でも何か処理をさせたい場合どうすんのよ。
別スレッド?
そのスレッドとブロッキングスレッドとの通信のCPU浪費は無視できんの?
>>80
selectも時間に0秒をしていすればブロックしませんよ。
あと、sendをブロックしないためには非ブロッキングが必要ですね。
8380:01/12/05 13:33
レスありがとうございます。
unpのP368のstr_cli関数が非ブロッキングI/Oをselectで使用しているのを不思議に思いました。
これはなんの為にselectしているのでしょうか?お願いします。
84デフォルトの名無しさん:01/12/05 19:56
みなさん文字コードの問題に苦しめられてませんか?
ぼくは苦しんでます、、ムギュ―
>>83
unpのP368って何だ?
"Unix Network Programming"だろうけど、
>>80は一体どういう点を問題にしているのか、
他のどんな方法と比べているのか、全然分からんから、説明しようがない。
87 :01/12/07 00:01
WIN-NT で、以下のような事をしたいと思ってたのですが、バカな事に
受信がないとacceptから次に進まない事に気づきました。
一定時間待ったら、acceptをいったん抜けるというような事はできない
でしょうか。
acceptを終了させるのってみなさんどうしてるんでしょうか?

while(end_flg)
{
accept()
}

enf_flgを他でセットし、accept処理のwhileを終了させたい。
UNIXだとSIGALRM投げてacceptにEINTRさせるけど…関係なくてごめん。
acceptで待たなければ良いね。
selectで受信を確認してからacceptとかsocketをnon-blockingにするとか。
90デフォルトの名無しさん:01/12/07 00:29
>>87
ふつうはlistenでもらえるソケットをselectに渡して接続して
くるのを待つ。そのソケットがreadできるようになったら
acceptできるということなので、ブロックすることはないよ。
91デフォルトの名無しさん:01/12/07 18:12
socketつないで相手の文字コードを知るにはどうすればいいでしょうか?
Java使ってます
>>91 マルチポストかよ。相手に自分の文字コード送ってもらえや!!
9387:01/12/08 02:19
ありがとう。selectを使いました。
94デフォルトの名無しさん:01/12/08 15:38
Winプログラマです。誰か教えて下さい。

自分のマシンに進入してきたコンピュータのIP/Port/Statusのリストを
取得する方法(WinsockAPI等)は無いでしょうか?

私が調べたところ無さそうなので、現在はCreateProcessで
netstatの結果をリダイレクトし、その結果を取得&表示してます。

ただ、この方法ではタイマーとか使って能動的に調べるので面倒です。
接続通知メッセージとか受けれたら一番良いのですが・・・
>>94
俺もやり方は知らんけど、とりあえずDependency Walkerとかdumpbin
とか使って、netstat.exeがどのDLLからどんなAPIをimportしてるか
調べてみたら?
9694:01/12/08 15:48
>>95
レスどうもです。実はそれは最初にやりました。
私はExeScopeというツールを使って調べましたが
特に見新しいAPIはなかったです。
ws2_32.dllではなく何故かwsock32.dllのAPIを使ってる
ようでしたが・・・
97名無しさん@接続しっぱなし。:01/12/08 16:03
>>94
tcpdump動かしっぱなしにして、記録とっとけよ。

> 自分のマシンに進入してきたコンピュータのIP/Port/Statusのリストを

Statusって具体的には何だ?
98sage:01/12/08 16:05
Establishとかだろ。
9994:01/12/08 16:23
レス下さった方々、有難うございました。
もう少し自分で調べてみます。
>>94 どこかに Win32 の netstat (モドキかも) ソースが落ちてたと思うが、探してみた?
101ぴっころ:01/12/09 03:02
基本的に
listen()使ってるのがサーバで、
connect()使ってるのがクライアント
って考えてもいいですか?
102sage:01/12/09 03:54
>>101
まあそうですね。
ftpのactiveモードみたいに、サーバからクライアントへconnect()する
プロトコルもあるです。
サービスを
・提供する側 → サーバ
・利用する側 → クライアント
105デフォルトの名無しさん:01/12/09 21:13
うぉい!マルチキャストとブロードキャストの違いを解かり易く一言で教えてくれぇぃ!
106デフォルトの名無しさん:01/12/09 21:50
>>87
>acceptを終了させるのってみなさんどうしてるんでしょうか?

acceptしているsocketを別スレッドからcloseしてます。

select使うのが普通なのかな・・・
>>105
> うぉい!マルチキャストとブロードキャストの違いを解かり易く一言で教えてくれぇぃ!

マルチキャスト: 特定多数(グループ)へ
ブロードキャスト: 不特定多数へ

というのが一般的です。ブロードキャスト=放送なので。
Ethernetのブロードキャストは、コリジョンドメイン内のノード全員が対象です。
うぉい!勉強になったぞぉぃ!
109デフォルトの名無しさん:01/12/11 14:12
非ブロッキングI/Oと非同期I/Oって別物だよね。

WindowsのWSA系って非同期I/O?
それとも単なる非ブロッキング?
110ゴンベー:01/12/11 14:37
>>109
どっちも有りなはずだー
111デフォルトの名無しさん:01/12/17 12:29
age
112デフォルトの名無しさん:01/12/20 03:39
3階層C/Sシステムって具体的になんですか?
113デフォルトの名無しさん:01/12/20 05:28
ついでに
オープン系とC/S系の違いを教えてください
ソケットの裏技を教えてください。
私の知っている程度のテクニックは却下です。
ソースで書かれていることがが全て
わかりました。とりあえず、あなたの知っているテクニックを
全て、ここに書いてください。
浮き橋, 鶯の谷渡り, 押し車, 理知らず, 撞木ぞリ, 抱き上げ, つり橋
乱れ牡丹, 深山, だるま返し, 宝船, 御所車, 時雨茶臼, 百閉, うしろやぐら
碁盤攻め, 獅子舞, 菊一文字, 立ちかなえ, 鵯越え, 本駒駆け, 帆かけ茶臼
仏壇返し, 抱き地蔵, 岩清水, 雁が首, 首引き恋慕, こたつかがり, こたつ隠れ
しがらみ, 立ち花菱, 立ち松葉, 千鳥, 千鳥の曲, 茶臼のばし, つばめ返し
鳴門, 鵯越えの逆落とし, 二つ巴, 松葉崩し, 窓の月, 寄り添い, しめ小股
テコかがり, 流鏑馬, しぼり芙蓉, 手懸け, 椋鳥
>>116
質問に答えてもらったら感謝のレスを返すのが礼儀だと思われ
たとえここが2ちゃんでもな
>117

48手かよ!
120デフォルトの名無しさん:01/12/20 18:40
あのぉ・・・・・3階層C/Sシステムって具体的になんですか?
ついでにオープン系とC/S系の違いを教えてください
121116(!=114):01/12/20 18:47
114:漏れの知らないソケトテク教えれ
116:あんたの知らない事なんか俺は知らない。まずは、あんたの
   知ってる裏技を全部書いたらどうだ?
糞が来なくてもスレが腐るときは腐ると...

なんか新鮮だなコリャ(w
時雨茶臼なぞ、風流ですな。
>>120
用語の意味についての質問なら、googleあたりで検索すればまず解決する。
用語の示す事象についての意見なり評価なりを聞きたいのならそのように書くべし。

俺はどっちも良く知らないのでコメントできない。わはははは。

さげ。
>>120
WindowsDNAというのもWindows製品ベッタリで構築する3階層C/Sシステムのこと
以前OSの事と勘違いしてたヤツが得意げに「DNAどうなったんだ!」とか言ってて面白かった
126118:01/12/21 04:40
>>116
許せ
while(end)
{
recv()
}

Win-NT(winsock2.0)で、処理を終了させる為に、recvを一定時間で
タイムアウトさせ、終了条件をチェックさせるようにしているの
ですが、クライアント毎にスレッドを割り当てて、処理させた時に
データが来ているにもかかわらず、途中で受信が止まってしまう
クライアントが、発生します。それでタイムアウトの時間を伸ばすと
頻度がかなり減少します。何が考えられるでしょうか。

またクライアントから受信したデータは、クライアント別(ソケット別)
になっているんではなくて、全部つながっているものなんでしょうか。
例えば、あるクライアントからのデータを余計に取ってしまうと、次の
クライアントのデータは、消えてしまうのでしょうか。
>途中で受信が止まってしまう

recvを一定時間でタイムアウトさせてるんだったら、一定時間で受信が止まるのは意図通りでは? どうおかしいのか説明してくれ。

>またクライアントから受信したデータは、クライアント別(ソケット別)
>になっているんではなくて、全部つながっているものなんでしょうか。
>例えば、あるクライアントからのデータを余計に取ってしまうと、次の
>クライアントのデータは、消えてしまうのでしょうか。

それはない。受信データはソケットごとに別々に管理されてる。
129127:01/12/21 22:35
>recvを一定時間でタイムアウトさせてるんだったら、一定時間で受信が止まるのは意図通りでは?
どうおかしいのか説明してくれ。

パケットを受信できているのに(ツールで確認)recvに応答が
ないのです。
とりあえず、127は、なぜselectを使わないのか?
まぁ、非同期socketでも良いんだが。
131127:01/12/21 22:50
特に理由はないです。
ところで、無いとは思いますが、パケット受信のイベントが
発生した時、recv状態にないとそのあとrecvしても、応答が
無いという事はないですよね。
タイマーの時間を長くすると、頻度が減少するというのが
不思議なんですが。
recvにタイムアウトってあったのか。
133127:01/12/21 23:24
とりあえず、クライアント毎に管理しているというのが、分かった
だけでも助かりました。ありがとう。

>>132
winsock2.0 からできるみたいです。
134名無しさん@接続しっぱなし。:01/12/22 00:05
つーか、>>127はTCPやUDPのサービス仕様知っているのか?
見当違いの方向を攻めてるぞ。まずrecv&SO_SNDTIMEOの仕様だろ。

http://www.microsoft.com/mspress/books/WW/sampchap/4287d.asp
If a request times out, an application has no guarantees as to how
much data was actually sent or received in the I/O call.

おやおや、仕様通りの動きだね。
こんな糞な仕様とは思わんだろうが、Winsockだから油断するなや。
ていうかこんなソケットオプションがなんで必要なのかわからん。
select/recvをrecv一つにして効率アップ、ってな事が書いてある。
atomicでないのは目的、使用しているprotocolにより仕方ないとしても、
completenessを実現できてないところが、流石winsockという感じ。

実際に送ったバイト数、
実際に受けたバイト数とそのデータくらい返せよなー! > アホアホwinsock設計者

UNIXのread(2),write(2)は20年以上前からいい仕様だね。
それを引き継いだrecv(2)/send(2)も。
136の言っている事が今ひとつ理解できないのですが。
たとえば、効率アップ、と書いたのは誰であるか、とか。
Winsockの非同期ソケットの仕様を責めているのだろうか?
138名無しさん@接続しっぱなし。:01/12/22 21:14
>>137
URLを>>134に張り付けてあるので、読みませんか?
Microsoft(Pressから出ている本の著者)が言っています。

非同期I/Oじゃなくて、SO_SNDTIMEO/SO_RCVTIMEOのことです。
非同期I/Oとタイムアウト付き同期I/Oの違いは分かりますか?
139137:01/12/22 21:49
ああ、そうか。134=136か。名無しさんを頭にかぶせてたから、気づかなかったよ。
不注意だった。スマソ。

つか、切断(相手死亡)などでうち切る為の、秒数を指定する記述とみれば、
全然不自然では無いと思うけど。(そのためにselect使うよりはマシってのは確か)

相手が死亡しているのに、送ったバイト数なんか貰ってもどうしようもないと思うが。
ポーリングに使おうと思うのが間違い。
140デフォルトの名無しさん:01/12/22 22:33
>>136
>select/recvをrecv一つにして効率アップ、ってな事が書いてある。
> atomicでないのは目的、使用しているprotocolにより仕方ないとしても、
> completenessを実現できてないところが、流石winsockという感じ。
> 実際に送ったバイト数、
> 実際に受けたバイト数とそのデータくらい返せよなー! > アホアホwinsock設計者
> UNIXのread(2),write(2)は20年以上前からいい仕様だね。
> それを引き継いだrecv(2)/send(2)も。
ユニ房さらしあげ
141名無しさん@接続しっぱなし。:01/12/22 23:05
>>139
timeoutが起きるのは、

> 相手が死亡しているのに、

時に限らないです。"no guarantees"なのは深刻です。
より状況が簡単に把握できるrecvの場合について考えてみてください。

>>140
はいはい。早く寝ようね。
142名無しさん@接続しっぱなし。:01/12/22 23:07
>>127は、SO_RCVTIMEOをsetsockoptするの止め、

while(end)
{
select()
if (!timeout) recv()
}

とする、に書き換えてみては?
143137:01/12/22 23:46
>141
いや、そうじゃなくて、TCPで相手の生存を確認できるのは、データが来る、
でしかないわけでしょ。だから、「ある間隔でデータがこなかったりしたら、
相手は死んだものとして扱う」ということになる。で、「そのtimout間隔を
指定したいとき」に「selectを使うのは非効率だ」から、sockoptなわけでは?

だから、「timeoutしたら、あとは終了処理に行こうね。」という
設計思想になると? 何か、SO_*TIMEOの利用について、
決定的な断絶が有るような気がするけど‥‥
>>143
>「ある間隔でデータがこなかったりしたら、相手は死んだものとして扱う」ということになる。
そういう時しか、SO_RCVTIMEOは使えない。
「ある間隔でデータがこなくても、相手は死んだものとして扱わない」
という場合は使えない。

アプリケーションの設計思想とか「断絶」の話じゃなくて、仕様についての事実の話。

> で、「そのtimout間隔を指定したいとき」に「selectを使うのは非効率だ」から、
> sockoptなわけでは?

その時"no guarantees"な事についてはどう思うの?
「タイムアウトつき同期recv/send」の存在はいいとして、仕様はタコでしょう?
145137:01/12/23 01:17
>「ある間隔でデータがこなくても、相手は死んだものとして
>扱わない」という場合は使えない。
というwinsockの仕様がださい、というなら、同意。

しかし、ここいらで、ちゃんとMSDNいてみると

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/ovrvw6_546q.asp
>Note When using the recv function, if no data arrives during the period
>specified in SO_RCVTIMEO, the recv function completes.
>Prior to Windows 2000, any data received subsequently fails with WSAETIMEDOUT.
>In Windows 2000 and later versions, if no data arrives within the period specified in SO_RCVTIMEO
>the recv function returns WSAETIMEDOUT, and if data is received, recv returns SUCCESS.

と、W2K、XPでは、ちゃんと届くような事が書いてあるが。
146デフォルトの名無しさん:01/12/23 01:19
まあ相手が継続的にデータを送信してくれてるときはお手軽で
いいかもね。
147デフォルトの名無しさん:01/12/23 01:43
perlの質問です。
下記のコードで2chを見ようとすると
”何か不調です”とread.cgiにおこられてしまいます。
YBBからだと書き込めないので擬似プロクシみたいなのを作ろうと思ってるのですが、
表示すら出来ず困っています。

#!/usr/local/bin/perl
@Temp = gethostbyname("pc.2ch.net");
$Addr = $Temp[4];
$Name = pack("S n a4 x8", 2, 80, $Addr);
socket(S, 2, 2, 0);
connect(S, $Name);
binmode(S);
select(S); $| = 1;
select(stdout);
print S "GET http://pc.2ch.net/test/read.cgi/tech/1006258198/l50 HTTP/1.0\r\n\r\n";
while (<S>) { print; }
close(S);
httpには、Hostとか、Referとか、User-Agentとか、いろいろヘッダがあってな。
read.cgiはそいつらをチェックしているのぢゃ。

read.cgiはオープンソースなんぢゃし、ソースみるのも一興ぢゃな。
149デフォルトの名無しさん:01/12/23 01:51
>>148
有難う。
read.cgiのソースってどこにあるのかな?
検索したけどうまくひっかからなかった。
http://www.fmfm.binboserver.com/tech/ にあるはず。
もなじら http://www.monazilla.org の資料室などにも行ってみるとよろしいじゃろう。
151デフォルトの名無しさん:01/12/23 02:08
>>150
再び有難う。
これから読んでみます。
ほんとだHTTP/0.9にも対応してない。
GET /test/read.cgi/tech/1006258198/l50
でなくても受け付けてくれるかは知らないけど
154デフォルトの名無しさん:01/12/23 03:16
>>153
それだと下記のメッセージが出てread.cgiにもたどり着けなかった。
”The failed request was: http:////test/read.cgi/tech/1006258198/l50
他のページなら >>153 のでOKなんだけど。
恥ずかしながら私のリクエストを大公開、プロファイリングどうぞ

GET /test/read.cgi/tech/1006258198/l50 HTTP/1.0
Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Referer: http://pc.2ch.net/tech/
Accept-Language: ja
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 22 Dec 2001 18:16:33 GMT
User-Agent: Mozilla/4.51 [ja] (Win98; I)
Host: pc.2ch.net
Cookie: NAME; MAIL=sage
Connection: keep-alive
156デフォルトの名無しさん:01/12/23 04:03
>>155
貴重なデータ有難うございます。
これで上手く表示されました。
現在、別の壁が出てきましたのでまだ書き込みまでは上手くいきませんが、
何とかなりそうです。
>154
Host:がないから。
158155:01/12/23 04:12
別に貴重では・・・

RefererとHostはそのままでは駄目だよ
159デフォルトの名無しさん:01/12/23 04:19
>>157
申し訳ない。ネットワークのことは全く分からないもので・・

>>158
実際のソースは下記のようになっています。
print S "GET $NowCurrent$NowFile HTTP/1.0\r\n";
print S "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* \r\n";
print S "Referer: $NowRoot0 \r\n";
print S "Accept-Language: ja \r\n";
print S "Accept-Encoding: gzip, deflate \r\n";
print S "If-Modified-Since: Sat, 22 Dec 2001 18:16:33 GMT\r\n";
print S "User-Agent: Mozilla/4.51 [ja] (Win98; I) \r\n";
print S "Host: $NowRoot \r\n";
print S "Cookie: NAME; MAIL=sage \r\n";
print S "Connection: keep-alive \r\n";
print S "\r\n";

$NowRoot等はそれより上のソースで加工して使ってますので大丈夫だと思います。
> print S "If-Modified-Since: Sat, 22 Dec 2001 18:16:33 GMT\r\n";

とっととRFC見て来い
さもなきゃ回線切って首吊って市ね
161155:01/12/23 04:34
>>159
とりあえず基本的なことがまずいね。
いいページを見つけたからどうぞ

http://x68000.startshop.co.jp/~68user/net/
>Accept-Encoding: gzip, deflate
(´-`).。o(実際にgzipで送られてきたらどうするんだろう‥‥)
>Connection: keep-alive
(´-`).。o(persistance connectionの意味無いような‥‥)
>User-Agent: Mozilla/4.51 [ja] (Win98; I)
(´-`).。o( User Agent 偽装するのはよくないような‥‥)
日曜日だし、ゆっくり時間をかけて、
monazillaスレ(表示やIE関係以外の、取得について言及しているところ)と
read.cgiスレ(いろいろ制限をつけている理由を知るためと、
うまい取得方法を工夫するため)を、
それぞれpart1から読んでみる事をおすすめしたり。
HTTPの話が出てるついでにちょと質問。
ブラウザは常にKeep-Aliveを送っているんだけど、
HTTP/1.0でKeep-Aliveの時や、HTTP/1.1の時って、
GETしたHTMLをparseして他にGETするものがない時ってどうしてるのかな?

HTTP的にはConnection: closeを使った
「行儀の良い」切断が望ましいとなっているけど、
他にGETするものがあるか最初のリクエストではわからないときもあるはず。

で、そういう時(他にGETするものがなかった時)は、
いきなりclientからclosesocketするのも行儀良くないと思って、
(serverから切られるまで待つのもあまりよくないと思う)
送信をshutdown(winsockならSD_SEND, berkelyなら1かな)して
server側から切られるのを待つようにする方がまともかと思ってるんだけど、
そういうやり方でよい?
そもそもparseしてから次に取るものを決めるような状況でKeep-Aliveは
あまり賢くない。使ってもいないコネクションを無駄に占有してるだけ。
166164:01/12/23 10:28
いや、理屈はその通りなんだけど、
実際にIEもネスケもKeep-Aliveを(proxyに対してさえも)送っているわけで。
で、IEやネスケはどうしてるのかなと。
167名無しさん@接続しっぱなし。:01/12/23 10:35
>>164
HTTP1.1の"8. Connections"にかなり詳しく書かれています。(実装の話も)
「どんな瞬間にも接続は切断されると思ってHTTP1.1client/serverを実装す『べき』」です。
これから1.0のclientを作るのはよした方がいいと思いますが、
1.1 serverが1.0 clientに対して行なうべき事は、
"19.7.1 Compatibility with HTTP/1.0 Persistent Connections"にあります。

>>147は、HTTP用のperl module使った方がいいのでは。
まあ、じかにprotocol叩くのも楽しいけど。
168164:01/12/23 10:39
サンクス。読んでみる。だけど、
>「どんな瞬間にも接続は切断されると思ってHTTP1.1client/serverを実装す『べき』」です。
これはあたりまえなので、そうやって実装してる。
単に、Connection:closeを「送る『べき』なのに送れなかった時に」
どう実装したら「少しでも行儀の良い切断」になるか知りたいだけだから。
169名無しさん@接続しっぱなし。:01/12/23 10:43
>>166
いきなり切断しています。
protocol的には、Connection: closeでTRACE requestを送るくらいしか、
明示的に切断する方法はないです。(と思っています)

方法がないのは、gentleである必要がないからでしょう。
実際に「gentleでない」clientのためにresourceを無駄にするようではserver失格ですから、
"8.1.4 Practical Considerations"にあるようにやるしかないでしょう。
170164:01/12/23 12:12
いろいろどうも。

うーん、俺が知っていたのは2068だったから、
2616でもっと詳しく書いてあるかと思ったけど、
正直、2616の 8.Connectionsを見てもよくわからなかった。

ただ、もしかしたら俺の解釈が間違っていただけって気もしてきた。

> In case the client does not want to maintain a connection for more than that
> request, it SHOULD send a Connection header including the
> connection-token close.
これを、「『常に』Connection:closeを送るべきである」と捉えていたけど、
本意は「『他にリクエストがないとあらかじめわかっている場合』は
Connection:closeを送るべきである(SHOULD)」だという気もしてきた。
そして、『他にリクエストがあるかわからない場合』は、SHOULDではないから、
> A client, server, or proxy MAY close the transport connection at any time.
に従って、「いきなりcloseしてかまわない」のかも。

というか、serverは「(普通)いきなりcloseされてもかまわない」ように
作られているはずだし、ブラウザがいきなりcloseしているなら、それでよさそう。

それでも、「clientがcloseする」と「clientがsendをshutdownしてserverがcloseする」と
どちらがgracefulかは少し気になる(大差ない気もする)けど。
171名無しさん@接続しっぱなし。:01/12/23 17:06
>>170
明示的に書いてある所はないけど、いきなりクローズすればいいんでしょう。

クッキー管理の事考えると、
明示的にセッションを止めるリクエストが欲しい所だけど、
ブラウザの汎用UIにそんなボタンはないんで、
結局はページの中に[ログアウト]ボタン/アンカーつけるのがいい。
keep-aliveやめて欲しい。ブラウザに強制的に止めさせられない?
>>172
サーバかクライアントかどっちの話? クライアントなら IE の設定で HTTP/1.0 を
使うようにさせれば良いし、サーバ側なら Apache の設定で nokeepalive が設定
できたはず。あ、IE は HTTP/1.0 でも Keep-Alive で来たかも。
174172:01/12/24 05:00
>IE は HTTP/1.0 でも Keep-Alive
ばっちりやってくれてる
何故Keep-Aliveをやめて欲しいのか、
つまり、Keep-Aliveのどこに問題があるのか、の方には興味があるな。
176名無しさん@接続しっぱなし。:01/12/24 13:11
HTTP1.0にKeep-Aliveなんてないからじゃないかな?
Keep-Alive connection≠HTTP1.1 persistent connectionだから、
Content-Length:とchunked transfer-codingの両方を実装する必要がある。うざい…

まあ、いずれにせよ、1.0でKeep-Aliveしゃべってくるclientが存在する以上、
serverでは、RFC2068, 19.7.1、RFC2616, 19.6.2を実施する必要があるのだが。

1.1制定前に「実験的に(HTTP1.0/RFC1945, 1.3)」やるのならともかく、
1.1が出来たら、1.0ではKeep-Aliveは捨てればいいのにね。特にclient側では
HTTP/1.0でKeep-Aliveが来ても、無視すればよさそうな。

「まともな」serverがclientの理不尽な操作(中断等)に耐えられるのと同様に、
「まともな」clientなら、「Keep-Aliveを要求したのに切断された」からといって
妙な動作をすることはない。

限定された範囲内のみの用途で作成されたclientならともかく、
ブラウザ等の汎用的なものならば、
まだまだ残っているHTTP/1.0なserver(含proxy-server)が
Keep-Aliveを解せずに切断してくることへの対処はできているはず。

実際、IEもNNもKeep-Aliveを送っているが、
例えばApacheでディレクトリリスティングを取った場合は
 HTTP/1.1 -> chunked
 HTTP/1.0 -> close
で終端を知らせている。
また、KeepAliveで設定したmax-requests以上のリクエストに対しては
たとえHTTP/1.1で接続していても切断されてしまう。
もちろん、ブラウザは何事もなかったかのように動作する。

そう考えれば「(1.0clientのKeep-Alive対応が)面倒くさければ無視する」
という実装は、許されると思う(特にproxy-serverの場合)。
ただし、HTTP/1.1なclientに対しても毎回Connection: closeを返して
切断するようなら、HTTP/1.1を名乗る資格はないとも思うが。
「許される」ってより、1.0のくせにKeep-Alive使ってるんだから
無視されても文句は言えないし、「自業自得」って感じかも。
そういや、iriaがHTTP/1.1をおくりつつ、chunkedエンコードを理解しない、
という話があったな。

それはそうと、pipelined requestって、2発目から発効可能ってことかな。
それとも、一発目(keep-alivableな鯖か検知しない状態)から、pipelineで
リクエスト送ってもかまわないのかな?
pipelined requestいいよねー。
交互に送受信するのに比べて、レスポンスは劇的に速くなるし
ネットワークを流れるパケットも減る。
処理が早く終わるから、serverが占有される期間も短くなる。
良いことだらけ。(clientの作成は面倒になる)

だけど、HTTP/1.0なserverは(たぶん)受け付けてくれないから、
serverが特定できない場合には、最初からpipelineで送るのは
あまり良くないとは思う。
1.0なserver(Keep-Aliveを理解するものもあると思う)にpipelineで送った場合、
「ちゃんと動作する」「1つだけ受け付けてくれる」「全部エラーになる」の
3つの可能性があるから、それぞれに対処する必要があるし、
ちゃんと動作しなかった場合には、serverを混乱させ、
無用な負荷をかけることになる(かもしれない)。
特に、proxyが相手の場合には、そのproxyが1.0か1.1かを判定する
確実な手段が無い(と思う)から、なかなか使いにくい。

逆に、serverが1.1だと確実にわかっていて
そのserverと交信する用途に限定するなら、積極的に活用すべきだと思う。
もちろん、最初からpipelineでリクエストしてかまわないはず。
(少なくともApacheは全然問題なく動作する)

ただ、timeoutやmax-requestは設定されているはずなので、
その数以上のリクエストをまとめて送っても無意味だし、
さらに(Apacheの場合)"その数"は、一度Connection:Keep-Aliveを
明示的に送らないと取得できなかったりする。
頻繁に変えられる(設定を変える)数字ではないにしても。


でも、RFCだと、HTTP/1.1なclientの動作として
「pipelineが失敗したら再試行はpipelineするな」としか
書いてなかった(と思う)から、clientがちゃんと対処できるのであれば
全てのserver(含non-KeepAlive)に対して「いきなりpipelineする」のも
一応、許容範囲かもしれない。
181初心者:01/12/25 09:54
ある通信ソフト(socket使用)のサーバープログラムがacceptで接続待ち状態になっている時、
そのacceptの仕方が悪い(?というのも変な言い方ですが ロジック的に問題あるとか)
ために、
別な通信ソフト(同じマシンで動いている socket使用 ポートは別)の通信に悪影響を与えてしまう、
という事もありえるでしょうか?

私の素人考えでは、acceptそのものは、自分からはなにもださない(?これが間違っているのかな)
から、影響を与える事はないかなあと思っているのですが・・・

(通信ソフトの調子が悪くなったので、
自作のsocketのサーバーソフトが原因かどうか、調べているところなのです)
>>181
ない。
>>181
さらに言うなら、ソケット処理はOS管理なので影響無いが、そのサーバソフトが
CPU100%使ってるようだったら、プロセス処理で悪影響でるかもしれん。
184181:01/12/27 14:02
CPU100%使うとは、どのような状態を言うのでしょうか。

ちなみに、このサーバーソフトのacceptの仕方ですが、
スレッドの中で、ブロッキングでacceptを行って
接続をずっと待っている、という状態です。
このプログラムの中で作成するスレッドは、これ一つだけです。
>>184
メインスレッドだけということ?
まさか別スレッドでaccept()しててメインはそれをbusy loopで待ってるなん
てんじゃないだろうな。
>>184
ブロッキングソケットでacceptしてるんなら問題ないはず。
そのスレッドはそこで停止してるから。
んーていうかacceptじゃなくてlistenしてるんだよね?
それをいうならselect()では?
188184:01/12/28 10:20
ややこしくてすいません

メインスレの他に、一つスレッドを生成して、その中で主に
ブロッキングでsocket処理を行っています

サーバー側なので、socketで接続待ち受け用socket生成->bind->listenまでして、
あとは、そのスレッドの中で、ブロッキングでacceptを実行して、
クラインアント側からconnectが実行されるまで待ってます
その間も、メインスレッドのほうはイベント処理とかいろいろ動いています

そして、無線LANを使用した時だけおかしくなる事がわかったので、
無線LANのドライバの問題とか、OSとの相性とかではないか、
という問題のようです
いろいろありがとうございました
189デフォルトの名無しさん:01/12/30 11:35
Pingに応答しないステルスLinuxを作れるような気がしましたが
カーネルをいじらずに
rawソケットを使って実現する事ができますか?
できるならやり方を教えてください。
よろしくお願いします。
ipchainsかiptablesでicmpをdeny
191名無しさん@接続しっぱなし。:01/12/30 13:10
>>189
Berkeley Socket Filterの代わりのLinux Socket Filterを使え。
/usr/src/linux-2.4.9/Documentation/networking/filter.txt
/usr/src/linux/Documentation/Configure.help
http://www.linuxjournal.com/article.php?sid=4659

Kernel内に既にあるのはこれな。
http://bridge.sourceforge.net/
/usr/src/linux/Documentation/networking/bridge.txt
/usr/src/linux/Documentation/Configure.help

>>190
拒絶じゃなくて通過ね。
>>191
ACCEPT means to let the packet through. DENY means to
drop the packet on the floor. REJECT means the same as
drop, but is more polite and easier to debug, since an
ICMP message is sent back to the sender indicating that
the packet was dropped. (Note that DENY and REJECT are
the same for ICMP packets). [Note: this is incorrect; set-
ting ICMP to REJECT will cause ICMP port unreachables to
be sent!]
だからREJECTにしろつーこと?
>>192
ん? ステルスだから、hop countを増やさずに通過させたいんでしょ? >>189
しかし、google検索すると、「pingを吸収」って書いてあるサイトもあるなー。
通過させるってどこに? REDIRECTするってこと?
195名無しさん@接続しっぱなし。:01/12/30 19:50
196デフォルトの名無しさん:02/01/04 00:32
非同期ソケットの場合、1000程度の接続があるとして
ソケット固有のデータにアクセスするには
Windowを1000個作るのと
if文で分岐するのと
ハッシュで割り出すのと
どれが一番速い?
あるいはいい方法無い?

I/O完了ポートを使うより非同期ソケットでWindow1000個作る方が(クラスメソッドとして)
軽そうな気がすんだけど
なんでソケットとWindowが関連するんだ。ヴォケ
winsock1.1だからだろ
WSASelect()でも使え。
200196:02/01/04 10:09
>>199
そうだった。あとWSAAsyncGetHostByNameもだ
メッセージにID入れられるんだった。
22000くらいまではひとつのWindowで判別できるんだった。
しかもすでに実装済みだった。ぼけとるぎゃー

>>197 >>198
やれやれ Winsockのほとんどの関数への引数はSocketなんだが...
それともWinsock2に非同期ソケットがなくてWindowにメッセージがこないとかいうのか
あほっ
201197,199:02/01/04 10:33
いちいちWindow作らにゃ受信もできんような、腐れ仕様なんぞ知らん。
少なくともそんな使い方はしたことがない。
ソケットの受信ってのはWindowがするべきもんなのか?
202デフォルトの名無しさん:02/01/04 10:56
>>200
私は WSAEventSelect (winsock2) を使ってますよ。
203デフォルトの名無しさん:02/01/05 14:17
>>201
うんにゃ。非同期I/Oだから、終了イベントを受ける。
イベンド全般は、Win32オブジェクトで"WaitFor"可能。
だからウィンドウに"event signal"が行くこともある。

>>200は、Windows Sockets 2の"Windows"と、
GUI windowの"window"の区別もつかない厨房
204デフォルトの名無しさん:02/01/05 14:29
Window1000個作るって何だよ(w
根本的な事が理解できてないんじゃないかな。
Windowの作成とSocketは何ら関係ないよ。
ウィンドプロシージャって言うのならまだ理解できるけど。
つーかWinSock 1.1でもWSAAsync系使わんけどな。
206初心者:02/01/06 01:44
ちょっと質問なんですが,VBでNTPで時間を合わせるプログラムを
作ったんですが,ネットワークってあんまり良く知らないので
問題ないか見てもらいたいのです.
socketを作る→bindでこちらのポートを指定→
先頭がBの48バイトのパケットをNTPサーバにsendtoで送る→
サーバからの返信をrecvfromで受け取る

というような感じでサーバから48バイトのパケットを受け取る
ところまで出来ました.
今はパケットを時刻に変換するところを作っています,
これがなかなか上手くいかない.簡単な方法ないかな?
207RUR:02/01/06 03:47
通信技術板でRFC(STD)を目指すプロジェクトがスタートしました。
プログラム板の住人のお力添えも頂ければありがたいです。
http://pc.2ch.net/test/read.cgi/network/1010255621/
完了I/Oポートは指定したメモリ領域に直接データが書き込まれるから
コピー回数の点でselect系のAPIを使うよりも有利だとWinSock本に
書いてあったような。
1000接続つうても、ここらへんの戦略はプロトコルによっても
変わってくる気がする。
209デフォルトの名無しさん:02/01/06 18:48
現在ネットの勉強中です。
インターネットに接続している時に、自分のパソコンにパケットが送られてきていると
思うのですが、この内容を知りたいのです。
例えば、ホームページにアクセスした時に、さまざまなデータが送られてきます。
また、認証のいるチャットなどでも送られてきていると思います。
すでに自分のパソコンがサーバーなどに接続してある以上、パケットの情報を得ることはできると思うのですが…。
素人考えでしょうか?
JAVAでそのようなプログラムを作ってみたいのですが…。
よしろくおながいします。
210デフォルトの名無しさん:02/01/06 18:55
>209
ネタだろけど、その文章見てると多分無理
ダンプツールならフリーで有るから、それ使えば?
211209:02/01/06 19:06
>>210
うーん。ムリっぽいですか〜
自分のパソコンがデータを受け取っている以上、
それをリアルタイムで見ることもできると素人ながらに思ったんですけどね

アナライザというダンプツールは持ってるんですが、
パケットを見るというプログラムを通じて
javaのsocketクラスとネットの勉強しようと思ってるんで…

自分のポート番号を指定したら
こう、ずらずらーっと16進数がでてくるような。。
そーゆーの作ろうと思ってるんですよね〜(笑
というか、OSから見ればjava VMもOS上で動いてる一アプリにすぎない訳で、
OS及びTCP/IPドライバが受け取っているパケット覗きたいならOSの機能を
使わないと駄目。つまりJava単体じゃそもそもできませんって事。
JNI使ってやろうとしてるなら別だけど。
213209:02/01/06 20:20
>>212
>>OSから見ればjava VMもOS上で動いてる一アプリにすぎない訳で
なるほど!
そうゆうことですかー。
ためになります。
どうもありがとうございました。
214214:02/01/07 01:27
ネットワークプログラムとは少しずれてるかもしれませんが、
ふたつほど質問があります。
VC6+WINSOCKの環境です
この関数を使うときに
WSAAsyncSelect(mySocket,hWnd,SM_EVENT,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE);

hWndにいれる変数がわからないです。

イベントハンドラを受け取るウインドウなわけですから
つまりアプリケーションの一番大元のhWndをいれるんだとおもうんですが・・
JAVAのsuper見たいな感じで・・・
VCのダイアログアプリケーションだとどんな風に定義すべきでしょう?

それと
#define SM_EVENT WM_USER+1
みたいな自分で作ったハンドラを受け取りたいんですけど
SM_EVENTが
WINDOWSメッセージハンラの追加のメニューに出てこなくて困ってます。

参考文献:WINSOCK2.0プログラミング/softbank
215Disca ◆NAfP6znE :02/01/07 02:27
age
216214:02/01/07 02:39
自己レスです。
HWND hWnd = m_hWnd;
WSAAsyncSelect(mySocket,hWnd,SM_EVENT,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE);
とやったところなんとかコンパイラは通りました。
しかしどうもSM_EVENTメッセージが返ってきていない様子

SPYででも自分で設定したハンドラを見る方法がわからなかったので
とりあえず

#define SM_EVENT WM_RBUTTONDOWNにして見張っているのですが、
コネクションを行ってもそのようにならないのです。
217214:02/01/07 02:45
すみませんさらに自己レスです。
性格にはコネクションの時にメッセージは返るようですが、
FD_READ|とFD_WRITEが帰らないようです。

それとやっぱり
SM_EVENTが
WINDOWSメッセージハンラの追加のメニューに出てこなくて困ってます。
MFCか。SDK使えば良いじゃん。
メッセージハンドラのメニューなんて気にする必要無いし。
MFCでユーザー定義メッセージを処理するときは
ON_MESSAGEを使うんじゃなかった?
220デフォルトの名無しさん:02/01/07 14:10
209>>
J++てたしかAPI直接呼べたような。
だとしたら作れるような気がしますよ。JAVAで
不確かな情報ですいません。
J++はJAVAじゃない。
222デフォルトの名無しさん:02/01/07 14:24
RubyはJavaじゃない。
ケツは愛じゃない。
224デフォルトの名無しさん:02/01/07 16:36
>>203 ひょっとしてNONBLOCKINGを知らない?
ポートごとにWindow作ってメッセージ窓処理するのはきほんなんだけど
全部カプセル化されててわかんないとか...
もっともブロッキングモードしか使ったことないんだったらWindowは関係ないだろうけど
225ななし:02/01/07 17:42
Netscape 6.1以降?だと、
Connection:Keep-Aliveではなくて、
Keep-Alive: 300つうヘッダが新設されてますね。

また独自仕様を追加したか。頭痛い。
Keep-Aliveヘッダなんて大昔からあったけど?
独自には違いないけど。
227ななし:02/01/07 18:29
確認したが、ネスケ4.7xには無かーたよ。
4.7xだとConnection:Keep-Aliveになる。

いつごろからあったの? >>226
228デフォルトの名無しさん:02/01/07 18:39
すいません。おしえてください。
LANでつながっているコンピュータのすべてのコンピュータ名(IPアドレス)
を表示させるプログラム。どのようなapiを使えばよいのでしょうか?
またjavaではできるのでしょうか。前から気になっていたんですが。
NBTみたいな、ブロードキャストで答えてくれるプロトコルがないとなー。
つか、まさしく、NBTでコンピュータ名取る、とか、WINS鯖や
ActiveDirectoryに訊く、という話?
それとも、自分の属しているネットワーク(サブネットから求める)のIP
すべてに、pingを打つとか、逆引きするとか言う話?(Gatewayがあるか‥‥)
いずれにせよ、少々情報不足な感は否めないな〜
230226ではないが:02/01/07 19:23
>>227
RFC1945(HTTP/1.0)にはKeep-Aliveなんてない

いくつかのソフトが勝手にKeep-Aliveを実装

RFC2068(HTTP/1.1)の19.7.1でこの実装と互換性をとる方法を説明

RFC2616(HTTP/1.1、RFC2068をobsolete)の19.6.2では短い言及のみに

という感じみたい。
ちなみに、Apache 1.3.Xとかだと、"Connection: Keep-Alive"に対して
"Keep-Alive: timeout=15, max=100"みたいに返答する。
231230:02/01/07 19:27
HTTP/1.1では"Connection: Keep-Alive"は定義されてない
(コネクションが続くかどうかは相手任せで、リクエスト完了後に
明示的に切断したければ"Connection: close"を送る)
ようなので、どっちにしても気にしなくていいかも。
232225:02/01/07 20:11
>>230サンクス。
233デフォルトの名無しさん:02/01/07 21:11
229>>
デスクトップでドメインに属しているコンピュータ
名のIPアドレスです。アイコンのネッワークコンピュータが
ありますよね。あれと同じような処理をコンソールからできるようにしたのですが。
とりあえず、
net view
235デフォルトの名無しさん:02/01/07 22:04
>>228
MSNetworkの仕様って良くわからないので
DNSサーバー立ち上げて解決する方法とっているけれど
JAVAクライアントならばその方法がいいんじゃない?

あとブロードキャストものを混ぜるとLANのパフォーマンスがおちるから
学校とか会社のグループミーティングとかいがいはおすすめできない。
236デフォルトの名無しさん:02/01/07 22:07
WSAEventSelect って存在意義がわからん。
こんなん使うんだったら素直にBlockingモード使ったほうがいいいきがする。
Winsock2でICMPが一緒になった以外のメリットを感じない
>>231
Keep-Aliveそのものは定義されてないけど
Connection: に列記されたものはプロキシ越しに渡してはならないという
重要な性質がある
238デフォルトの名無しさん:02/01/08 01:04
>>236
なんで? ウィンドウハンドルいらないってのはウィンドウを
表示しないプログラムにとってはメリットだと思うけど。
ブロッキングソケットで無駄にスレッドを消費するよりもスマート
だと思うけどな。
239230:02/01/08 09:08
>>237
231はクライアントのことしか考えてなかった。フォローサンクス
240デフォルトの名無しさん:02/01/09 14:28
FTPクライアントを作っているんですが
FTPサーバーのパスはスラッシュから始まっていますが( 例:/public_html/ )
スラッシュで始まるという決まりなのでしょうか?
それとも偶然ですか?
「RFC 読め!」ってのは無しでお願いします。
英語読めません。
RFC の日本語訳って何処かにありますか?
241初心者:02/01/09 15:14
>>954
クライアントからサーバーにデータを送って、
サーバー側でrecvした直後って事ですよね?
そしたらサーバー側からクライアントにACK
送るのにかかった時間はどうなるんですか?
その時間が含まれないような気がするんですが。
>>241http://pc.2ch.net/test/read.cgi/tech/970344582/953n-954の
続きなのだろうか…

ACKの処理とかはアプリケーションよりも下の階層の仕事なので、
時刻以前に「ACKが来たことを知る」のがちょいとメンドウ。
パケットモニタと同様の処理を作りこめばいけると思いますが。
244デフォルトの名無しさん:02/01/09 18:41
>>238 確かにブロッキングソケットで無駄にスレッドを消費するのは非効率だから
WSAEventSelect見たいなのが出てきたんだと思うけれど
結局そこで待っているだけだから単なるごまかしだと思う。
どうせやるならI/Oイベント待ち受けスレッドにして信号がきたら
対応するソケットのワークスレッドを立ち上げる形にすればよかったんじゃなかろうか。

Windowっていってもたいていは非表示のWinsock専用クラスだし
実際LANカードは1枚の場合が多いからWindowベースで
イベントベースでスレッドを生成していくほうがCPUの動作効率は良いと思う
245超初心者:02/01/09 19:06
TCPを使ってクライアント・サーバーを構築しています。
スループットを計測したいんですが、具体的にどうやって
計測したらいいでしょうか?
つまり、クライアントから画像なんかを送って、サーバー側で
それを受信するみたいな感じなんですが・・・。
246504:02/01/09 22:50
DPT技術者になるには進路はどうすればいいんでしょうか?
将来食べて行けますか?
どなたかこたえてくださいな。
>>236
確かにな。ウィンドウハンドルを渡せる仕様は間違いだな(藁
第2引数は素直にHANDLE型にしておけばよかったものを…

同期オブジェクトならMsgWaitFor〜系API使えるからそれで十分
無駄にウィンドウ作る奴は頭悪いとしか思えん
windows3.1時代の負の遺産
>>244
>結局そこで待っているだけだから

ん? WSAEventSelectでは待たないよ。WSAEventSelectは単なるソケット登録
関数だから。
待つのはWSAWaitForMultipleEvents。登録した複数のソケットを同時に
監視できる。
毎回スレッドを生成するのは重いと思うのだが
251デフォルトの名無しさん:02/01/11 12:51
WinInetでmms://~のファイルを読むことはできますか?
っていうか、mmsとか関係ないですか?

っていうかmmsってなんですか?
252デフォルトの名無しさん:02/01/11 13:02
sage
253デフォルトの名無しさん:02/01/11 16:08
>>249 それってひとつのスレッドに対して複数のソケットの応答がくるってことですか?
だったら使える気もしますが

サーバー用途の場合LANボードが1枚だったらサブWindow一個に
Winsoc1.1の非同期でのメッセージによる振り分けというのが
一番CPU効率よいように思えるんですけど
254253:02/01/11 18:59
WSAEventSelect-WSAWaitForMultipleEventsのコンビネーションの欠点ですが
待つことはまつんですが
WSAEventSelectは確かにある意味非同期なのですが
nRet = WSAWaitForMultipleEvents(1,&hEvent,FALSE,WSA_INFINITE,FALSE);
は唯一のイベントに対してしか待てないですよね、

ひょっとして単一の待ちスレッドで複数のイベントオブジェクトを待てる仕様なのを
勘違いしているのかと思いましたが
そういうことはないようです。
そういう仕様(ひとつのイベント監視スレッドによる動作)ならよいのですが...

WSAAsyncSelectはWSAAsyncGetProtoByNameなどと併用して
メッセージで対応するwMsgでひとつの待ち受け関数でスレッドは作らずに
複数のイベントを処理できる。
ということがいいたかったのです。
あとWinsock2追加コマンドではブロッキングモードでしかName解読出来ないですよね、
無論DNSlookupべたでやる手はありますが
ブロッキングモードで一番痛いのはインターネットとつながっていないときに
name解決で固まりがちなところじゃないかと思うんですけれど
SMTPサーバーとかででたらめなメールアドレスできたら非同期->Window待ちでないと
パンクしやすいのでは?と思います。
「唯一のイベントしか待てない」のだとしたら、名前がなぜWaitForMultipleEventなのか
また、なぜ先頭に「イベントの個数」の引数が来ているのか疑問に思うべき。ツカ、ネタデスカ。

配列に複数のイベント放り込んで待つにきまってるやないか。MSDN嫁!

それと、SMTP鯖ならMXレコード引くから手動のDNS Lookupは
どうやったって必要になると思うがどうか。
256U21:02/01/11 22:19
ちょっと聞いてもいいですか?

POSIXスレッドを使い、作成したスレッドでサーバとのやり取りのために
socketを作り、selectで監視するようなPGを作成しています。

ただ単に、コンソール入力、サーバからの受信をする分には問題はないのですが、
メインスレッドのPGからメッセージをなげてselectで監視するようにしたいのですが、
どうすればいいのでしょうか?

メインスレッドである条件が整ったらサーバにデータを送信するようにしたいのです。

お願いします。
一つは、selectしているスレッドで、ついでにrecvfromあたりの
ソケトも一緒にselectしとく(ポトは適当に選べ)。
メインスレッドで、そのlocalhost:ポトに対して適切なメセジを
sendtoする、というのが手軽で良いがどうか。

或いは、mutexを確保して、ときどきポリングするとか。
まてよ。posixスレドって事はUNIXか。なら、パイプを開いて、
read_endをselectしとく方が簡単かもな。(トリガは書きこみ)
259デフォルトの名無しさん:02/01/11 22:50
>>255 書き方悪かったから変にとられちゃったけれど
まとめてイベントが設定できるといっても
待っている最中に次のイベントが発生するような形には対応できないでしょうが...

結局割り込みベースの処理が必要なのにフローベースの
プログラミングが必要になるからマルチ待ちといっても
フレキシブルにやるには自前でポインタのデータベース処理が必要になるはず

つまりひとつのイベントしか対応できないのとおんなじ
少なくともMSやそこらにあるサンプルではWSASELECTEVENTと同一のルーチン内で
WaitForMultipleEventで
イベント待ちしてWhileでループかけているのが多い
コードが汚くてブロッキングモードをマルチスレッドでまわすほうがまし

ほんとだったらこれはコールバック関数を指定してそっちで通る形にすればよかったはず

つまり結局はコールバックイベント処理やWindow処理のプログラミングができなくて
かつマルチスレッドプログラムがうまく作れない人向き

ほんとはWaitForMultipleEventProcをWSASelselectEventで指定してやり
WaitForMultipleEventProc内ではオブジェクト番号とコマンドで
オブジェクト別処理に分岐する形にしてやれば
動的にソケットが増減しても対応できるはず

あとDNSLookUPはあってコントロールすることはプログラマーには容易だけど
現実問題として既存のアプリを見るとサーバーについているクライアント部分の
アドレス解決にDNSLookUpを使っているという話は聞かない。
というより書き込みの意味はWinsock自体がDNSLOOKUPでホスト名解決をしていないってことだ
(ちなみにDNSサーバー名の取得は結構苦労する...APIにいれてホシ)

逆に聞くけれどWindow使わないでWSAGetAddressByName使えるのかい?
(FD_ADDRESS_とかだと思ったが違うみたいだし....)
260右脳の痛み娘:02/01/12 00:31
こんばんは。はじめまして。色々なHPにいってみたんですが、
どこが良いのか分からなくて、教えてくれる人!探してます。

質問:"Install Shield"でサービス停止について
今、"Install Shield"のプログラムで"Service"機能(NT系で使用)
を停止させることの出来る関数を探しています。
どこをみろ!
とか、
これを使え!
とか、
何でも良いので情報頂けないでしょうか?
ヨロシクお願いします。
261デフォルトの名無しさん:02/01/12 00:56
>>256
スレッドや相手のサーバが幾つあるのか知んないけど、
サーバとの接続の端点であるsocketの読み書きには、排他制御をきちんと行ない、
メインスレッドとやらが送りたくなったら好きな時に送れや。
サーバが返事返すなら、select側の進行は止めとけや。

do {
result = select(...);
if (メインスレッドがサーバとやりとり中&&そこが読み込み可) {
continue;
}
}

1. メインスレッドがサーバへ。→
2. サーバから通常のやりとり。←
3. メインスレッドに対するサーバの返事。←

と2が間に入ってしまった時の対応を良く考える必要がある。

1. データにheaderをつけdispatcherにスレッドに対する分配を任せる。(multiplexing)
2. 別の接続にする。

辺りだろうな。
そもそも、WSAEventSelect, WSAWaitFor...は、select系を置き換える
為のものではなかったのかと思っているが(selectでWin32のイベントも待ちたい、とか)

>待っている最中に次のイベントが発生するような形には対応できないでしょうが...
で、なんでその「他のイベント」も待たないわけ?

>フレキシブルにやるには自前でポインタのデータベース処理が必要になるはず
つまり、ダイナミックに待ち配列を編集する必要があるということか?
今時そんなものが障害になるとも思えないが。

>結局割り込みベースの処理が必要なのにフローベースの
>プログラミングが必要になるからマルチ待ちといっても
メッセージベースの処理が必要なら、Win16時代のnon-threadableな
方式でゴリゴリ書いていったらいいと思うよ。

>ほんとだったらこれはコールバック関数を指定してそっちで通る形にすればよかったはず
WSASend、WSARecvの最後の引数は何さ?

>というより書き込みの意味はWinsock自体がDNSLOOKUPでホスト名解決をしていないってことだ
わけわからんな。じゃあ、WinSockはどっから名前解決するんだよ。WINS鯖とでもいうのか?
263U21:02/01/12 15:12
>>257
アドバイスありがとうございます。

通信用のスレッドで
 ・UDP用のソケットを作る
 ・そのソケット用にbindをする
 ・selectでそのソケットも監視する
 ・recvfrom()でデータを受信する

メインスレッドで
 ・UDP用のソケットを作る
 ・sendto()でデータを送信する

と言う形で、問題が解決しました。
ありがとうございました。
264U21:02/01/12 16:15
>>258

pipe()を使ったほうが簡単でプログラムのすっきりしますね。

メインスレッドで
 ・pipe()を作る(読み込み用と書き込み用のFDができる)
 ・書き込み用のFDにwrite()する

通信用スレッドで
 ・パイプの読み込み用FDをselectで監視する
 ・read()でデータを受信する
259はJava厨房なのかも
>>259
>逆に聞くけれどWindow使わないでWSAGetAddressByName使えるのかい?

WinSock2的にはWSALookupService〜系のAPIを使うのが正解か?
使ったことないし、めんどくさそうだけど。
267socket初心者:02/01/14 00:50
CでWinsock APIを使ってるんですけど、疑問があります。

shutdown()APIって何の意味があるの?
MSDNには、SD_SENDを指定すればFINを送信するみたいなことを
書いてるけど、LANモニタで見ても何も起こってないんだけど。
単にローカルのTCP/IPスタックに終了することを通知するだけ?
そーいえば、新スレにはリンクがなかった
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
ならついでに。
http://tangentsoft.net/wskfaq/
270socket初心者:02/01/14 12:14
267です。
>>268さんのリンク先で次のような表現を見つけました。

>典型的な使い方は、サーバに要求を送り、続けて shutdown() を行なうことです。
>サーバはあなたの要求を受け取り、続けて EOF (ほとんどの UNIX の実装では
> 0 バイトの read)を受け取るでしょう。これは、それであなたの要求が全てで
>ある、ということをサーバに伝えます。

shutdown()を呼んでも何のパケットも流れないのに、なんでサーバはEOFを
受け取るのですか?(どうやって「要求がすべてである、ということをサーバに
伝え」るのですか?)
271socket初心者:02/01/14 12:15
あげ
272socket初心者:02/01/14 16:18
>>270自己レス

connect()した側のdescripterにおいては、shutdown(SD_SEND)すると
FINが送られるが、listening socketのaccept()により返された側のdescripterに
おいてはshutdown(SD_SEND)ではなく、closesocket()でFINが送られるみたいね。
後者ではshutdown()を呼ぶ意味は無いのか?
273救援依頼:02/01/14 16:43
現在、半角文字列板にて悪質大量宣伝業者に向けての
攻撃をしています。
悪質サイトの有料画像を直リンクで貼ったりとしたことを
中心に動いています。

しかし、専門的なことが多くスキルのある方々の協力が
欲しいのが心情です。
お時間があるかた少しでも協力していただけないでしょうか?
見返りは薄いです。
有志の集まりなので。

http://wow.bbspink.com/test/read.cgi/ascii/1010991966/
274デフォルトの名無しさん:02/01/14 17:58
パイプカット?
>>272
確認だけど、
1. TCPのsocketだよね?
2. via networkでの接続だよね?
276たかし:02/01/15 11:57
VB5.0で Winsock&UDPプロトコルでのメッセンジャー
を作っているのですが
Dim Str As String
Str = Text2.Text + Space(5) + Time$
Winsock1.SendData Str
というような具合でSendDataするとなぜか
”実行時エラー126”が出てプログラムが強制終了されてしまうことがあります。
不定期でうまくいったり、ダメだったりするときがあるのでまったく原因がわかりません
某掲示板で”実行時エラー126”は「モジュールが読み込めない」という理由らしいのですが
うまく行くときもあるので結局わからずじまいです…どなたか情報ありましたらお願い致します。
あ、ついでに
Winsock.Connectは使用していないのでLocalPortに0を指定は関係ありませんよね?
277たかし:02/01/15 18:16
なんかIPアドレス指定ではなくPCの名前で
通信をしたところ、すんなりと成功しました(笑)
自分のLAN環境なども見直してみたいとおもいます
ありがとうございました。
278やまも:02/01/16 01:39
現在Solaris8(SPARC)上で動作するアプリケーションを開発しています。
ローカルとリモートのサーバ上のRPCサーバと通信をしたいのですが、RPCはrpc_genで
作成したコードではポート番号をランダムに割り当てます。
両サーバの間にはFWがありますのでポートを固定する必要があります。
どなたか何か方法をご存知でしょうか。
279デフォルトの名無しさん:02/01/16 01:41
とあるサーバプロセスのプロファイルとったらselectの
処理時間が50%以上占めていました。
これはこういうものなんでしょうか?
一般にselectを高速化する手法ってありますか?
>>279
ソケットの数とOS名、言語名をどうぞ
むろん、ノンブロッキングソケットだよね。いや、一応。
282279:02/01/16 01:55
ソケット数:200-600
OS:Windows, Linux, Solaris(ソース共通)
言語:C
です
283デフォルトの名無しさん:02/01/16 02:12
>>278
TCP/IP port番号←→RPC プログラム番号/バージョン番号
のmappingは、サーバ側のrpcbind(1M)が担ってるのは知ってる?

1. rcpbind@サーバが起動する。
2. rpcサーバ@サーバが起動する。
2.1 rpcbindに自分のRPCサービスを登録する。(上の対応とsocket)
3. rpcクライアント@クライアントが起動する。
3.1 rpcクライアント@クライアントが、rpcbind@サーバに、
RPC プログラム番号/バージョン番号に対応するTCP/IP port番号を問い合わせる。
3.2 知らされたTCP/IP port番号に接続し、遠隔手続き呼出しを実行する。

となるので、2.1で特定のTCP/IP port番号に登録するようにするか。
1と2の間で、任意のTCP/IP port番号にrpcbind@サーバに登録してやればいい。

rpcb_set(3rpcbind)とかsvc_register(3rpc_soc)だな。
登録するのは、rpcサーバプログラム@サーバでsvctcp_create(3rpcbind)を呼ぶ前でもいいし、
全く独立したプログラムでもいい。あらかじめ登録されていれば、それを使う。
rpcinfo(1M)でも登録出来るから、shell scriptでも可能。
284デフォルトの名無しさん:02/01/16 02:16
>>282
どのOSのプロファイルも同じ結果か?ということと、
timeoutの数値が極端に小さくないか?という事を聞きたい。
timeoutを0にするとすごいことに
286やまも:02/01/16 02:35
>>283

レスありがとうございます。

現在試しているのが、svctcp_createで作成したSVCXPRTを
svc_registerに渡す方法ですが、svctcp_createのパラメータに
RPC_ANYSOCKに渡すとポートを割り当てられてしまいます。
svctcp_createの第一パラメータにソケットを作って渡す方法
を考えていますが、これは可能なのでしょうか。

もっと簡単な方法があったら教えていただけますでしょうか。
レスの中の方法ですが、私初心者なものでもっと詳細にご説明して
いただけるとすごくありがたいです。
どうかよろしくお願いします。
287デフォルトの名無しさん:02/01/16 05:02
>>286
rpcb_set(3N)だけやるprogram書いて登録しなよ。お望みのport番号を。
port番号は、rpcbind(1M)が覚えているのであって、
RPCサーバ/クライアントが管理しているのでないのは理解したの? 理解したの? したの?

>>283
> rpcinfo(1M)でも登録出来るから、shell scriptでも可能。
ありゃ、これ出来ないわ。
288やまも:02/01/16 07:21
>>287

度々のレスありがとうございます。

>RPCサーバ/クライアントが管理しているのでないのは理解したの? 理解したの? したの?

おかげさまでこれは理解できたんですが、rpcb_setの使い方がよくわかりません。
3番目のパラメータのnetconfigはどうやって作成して、ポートを指定したら言いのでしょうか。
/etc/netconfigに何か指定とかが必要なのでしょうか。
4番目のパラメータもどうしていいかわかりません。

度々申し訳ありませんが、どうか教えてくださいませ。
289login:Penguin:02/01/16 16:20
rpcb_set(3NSL)はrpcbind向けの関数なんだけど、
rpcbindは、portmapのトランスポート非依存版なんだ。(TI-RPCってやつな)
(3rd: トランスポート指定、4th: トランスポート依存ポート指定)

TCP/IPしか相手にしなくて良ければ、pmap_set(3NSL)使いなよ。
http://docs.sun.com:80/ab2/coll.141.6/ONCDG/@Ab2PageView/30349?DwebQuery=rpcb+set&oqt=rpcb_set&Ab2Lang=ja&Ab2Enc=euc-jp
#includeする前に、#define PORTMAP忘れないでね。
>>272
サーバ側がSD_SEND使ったってFINが送られるわけねーよ。
この場合、データは送信しないけどSD_RECV(またはSD_BOTH)を使ってなければ
クライアント→サーバ一方向の通信は続ける事ができるんだから
FINを送るわけにはいかないだろ。
291デフォルトの名無しさん:02/01/17 09:10
すいません。質問です。
WinSockでLinuxのPACKETに代わるようなものありませんか?
292291:02/01/17 09:11
誤)WinSock

正)Windows
293 :02/01/17 12:33
>>290
(゚Д゚)ハァ?
FINの意味解かってる?

>>272の件は、コードにバグがあるに10000パケット

294やまも:02/01/17 19:57
>>289

レスありがとうございます。

rpc_genの生成ソースだと、rpcサーバ側の起動手順が
1)svc_reg() → svc_run() か
2)svc_create() → svc_register() → svc_run()
ですが、pmap_set()を使用する場合、
どういう呼び出し手順になるんでしょうか。
pmap_setというのはsvc_register()の中で行われて
いるんですよね。
よろしくお願いします。


>>272

> listening socketのaccept()により返された側のdescripterにおいては
> shutdown(SD_SEND)ではなく、closesocket()でFINが送られるみたいね。後
> 者ではshutdown()を呼ぶ意味は無いのか?

closesocket() って言っているからプラットフォームはWindowsなんだろうけど、
Socket API の源流であるUNIX上では、accept 側でも shutdown(SD_SEND) で
FIN が送られるよ。(ゴソゴソ… 一応 NetBSD で確認してみた。間違いない。
シンボル名は UNIX 系の場合 SD_SEND じゃなくて SHUT_WR だが…)

293が言っているようにコードにバグがあるか、WinSockの実装がバグっているか
に、もう10000パケット。
296デフォルトの名無しさん:02/01/18 03:21
>>294
> pmap_set()を使用する場合、どういう呼び出し手順になるんでしょうか。

そんなものはない。
あなたが、port番号が確定して欲しい時までに「あなたが」登録すれば良い。
別のプログラムでさえいい。

>>288
>おかげさまでこれは理解できたんですが、rpcb_setの使い方がよくわかりません。

まだ理解できてないな。挙げたdocs.sun.comのページよく読みなよ。



297デフォルトの名無しさん:02/01/18 08:35
どなたかWindows Platform SDK(IPv6)のCheckv4.exeの使い方知りませんか?
298デフォルトの名無しさん:02/01/18 11:22
Winsockでのタイムアウト処理を実現するにはselect関数しか
無いのでしょうか?
UniXだとシグナルで検知することが出来ますよね?
どなたか知っている方、お知恵を貸して下さい。
>298
see >>127-145
300297:02/01/18 15:52
はい、自己レスです・・・・HPにあった。くそー。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/portguid_460i.asp

・・みなさん必要としてないかもしれませんが一応。
301U21:02/01/23 15:43
ネットワークバイトオーダーの説明で

 = ただし、より上位のアプリケーション層などでのバイトオーダーの扱いは、
 = 各アプリケーションごとに自由に決定可能で、システムの都合のよい
 = 受け渡し方法を選べばよい。

とあるのですが、自分で定義した構造体を送受信するときも、
htons()等を利用する必要が有るとかんがえて間違いないですか?

http://www.atmarkit.co.jp/icd/root/72/116970472.html
302デフォルトの名無しさん:02/01/23 16:11
>>301
はい。
ただ、自分で定義した構造体って事は送信先のアプリも自分で作ってるのだろうから、
使わなくともできない事はない気もします。ややこしくなるけど。
ところで、構造体を送受信って、どうやってるんすか?WinのCSocketってやつすか?
303302:02/01/23 16:30
ごめんなさい。私変なこと書いたね。
>WinのCSocketってやつすか

忘れてください。
304U21:02/01/23 16:35
>>302

ありがとうございます。
ソケットのFDに対してwrite()/read()で行います。

305デフォルトの名無しさん:02/01/23 21:34
MFCでソケットプログラム書く時、FD_READとかプロシージャに書いてた部分の処理って
どこに書けばいいの?
CSocketとか使ってなくて、MFCだけどAPIをそのまま使ってます。
今までウィンドウプロシージャに置いてた処理をどこに書けばいいか、サパーリ分かりません。
306デフォルトの名無しさん:02/01/24 00:33
>今までウィンドウプロシージャに置いてた処理をどこに書けばいいか、サパーリ分かりません。

別にここに書けっていう決まりは無いんじゃないの?
俺ならメッセージハンドラを自作するか CWnd::WndProc()(だったけ?)に書くかなぁ。
307デフォルトの名無しさん:02/01/24 03:26
>>305
素直にCSocket使え
308デフォルトの名無しさん:02/01/24 09:13
>>305
WSAAsyncSelect()とか使えば?
309デフォルトの名無しさん:02/01/24 09:14
もしくは、CAsyncSocketをおーばーらいど。
310308:02/01/24 09:50
>>305
もうちっと、しつこく書くと、
WSAAsyncSocket(そけっとはんどる,どこかのWndのはんどる,WM_USER+10,lEvent);

BEGIN_MESSAGE_MAP(CどこかのWnd,C親クラス)
//{{AFX_MSG_MAP(CどこかのWnd)
ON_MESSAGE(WM_USER+10,Onなんとか)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

long CどこかのWnd::Onなんとか(WPARAM,LPARAM)
{
//ここに書く!
}

・・・とかね。
age
312デフォルトの名無しさん:02/01/25 20:21
つまらぬ質問です。

簡単な試験などの目的のために、
サーバアプリを作ったりさせられることが多いのですが(今のところCで作っている)
いいかげん面倒くさい。

この目的を簡単に達成できる言語って何でしょう?
つまりお手軽にある程度のネットワーク系が書ける言語ですが。
Perl
>>312
Java
慣れれば新規ソースからサーバソケット開くまで 3 分。
Ruby
inetdを使うのがいいような。
317デフォルトの名無しさん:02/01/28 14:47
WindowsNTでウィンドウサイズってどうやって変更するんですか?
つうか、変更する場所なんてあるの?
>>317
setsockoptもしくは、CAsyncSocket::SetSockOptでし。
319デフォルトの名無しさん:02/01/28 16:23
>>318
ありがとうございます。やってみます。
320デフォルトの名無しさん:02/01/28 17:09
WinSockのWSAStringToAddressで指定する、WSAPROTOCOL_INFOのメンバって
なにを格納しておけばいいですかねぇ?
普通にドットデシマル表記をバイナリに直したいだけなんですが・・・。
321デフォルトの名無しさん:02/01/29 00:31
Win2000とSPARC Solarisでsocketしますが
バイトオーダー変換を詳しくおしえてください
>>317
ハゲしくスレ違い…と思ったのは俺だけじゃないはず (藁
323デフォルトの名無しさん:02/01/29 00:56
>>312
VB...... 藁

マジな話、評価・テスト用の対向サーバーとかクライアントはVBでやってます
サーバーソケット開くまで1分かからんですな
コードは数行だし
324デフォルトの名無しさん:02/01/29 00:58
ぶっちゃけ、CSocketって駄目ですか?
企業のプログラムとかでは使われることは無いと聞いたのですが
やはり致命的な欠陥でもあるんですか?
325デフォルトの名無しさん:02/01/29 01:02
>>324
何処のCSocketだね?
オレが作ったのはcSocketだが、企業のプログラムでも使ってるけど
326デフォルトの名無しさん:02/01/29 01:04
>>325
失礼。MFCのです。
327デフォルトの名無しさん:02/01/29 01:08
>>326
Microsoftでは使われていますが・・・
328デフォルトの名無しさん:02/01/29 01:10
>>327
マイクロソフトの人?
マイクロソフトだからこそ、逆に使ってない気がするけど。
329327:02/01/29 01:11
スマソ
過去形にしてください
使われていました・・・
331デフォルトの名無しさん:02/01/29 01:31
>>330
日本語に訳してYO!
332デフォルトの名無しさん:02/01/29 01:46
>>331
CSocketは有害です って事だ
333デフォルトの名無しさん:02/01/29 01:49
CAsyncSocketもヤバイの?
こっちは結構使われてそうだけど。
って言うか、これが使われてなかったらMFCでソケット使う手段無いじゃん?
もちろんMFCでも直接API叩けば良いんだけれど、それだとMFCの意味無いし。
要約してやろう。
CSocketは有害
・CAsyncSocket
 DNSのlookupを同期で行い、長いこと待たされる。
 CSocketとCWndを多重継承できない
・CSocket
 同期socketを、非同期Socketで実現させている
  (その間、メッセージループが回る)。
 「同期」している間に、ウインドウメッセージが
  飛んできてひどい目に遭うぜ。
 CSocketって、重要なところで、例外とかサーションが発生しがち。
 つか、素直に、簡単なWinSockのブロッキングソケット使えや。
・CCESocket
 WinCEでは、非同期ソケットがつかえない。
 諦めればいいものを、MSはスレッドとブロッキングソケットを
 つかって非同期ソケットをエミュレートしている。
結論
 実現可能、ということと、便利に使える、は別物
 設計が悪い。レドモンド逝ってよし。
 
>>334
名訳だ・・・
336デフォルトの名無しさん:02/01/29 08:35
>>321
ソラリスは使った事無いが多分似たようなもんだろう
unsigned long ntohl( unsigned long netlong); //ネットワークバイトオーダをホストバイトオーダに変換
unsigned long htonl( unsigned long hostlong); //ホストバイトオーダをネットワークバイトオーダに変換

ネットワークバイトオーダとホストのバイトオーダが同じ場合はこの関数は変換を
行わない。ちなみにshort型を扱うhtons、ntohsなどもある。

>>322
スレ違いじゃないぞ!ウィンドウサイズも知らんのか?????
だからそういうネタでしょ
面白くもなんともないネタだな
>>336
あーすまん、知ってるけど思わずそう感じただけ (→ウィンドウサイズ)。
でも >>322 読み直すと折れがスレ違いを指摘してるように見えるわ。鬱だ…
>>334
それに、CSocket最大のウリであるCArchive使ったオブジェクトのやり取り
があまりにも使えないしね〜・・・。互換性ゼロだし。
ただCStringつかったMBCSやらUnicodeやらの変換っていうのはMFC派としては
「いいんじゃない?」って感じでした。
>>338
それほどでもないと思ったけど
342kei:02/01/29 13:31
winsock 同期型ソケットのconnect関数で
接続先が見つからない場合に制御が戻ってくるまでの時間
接続先サーバが未稼動で、接続に失敗した場合に制御が戻ってくるまでの時間って
どこかで決まっているんですか?
343mai:02/01/29 14:33
sa
344デフォルトの名無しさん:02/01/29 15:18
>>312
Cのコードが既に蓄積されているのなら、C++でいいんでないの?
classをちょっと書けば、お手軽に幾らでも書けるよね。
まあ、C++書けないなら駄目だけど。
>>342
・・・・・・・・確か、なかったと思う。
どうしてもナントカしたいのなら、非同期系をすすめるよ。
大変だけど。いろんな意味で。
346mai:02/01/29 16:07
非同期にしたところで、connect関数自体の処理にかかる時間は変わらない
んですよね?
>>346
内部でやってる処理にかかる時間はかわらないけど、
制御は接続する前にすぐに返ってくるでしょ。
348kei:02/01/29 16:25
>>345
ないんですか。
非同期系にすると・・・
確かにいやになりますね。根本的に設計し直したほうがよいのかも。
ありがとう
349はじめましてこ:02/01/29 16:33
>>342
確かにありませんよね。
リモートホストと
リモートポートの記述で接続されるのでしょうか。
350kei:02/01/29 16:44
>>349
ローカルホストです。
351デフォルトの名無しさん:02/01/29 16:48
>>348 同期というかblockingモードでも時間設定はできるけれど
待っているのかだめなのかはわからないから別スレッドで監視して
やればいいんじゃない?

ても基本的に非同期(Winsock1.1の)方がいいと思う
352kei:02/01/29 16:56
>>351
それって、非同期ソケットにして、selectでタイムアウトをまつって感じ
ですか?

非同期モードにしても、connectの処理結果によって以降の処理が変わる
ため意味がないと思ってたんですけどね。

どこぞで、時間を決めていたのなら短くしてやろうと思い調べてたんです
けど、なさそ
>>352
まあ、しかし非同期だと、自分で好きな時にブチ切ることもできるよ。一応。
それを「タイムアウト」とすればいいんじゃないかなぁ?
そもそもどうしてconnectのタイムアウトを変えたいの?
355kei:02/01/29 17:13
>>354
UNIXの場合connect関数ってすぐに制御がもどってきていたんで、winsock
のこの部分が気になったんですよ。なんか、判定に微妙な時間(1〜2秒)
程度かかるので、時間を統一したいしもうちょっと早くならないかと

>>353
時間的に余裕があるなら是非非同期にしてみたいんですが、それほど余裕な
いし、逃げ道ちょっと考えてみます。
356351:02/01/29 17:15
>>352
まず非同期ソケットについて勘違いしているみたいなのですが
非同期ソケットはconnectが成功するかタイムアウトになった時
非同期オブジェクト(Winsock2)またはWindowメッセージ(winsock1.1)
に通知がくるのでメインの流れは止まりません。
ソケットへの停止はWSACancelAsyncRequestが使えます。
但しHostbynameなどは強制停止できません。

時間を決めて短くする場合短すぎると単に遅かったり線が細いのとの切り分けが難しいと思います。
私はblockigソケットのその辺の仕様がうざいのでのっけから除外してしまったのですが
邪道としてブロッキングソケットの使用中にWSACancelblockingCallを使えば
ブロッキングソケットの動作を停止できるはずなんだけどあんまりみないです。

時間はselectでtimerのポインタを指定できるはずそこに値を入れてやればいいはず
あと外部からのタイマー監視で既知のソケットをシャットダウンすれば
キャンセルはできるんじゃないのかな?
今はselect関数の最後のパラメータはどうしてんの?
>UNIXの場合connect関数ってすぐに制御がもどってきていたんで、
失敗した時も?
358kei:02/01/29 17:42
>>356
connectに対してselectを使用してないです。

今、いじってるアプリって”メッセージを大量に送信し、送り先が未接続の場合
1メッセージ毎に接続にいく仕様”なんで同期でも
非同期でもどうしてもconnectでブロッキングしてしまうと遅くなってしま
うと。
勘違いしてますかね?
359kei:02/01/29 17:48
>>357
はい
>>358
・・・よくわからんな、これ。
>”メッセージを大量に送信し、送り先が未接続の場合 1メッセージ毎に接続にいく仕様”

いくつかサーバーがあって、そのどれかに接続したくて、それらの接続状態を
確認し、connectする。・・・で、ちょっとでも接続に時間がかかるようなら
他の接続可能なサーバに接続しにいく・・・ってことか?
>>359
それ非同期なんじゃあ・・・?
362kei:02/01/29 18:00
>>360
いくつかサーバーがあって、そのどれもに接続したくて、それらの接続状態を
確認し、connectする。で、接続に失敗したら次のメッセージでまた接続に行く。
てことです。 今思うと無理な設計ですな、これって。

>>361
非同期のコードは何もないんですがねー・・・
単純にconnectの判定がはやいだけかも
>>362
他にクライアントは?

下位はイーサネットだよね?
364kei:02/01/29 18:10
>>363

今のところクライアント1対サーバ多

>>下位はイーサネットだよね?
はい
365デフォルトの名無しさん:02/01/29 18:24
くだ質ですみません

winsockで送信単位と受信単位が1対1で対応しないのを、
対応するうまーな方法はありますか?

例:10バイトのデータを5回、連続して送信しても、受信側は50バイト
  のひとかたまりのデータと見なしてしまう。

がいしゅつだったらスイマセンが、ご教授いただけたらありがたいです。
よろしくおながいします
366名無しさん@接続しっぱなし。:02/01/29 18:27
Solarisだと、tcp_ip_abort_cintervalってのをsystem毎に変えられる。(socket毎ではないw)

Socketをnon-blockingにしてから、connect()して、
timeout付きselect()で接続を確認したら、blockingに戻すのが、簡単なんじゃない?
UNIXのみで動けばいいcodeなら、alarm()で割り込む終了させるのがいいと思うけど、
Windowsでも使うらしいからねー。
367kei:02/01/29 18:30
もう少し悩んでみます。
って、私がなやんでもショウガナインダケドネ。
設計してる人に相談。
368デフォルトの名無しさん:02/01/29 18:31
>>365
それは対応は出来ない。
なぜなら、相手の環境が不定だから。
その例でいくと、10バイト*5回でさえ保証はされないだろ?
ほぼ絶対的にありえない話なんだが、もしかしたら相手の受信バッファが2バイトしかないかもしれない。
そうしたら、2*5*5=50回の受信が必要。

これらをプログラムでどうこうするのは不可能。
369名無しさん@接続しっぱなし。:02/01/29 18:36
あ、>>366は、>>361に後続するつもりで書いた…

>>362
その仕様で、client側でtimeoutをcontrolしていいってことなら、
接続しちゃった(けどclientでtimeout!)のを後から切断してもいい訳だよね。
だったら、multi-threadedにして、最初に接続したのを採用、
後は接続切断、socket close、thread終了、が素直だと思う。
370名無しさん@接続しっぱなし。:02/01/29 18:40
>>365
TCPと仮定します。
TCPは、packet境界というものが存在しない、ストリーム通信のサービスを提供します。
それが、SOCK_STREAMの意味。境界を識別するのは、アプリケーションの仕事です。

まず最初にデータサイズやデータ型IDを送る事ですな。
371365:02/01/29 18:41
>>368レスありがとうございます
あっおっしゃるとおり、それもそうでした。
ほんとにくだ質でしたスイマセン
372365:02/01/29 18:45
>>370レスありがとうございます
TCPで結構です。僕(VB厨)もTCPを想定していました
おっしゃってることは理解しました
>まず最初にデータサイズやデータ型IDを送る事ですな。
とありますが、やはりFTPのようにバイナリ転送用と通信手続き用で
別個のソケットが必要ということですね
教えていただいた方向で試してみます
373winsock初心者:02/01/29 19:03
下の関数のどなたか解説してもらえないでしょうか?
MSDN読んでもよくわからなかったのです。

WSAWaitForMultipleEvents()
WSAEnumNetworkEvents()
374名無しさん@接続しっぱなし。:02/01/29 19:43
>>372
> とありますが、やはりFTPのようにバイナリ転送用と通信手続き用で
> 別個のソケットが必要ということですね

いや、一つの接続の中で、

struct type 1 {
uint16_t size;
char data[TYPE1_SIZE];
}

な感じのを送るのよ。
375365:02/01/29 23:47
>>374
なるほど、でもそれじゃその情報と送りたいバイナリとの区別がつかない
ということは生じ得ませんか?
或いはたまたま一致することもありそうですし・・・
>>375
ハァ?
データのサイズを送るだろ。んで、データを送るだろ。
また次のデータのサイズを送るだろ。んで、データを送るだろ。

受け取る側から見れば、
まずデータのサイズがあって、そのサイズ分だけデータを読む。
また次のデータのサイズがあって、そのサイズ分だけデータを読む。

・・・何か問題が?
>365
SOCKETでは、パケットなんつーのは幻想なわけよ。
どっちかってーと、
クライアントには、「いつ溢れるかしれないディスク上にあるファイル」
サーバーには、「どのくらいデータの入っているかわからないファイル」
の方が近い。
>>378
それはちょっといい過ぎ。
パケット境界をサービスするSOCK_SEQPACKETってtypeが一応あります。
私はこれが実装されているシステムを使った事はありませんが(w
380378:02/01/30 02:10
/SOCKET/TCP Socket/
の間違いです。スマソ
381EHエリック:02/01/31 03:14
ネットワークに関しての質問です。

子会員が孫会員を募集して、子会員から親会員に自動的にお金が上がってくる
仕組みを作っては見たのですが、いまいち組織拡大がはかどりません。
やはり、メールアドレスを一万件ほど購入した方が良いでしょうか?

ネットワークビジネスの設計についてアドバイス下さい。
>>381
メールアドレスより「万能なべ」や「美顔器」などがおすすめ
お金が上がってくるのは3世代くらいにとどめた方がよいとおもわれ
383リン:02/01/31 10:40
>>320
SO_PROTOCOL_INFOでgetsockoptしてみて。
そこから必要なメンバを書き換えればいいんじゃないかなぁ・・。
384デフォルトの名無しさん:02/02/01 17:29
基本的な質問ですいません。

ソケットで、char型に0x00を入れて送信したいのですがうまくいきません。
どうやらcharに0x00いれた時点で""と解釈され、データが入ってないものとされている
みたいです。
解決法ありましたら教えてください。おねがいします。
>>384
strlen() 使ってるなら当たり前だ。
strlen() + 1 バイト分を送信せれ。
つーか、send() 使ってるんじゃないのか?
>strlen() + 1 バイト分を送信せれ。
NULL文字の入りうるデータ列にstrlenを
適用するな、といったほうが正確かも。
#stringの最後にNULL文字をつけたいんじゃなくて、
#バイナリデータを送りたいと見たがどうか
387 :02/02/01 21:09
文字列なのか?
char型っていってるから1byteなんだろう。
strlen()よりsizeof演算子のほうが良いのでは?
・・・て言ってみたりする。
388384:02/02/04 08:37
>>385-387
ありがとうございます。sizeofでとりあえずやってみます。
389素人:02/02/04 09:45
ネットワークプログラミングってどういうことをするのか見当がつきません。
C言語の入門本が終わった段階ですが
腕を上げるにはどういう勉強をしていけばいいでしょうか?
ネットワークプログラミングについての一冊目で良い本があれば教えて下さい。
391EHエリック:02/02/04 09:59
>>389ネットワークに関しての質問です。

子会員が孫会員を募集して、子会員から親会員に自動的にお金が上がってくる
仕組みを作っては見たのですが、いまいち組織拡大がはかどりません。
やはり、メールアドレスを一万件ほど購入した方が良いでしょうか?

ネットワークビジネスの設計についてアドバイス下さい。
>>391
組織拡大とメールアドレスは関係ないと思いますです。
393素人:02/02/04 10:05
>>390
即レスありがとうございます。
UNIXの2冊から勉強いたします。
394デフォルトの名無しさん:02/02/04 11:27
質問です。
4ビットのフィールド
|ヴァージョン| ヘッダ長 |
|(4ビット)|(4ビット)|

をデータリンク層に書き込みたいとしたら
双方をまとめて8ビットにして書き込めばよろしいのでしょうか?

char temp;

int version = 4;
int headlen =16;

temp = ( (version << 4) | headlen );

のようなやりかたでいいのですか?実際は32ビット単位でやると思いますが。。。

よろしくお願いします。

>>394
構造体を使うのが良いと思います。
396デフォルトの名無しさん:02/02/04 15:55
早速のレスありがとうございます。

構造体を使うというのはビットフィールドを使えという事なのでしょうか?
そしてその構造体をデータリンク層に書き込めばいいのでしょうか?
よろしければ詳しく教えてください。お願いします。
397login:Penguin:02/02/04 17:22
>>395
構造体を使うと、アーキテクチャ依存、システム依存、コンパイラ依存、コンパイラオプション依存
になるからいかーん!

buffer[BUFFER_SIZE];

buffer[0] = (version << 4) | headlen;
buffer[1] = (foo << 4) | bar;
;

で、bufferの先頭から書き込んだバイト数「だけ」送れ。
ありがとうございました。勉強になりました。
399397:02/02/04 18:45
あ、型がない。

#include <stdint.h>

int8_t buffer[BUFFER_SIZE];

な。charにするとコンパイラ依存。
>>394
4ビットで16を送る方法を逐一時間問いつめたい。
>>400
IPのヘッダの長さは4バイト単位ってのを忘れてるんでしょう。
そんなシステムの部分は環境に依存してても全然問題ないと思うけどなぁ。
システムの部分といってもIPヘッダの送信なんて
ぜんぜん移植可能だし
構造体は移植性なさすぎだろ
エンディアンで場合分けすれば十分じゃない?
ちゃんと2の冪乗の位置にならんでるフィールドをすきまを
あけてならべるコンパイラはないと思うけど。
エンディアンを自動的に判定させることが出来ないし
素直に配列とシフト使ったほうが簡単で確実
エンディアン問題はネットワークバイトオーダーで解決しる!
>>401
ヘッダ長を4オクテット単位でカウントするって知っているのに、
ネットワークプロトコルの一部であるパケット形式の構築/分解のことを
「システムの部分」と言ってしまう君に乾杯
407しろうと:02/02/05 16:24

> rpcb_set(3NSL)はrpcbind向けの関数なんだけど、
> rpcbindは、portmapのトランスポート非依存版なんだ。(TI-RPCってやつな)
> (3rd: トランスポート指定、4th: トランスポート依存ポート指定)
>
> TCP/IPしか相手にしなくて良ければ、pmap_set(3NSL)使いなよ。
> #includeする前に、#define PORTMAP忘れないでね。

pmap_set()の前後ではsvc_run()の前に何を呼び出せばいいのでしょうか。
pmap_set()→svc_run()だとエラーになります。

rpcgenでジェネレートする際、-dは要るのでしょうか。

408ネット厨:02/02/06 22:59
すみませんが、ネットワークの偉い方教えてください。

Win2KマシンからlinuxのあるWebサーバに向かって何度かPAESLLER の
web stress toolを実行したら、テストの途中でサーバのaccept()が
EBADFエラーを拾いました。
(このweb stress toolも応答しなくなりましたので強制終了しました)
通常コネクションが切れることは理解できますので、データを送受信
する場合にコネクションが有効かどうか確認しています。

クライアントとサーバの間で対向しているソケットがコネクションの
切断により無効になるのは判りますが、サーバ側のソケットが無効に
なる理由が判りません。
サーバ側のソケットとポートに関連する情報はOS内部で確保されている
ものだと思うので、無効になるとは思いませんでした。

もしこのような現象がapacheなどでも通常発生しうることならば、
一般的にサーバというものはaccept()でEBADFを拾った場合に、socket()
bind(), listen()のレベルからやり直しするようにプログラムを構成
するものなのでしょうか?
>>408
あるWebサーバのバグじゃないの?
410ネット厨:02/02/06 23:57
main()にてグローバル変数でsocket()のサーバ側ファイルディスクリプタを
受けとりlisten()まで行ってからクライアント処理用スレッドを作成します。
スレッド側ではaccept()でグローバル変数のファイルディスクリプタを使い、
クライアントのファイルディスクリプタを受け取ります。

もし論理的なバグなら再現性があるのではないかと思うのですが、こんな
屁垂れWebサーバでも、1秒あたり20件のアクセス程度ならば何の問題もな
かったので、専門ツールによる同程度のストレス試験でも問題なかろう、と
思ってました。

accept()でEBADFを食らうような現象はこれが原因で起こるぞ、とか事例
があればお聞きしたいです。
411aiu:02/02/07 15:35
winsock2関連で素晴らしく、詳しい解説書の情報求む。
とくにAPIの仕様とか…
>>410
屁垂れWebサーバのbugなんじゃないの?
acceptの引数とかdebuggerで調べたわけ?
413デフォルトの名無しさん:02/02/07 20:19
質問です。
TCPコネクション上のCLOSE_WAITという状態がありますが
これって相手がFINを送ってきてからこちらがパッシブクローズで
ACKを返すまでの状態ですよね?
とすると、ほんの瞬間のような気がするのですが
netstat -aで調査するとCLOSE_WAIT状態のソケットが沢山あります。
CLOSE_WAITってなんですか?
414名無しさん@接続しっぱなし。:02/02/08 00:48
>>413
> TCPコネクション上のCLOSE_WAITという状態がありますが
> これって相手がFINを送ってきてからこちらがパッシブクローズで
> ACKを返すまでの状態ですよね?

# Passive Openならしってるけど、Passive Closeなんて知らん。
# 少なくともRFCには出てこない。

> とすると、ほんの瞬間のような気がするのですが
> netstat -aで調査するとCLOSE_WAIT状態のソケットが沢山あります。
> CLOSE_WAITってなんですか?

RFC793 p.21より
CLOSE-WAIT - represents waiting for a connection termination request
from the local user.
というわけでapplication(とは限らんが)がcloseするのを待っている状態。
remote→localだけ切れた状態。p.23の"State Diagram"見てね。

CLOSEってのは、localで呼び出すfunctionで、
FINはsegmentのflag、で、これ待つ状態が、FIN-WAIT-[12]。
ListBoxのチェックを、
デフォルトでチェックしている状態にするには、
どうしたらいいんでしょうか。
初歩的なことかもしれませんが、
知っている人がいたら教えてください。
417416:02/02/08 02:33
間違えた。
氏にます。
418デフォルトの名無しさん:02/02/08 10:15
Win2K上でIPv4のポート80とIPv6のポート80を相互接続してくれるアプリって
何か存在しないでしょうか? SSHとかなら有るようなのですが、生で繋ぎたい
んです。 或いは、こんなのがにてるから改造すればでも良いのですが、
やりたいのは、 WinCE <-> Win2K <-> IPv6サーバ という感じで
WinCE から IPv6サーバのページを開きたいんです。
よろしくお願いします。
419yuki:02/02/08 10:58
wsaeventsocketを使用して非同期ソケットにしたものを、同期ソケット
に戻す方法はありますか?
また、FD_CONNECTイベントを指定し、connectが”成功したのか、失敗したの
か”の判断はどのようにしたらよいのでしょうか?
よろしくお願いします。
420リン:02/02/08 11:30
>>419
>wsaeventsocket
って何?もしかしてWSAEventSelect?
421yuki:02/02/08 11:33
>>420
失礼しました。
WSAEventSelectのことです。

よろしくお願いします。
>>418
この時期だからねぇ。少なくとも俺は知らん。
アプリケーション層のプロトコルがわかってるなら、自分で作った方が早いかも。
423リン:02/02/08 11:56
>>421
↓あたりでも参考にしてください。あと、WSAEventSelectなどで一度非同期したものは同期には出来ません。

ttp://www.ops.dti.ne.jp/~allergy/socket/socket.html
ttp://www.vbvbvb.com/jp/gtips/0901/gWSAEventSelect.html
424yuki:02/02/08 12:25
>>423
ありがとうございます。
やはり無理ですか。
425デフォルトの名無しさん:02/02/08 12:45
>>422
ありがとう御座います。やっぱり作るしかないのか・・
何か有れば嬉しかったのですが、頑張ってみる事にします。
426名無しさん@接続しっぱなし。:02/02/08 21:46
>>418
そういうのは、NAT-PTって言うんだけど、WinXPじゃいかんの?
http://www.research.microsoft.com/msripv6
Win2k+VMware+PC-UNIX+NAT-PTという手もあるけど。
ちなみに使った事ないから、MSRのがいけてるかどうかは知らん。
427デフォルトの名無しさん:02/02/09 10:30
>>426
そうなんですか、NAT-PT って名前も知りませんでした。
早速検索してみます。 WinXPでも構わないのですが、出来れば慣れた2Kでと思っています。
あまり複雑な構成もしたくないし・・・  情報ありがとう御座います。
428デフォルトの名無しさん:02/02/11 11:50
icmpでメッセージが送られてきたら送られてきたホストにメッセージを返すサーバプログラムを作ってます。
しかしTCPDUMPで見張ってみると
一度目に送られてきたメッセージには返答するのですが、2回目以降には返答しません。
どのような原因が考えられますでしょうか?

sock = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);//でICMP用のソケットを作って
for(;;){
fflush(stdout);
addrlen=sizeof(addr);
if ((r=recvfrom(sock,recvbuf,sizeof(recvbuf)-1,0,(struct sockaddr *)&addr,&addrlen)) < 0)continue;
recvbuf[r] = '\0';
iphlen=(recvbuf[0] & 0x0f)*4;
icmphdr=(struct icmp *)(recvbuf+iphlen);

strcpy(buf,"returnString");
buf[12] = '\0';
//send buf
SendIcmpHdr = (struct icmp*)spacket;
strncpy(spacket + ICMPHDRLEN,buf,sizeof(spacket) - ICMPHDRLEN - 1);
sPkLen = strlen(buf) + ICMPHDRLEN;
SendIcmpHdr->type = ICMP_ECHOREPLY;
SendIcmpHdr->code = 0;
SendIcmpHdr->id = rand() & 0xffff;
SendIcmpHdr->cksum = cal_cksum((unsigned short *)SendIcmpHdr,sPkLen);

if (r = sendto(sock,spacket,sPkLen,0,(struct sockaddr *)&addr,sizeof(addr)) == -1)
{
printf("senderror");
return(1);
}
}
429デフォルトの名無しさん:02/02/11 12:57
MFCの上でWinsock 以外でhtml,ftpファイルをダウンロードしたいのですが何か方法はありますか?
Inet なんちゃらだか Http なんちゃらとか言うクラス無かったっけ?
431ビギナー:02/02/11 13:07
VCでnetstatのようなプログラムを書きたいのですが
どのような関数を使えばよいのでしょうか?
>>429
マルチですか?(Y/y)

wininet.dllってのがIEに付属してる。

にちゃんねるをSynFlood攻撃するツールを作りたいのですが、
どうやったら良いですか?

ぜんぜんわかんないので1から教えてください。
>>433
raw socketを使う。
435名無しさん@接続しっぱなし。:02/02/12 11:02
>>428
とりあえず、recvfromのエラーハンドリングをちゃんとやりなよ。
436デフォルトの名無しさん:02/02/12 12:34
>>433
2ちゃんサーバめがけてミサイルを発射しる!
437デフォルトの名無しさん:02/02/12 16:31
C用のネットワークライブラリってのはどんなのあります?
たとえばsendtoのマルチキャストが簡単にできるような.
リファレンスが詳しくできればフリー,さらにできれば日本語リファレンス付きがいいんですが.
訂正
×リファレンスが詳しくできればフリー
○リファレンスが詳しく,できればフリー
>>437

それはSocket APIとかがラップされたライブラリってことかい?
OSは?
440437:02/02/12 16:50
すんません,Cなら環境イランかなとか思ったんですがselectとかあるし必要でしたね.
UNIX系です.LinuxでもFreeBSDでもSolarisでも安全に動かせるやつ.
そうですね,多くはラッパ的なものになるかと.
441デフォルトの名無しさん:02/02/13 09:00
質問があります。

Windows2000でMSが提供しているIPv6用SDKをつかっているのですが、
getaddrinfoにAI_NUMERICHOSTを指定してaddrinfo構造体を取得しています。
そこでアドレス(第一引数 nodename)にipv6 if コマンドなどで得られる推奨アドレス(ローカルエリア接続)
を指定すると、getaddrinfoは成功するのですがbindがエラー10049で失敗します。

これにはどんな理由が考えられるでしょうか?
ご教授おねがいします。
WSAEADDRNOTAVAIL
(10049)
Cannot assign requested address.
The requested address is not valid in its context.
Normally results from an attempt to bind to an address that is not valid for the local machine.
This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote machine (e.g. address or port 0).
443441 :02/02/13 10:19
>>442
はい。10049の意味はわかってます。
書き忘れたのですが、これnodenameにインターフェイスに割り当てられた、
v4アドレスや、ipv6 ifで得られるv4互換アドレス(例:::xxx.xxx.xxx.xxx)
だと成功します。しかし、なぜか同じくipv6 ifで得られる、リンクローカルアドレス
(例:fe80::XXXX:XXXX:XXXX:XXXX)だと、10049で失敗するんです。

これは、なぜかな・・・と、いうことです。
v6はよく知りません.
構造体が違うとか.sockaddr_in6だっけか.こんなの使わないのかも?
はい,余計なお世話でしたね.
445443:02/02/13 11:58
>>444
いや、ありがとうございます。
構造体はaddrinfoのメンバのsockaddrを使ってます。これ自体はMSのサンプルコード
でも使われていて、特に問題はなさそうです。

あれから、いろいろやってみたのですが、どうやらアドレスのプレフィックス部の
先頭が"fe80"以上だとエラーがでるみたいです(fe7f以下だと成功する)。
これが意図した仕様かどうかは勉強不足でまだ良く分かりませんが、とりあえずはそういうことみたいです。
・・・。
446デフォルトの名無しさん:02/02/13 15:59
日本語訳されたRFC854(telnet)ありませんか?
>>446
いま、ちょちょっと探してみたけど、意外に無いですねぇ・・・。
メジャーすぎるってことかな?

まぁ、がんばって英語読んでください(w
448446:02/02/14 11:37
色々探してみたけどありませんでした。
449デフォルトの名無しさん:02/02/14 12:08
既にあるプログラムがwsock32.dllを呼び出すところを、奪い取って
自分で書いた処理をしたいんですけど、そういうのに使えるソースはありますか。
WinMXのchimeとかかちゅーしゃのkageみたいな感じで。
perlか、bcc compilerでいけるやつで。
そこまでわかってるなら、kageのソース嫁よ‥‥
>>449
kageはソース公開されとりますが名
それよかPerlでwinsockの呼び出しをぶん取れるのか
453デフォルトの名無しさん:02/02/15 14:27
age
perlでdllとかexeになるの?
>>454
Perl Dev KitのPerlAppでWin32の実行形式に変換できたよ。
金払えば単体で実行できた。
モジュールがdll化されてたけど、他の言語から素直に使うことできるのかな。
なんかPerlの内部の複雑なデータ構造とか要求されそう。(ようしらんけど)

http://www.activestate.com/Products/Perl_Dev_Kit/
456デフォルトの名無しさん:02/02/18 17:07
すいません、RPC詳しい方教えてください。

RPCのサーバプログラムのホストとポートがわかっている場合、
rpcbindに聞かずに、直接RPCクライアントとRPCサーバで
通信することはできますでしょうか?
よろしくお願いします。
457デフォルトの名無しさん:02/02/20 19:00
MFCで、APIをそのまま使用して非同期のソケットプログラムを作っているのですが
どうしてもWSAAsyncSelectでエラーが出てしまいます。

CWndを基底クラスとしたCSockWndクラスを作り、その中にソケット関係のプログラムを書いています。
if(WSAAsyncSelect(m_sock, m_hWnd, WM_ASYNC_SELECT,FD_CONNECT | FD_WRITE | FD_READ | FD_CLOSE) == SOCKET_ERROR) {
  AfxMessageBox("error");
  return -1;
}
として、「SockWnd.h」には、「#define WM_ASYNC_SELECT (WM_USER + 1)」
「SockWnd.cpp」のメッセージマップで、「ON_MESSAGE(WM_ASYNC_SELECT, OnSockSelect)」
を加えています。

ちなみに、sendとrecvを試してみた結果、ちゃんと通信は出来ているようです。
WSAAsyncSelectでエラーが出てしまう原因として、何が考えられますか?
458:02/02/20 19:20
>既にあるプログラムがwsock32.dllを呼び出すところを、奪い取って
>自分で書いた処理をしたいんですけど

パソコンを家庭用ルーターのNAT内で使ってるときに、
MSNメッセンジャーやNetMeetingに、ローカルアドレスではなく
ルーターの持っているグローバルアドレスを教えて勘違いさせられる、
WinMXのchimeのような仮想wsock32.dllを作ってくれ〜!
頼む!
>>457
SOCKET_ERROR が返ってきたら WSAGetLastError() 呼び出してエラーコードを得る。
これ WinSock の基本。
460457:02/02/20 20:56
>>459
エラーを取得したら、10022(無効な引数が渡された)とありました。
m_sockを使用してsend,recvが出来ることを考えると、m_hWndが違うのかな。
ちなみにm_sockの値は192でした。正常だと思います。
MFCって、m_hWndに現在のウィンドウのハンドルが代入されてるんですよね?
違うのだとしたら、どうやってハンドルを取得したら良いのでしょう。
MFCはちょっとよく分からないので、難航してます・・・。
461デフォルトの名無しさん:02/02/20 21:09
WM_USER+1 近辺ってMFCで予約されてるって聞いたことがあるが
自信はない
>>458
俺もそんなソフトを探してます。
でも見つからない。需要はありそうなのに・・・。
MicrosoftがNetMeetingのプロトコルを公開しない限り無理
464デフォルトの名無しさん:02/02/21 10:49
>>460
OnSockSelectの定義は?とか聞いてみる。
465457:02/02/21 12:01
>>461
一応、WM_USER+10とか+100とか試してみましたが、駄目でした。
安全だとされている、WM_APP+1や+100なども試してみましたが、駄目でした。

>>464
もちろんちゃんと「SockWnd.h」にメンバ関数として宣言し
「SockWnd.cpp」に実装しています。

あれからずっと色々考えてみたのですが、どうにも動きません。
非同期にしなければ通信できることから、ソケット作成には成功してるんですが。
466:02/02/21 12:18
>>463
実は、MSNメッセンジャーのプロトコルは公開されているんですよ!
あと、
IMツールからの自IPアドレスの問い合わせに、
仮想wsock32.dllが嘘の(ルーターの)グローバルアドレスを教えるだけだから、
通信のプロトコル自体は分からなくても問題無いと思うんです。
あとは家庭用ルーターの簡易DMZ設定で目的のPCへWANからの接続要求を全部送れば・・・

ルーターのグローバルアドレスは、↓こういう所をhttpで読みに行けば取得できるし。
http://www.dyndns.org/cgi-bin/check_ip.cgi
467464:02/02/21 13:25
>>457
いや、ユーザ定義ハンドラのフォーマット(?)に従っているか?という意味で
聞いたんだが。

long OnSockSelect(WPARAM wParam, LPARAM lParam) ←こんな感じ。

まぁ多分大丈夫だろうが・・・。
468457:02/02/21 13:44
>>467
void OnSockSelect(WPARAM wParam, LPARAM lParam)と定義してあります。

なんかm_hWndが怪しい気がしますけど、CWndクラスの派生クラスだから
メンバ変数m_hWndにウィンドウハンドルが入ってるはずなんですよね。
うーん、分からない・・・。
>ウィンドウハンドル
AfxGetMainWnd()->GetSafeHwnd()
とか
GetParent()->GetSafeHwnd()
じゃなくて?
470464:02/02/21 14:06
>>468
そう思うなら、
isWindow(m_hWnd);

あと
u_long hoge=1;
ioctlsocket(m_sock,FIONBIO,&hoge);
なんていう、おまじないもある。
The WSAAsyncSelect and WSAEventSelect functions automatically set a socket to nonblocking mode.
なハズなんだけどな。
つーか、まずはエラーコード調べるのが先だろ。
過去ログを読むのが先という話も。
>>466
Netmeetingを通せるルーターもあるから、わかってるんじゃないの?
Netmeetingだまそうとおもって、
ダイヤルアップアダプタとLANカードの2つめのIPアドレスをグローバルアドレスにしたけど
だめだった。ちゃんとつながってるところを選択してくれた。
頭来るなあ。
474デフォルトの名無しさん:02/02/22 05:53
Webメールクライアントを作っています。
しかしメールのヘッダと言うものがあまり統一がとられていないようで
難航しています。
特に添付ファイルなどがあったりすると、
Content-Type: multipart/mixed; boundary="TW9uLCAxOCBGZWIgMjAwMiAxNzozMDowMiArMDkwMA=="
こんな感じのヘッダが来るのですが、
これがメールソフトによっては勝手に

Content-Type: multipart/mixed;
boundary="TW9uLCAxOCBGZWIgMjAwMiAxNzozMDowMiArMDkwMA=="
こんな感じに
改行されてしまったりしているのです。

なにかわかりやすいヘッダ資料は無いものでしょうか?
VBのラーニングエディションで、
指定したURLのhtmlファイルを出力するにはどうしたらいいんでしょうか?

VBは6.0でWinXP使ってます。
>>474
別に勝手じゃない。RFC2822でも見ろ。
477愚者:02/02/23 11:49
TCP/IP について質問なんですが…
サーバ書いてて思ったんですが、サーバが listen() しちゃうと
クライアント側の connect() 成功しちゃいますよね。
特定の IP アドレス (事前に複数設定できる) からの接続しか
受け付けないようにするには、どうすればいいんでしょうか?
>>477
FW系のソフトを入れる、つまりドライバとの間に入って干渉するしかない。
でも接続後にIP確認して切れば良いだけでは?
それだと何か問題があるの?
479愚者:02/02/23 12:10
>>478
ありがとうございます。
やっぱそうなりますか…
> でも接続後にIP確認して切れば良いだけでは?
いえ、connect() 成功して次の send() でエラーになるのが
なんとなくキモチワルイってだけなんです。
素直にサーバから切断する事にします。
480aivo:02/02/25 21:38
現在HTTP通信で各クライアントの持っている情報を同期させるアプリケーションを作っています。
クライアントがサーバにリクエストを送ってから、
サーバがすぐにレスポンスを返さないようにして、
サーバ上のデータが更新した時にレスポンスを返すようにしています。
クライアントが新しくデータをアップロードするときは、
そのコネクションをキャンセルしてからアップロードするようにしています。

このようにサーバからのレスポンスを遅延させることによる
弊害があるのなら教えてほしいです。おねがいします。
間にプロキシが入ってると切断されたりレスポンスがすぐに到着しなかったり。
インターネットなら自分でプロトコル作れ。LAN なら IP ブロードキャスト使え。
482aivo:02/02/25 22:24
実はiアプリだからHTTPしかつかえないの
483名無しと呼ばないで:02/02/25 22:51
>>479
> なんとなくキモチワルイってだけなんです。

そんないい加減な理由で設計するのは止めなよ...
484名無しと呼ばないで:02/02/25 22:54
>>481
> 間にプロキシが入ってると

こういう制約があるなら、

> インターネットなら自分でプロトコル作れ。

というわけにはいかないと思われ
>>484
あそっか、失礼しますた
486aivo:02/02/25 23:47
>>481
1度レスポンスを返してもう一度サーバ上のデータの更新を待つための
リクエストを送って、それに対するレスポンスを遅延させるようにしています。
だからレスポンスの遅延は問題にならないんです。
ちがう意味ならすいません。

HTTPで同期型のアプリケーション作る場合はこの方法が一番なんでしょうかね。
なんか問題がありそうで気になるもので。
>>486
iアプリだっつー事を強調して聞いたほうが良いとおもわれ
iアプリって Gateway 使わないで直にサーバと HTTP (TCP/IP) 話すん
だっけ? 無応答状態だと中継点でタイムアウト切断されそうな気がする。
H" のコンテンツサービスだと 1 分で切れちゃう。
488名無しのななさん:02/02/26 06:07
age
489名無しと呼ばないで:02/02/26 08:52
>>487
> iアプリだっつー事を強調して聞いたほうが良いとおもわれ
> iアプリって Gateway 使わないで直にサーバと HTTP (TCP/IP) 話すん
> だっけ?

必ずgatewayを介します。
世代によって、over UDP(旧)だったり、over TCP(新)だったりしますが、
アプリ開発者から見ると、信頼ある通信が保証されてます。
ただし、パケットサイズに上限があります。

サーバ側から切断されても、
クライアントが再接続するようにしておけばいいのでは。
エラー処理を省略するとろくな事がないと思われ
490デフォルトの名無しさん:02/02/26 18:08
メーラー作ってるんですけど、POP3サーバにユーザIDとパスワードを送っても
「xxx message」みたいなメッセージが来ないのですが、これは必ず来るものではないのでしょうか?
ストリームのフラッシュしてる?
492デフォルトの名無しさん:02/02/26 19:22
スレ違いかもしれませんが、
WindowsNTでSACK Optionの導入の仕方を
知ってる人いますか?
494デフォルトの名無しさん:02/03/01 03:07
ここで聞けばわかると他板から言われて来たものです。どうぞ御教授下さい。

LAN上のTCPDUMPツールを現在作成しています。(Winsock2)

で、例えば
45 00 00 28 64 f8 40 00 3d 06 a5 04 d3 13 a0 10 E..(d.@.=.......
c0 a8 00 07 00 6e 11 09 d6

のようにデータを取得したとします。上記を解析
(「プログラム」とか「プログラマ」とか)したい
のですが、どのようにすればよいのでしょうか?

ただ単純に解析したいだけなのですが・・・恥ずかしい事に漏れにはわかりませ
んでした・・・

ご指導賜れれば幸いです。

C++Builder5.0 Win2000です。
495デフォルトの名無しさん:02/03/01 03:16
>>494
sprintf(buf,"%c%c%c%c",readbuf)
でいかが?
496名無しと呼ばないで:02/03/01 03:29
>>494
> のようにデータを取得したとします。上記を解析
> (「プログラム」とか「プログラマ」とか)したい

という文章の意味がよく分かりませんが、
たぶnC++Builder5.0 Win2000でそのようなプログラムを書くんですよね。

tcpdump@UNIXはlibpcapと呼ばれるlibraryを利用して、
PacketのCAPtureを行っています。windumpではwinpcapが使われています。
データをdumpしたければこのlibraryを使えばいいです。以下にsampleもあります。

http://netgroup-serv.polito.it/winpcap/docs/default.htm
http://netgroup-serv.polito.it/winpcap/
http://netgroup-serv.polito.it/windump/

TCPDUMP with Winsock2の方はよく知りません。
497デフォルトの名無しさん:02/03/01 03:55
>>495
どうも違うようです・・・すいません。漏れが情報をうまくお伝えできな
かったようです。すいません。すいません。すいません。

>>496
Windowsソフトのsniff VIGILのようなやり方と言うことですね。
出来れば単体で動作させたかったのですが、確かに検索してもwinpcapを
皆様推奨されてらっしゃるようですね。

ただ単純に>>494のようなデータを取得できるのでそれを解析すればよい
のではないかと考えていたのですが・・・

実際に取得したいのはSMTPとPOP3の
ヘッダー、件名、Subject、Body等メールにまつわるものだけなのですが
・・・難しいのでしょうか・・・・

Source AddressやDestination Addressさらに
Source PortとDestination Portは取得しているのですが・・・

今回は関係ないですよね。すいません。
498デフォルトの名無しさん:02/03/01 04:01
SMTPのプロトコルはご存知ですか?
(おれ知らん)
ヘッダー改行、
件名改行
みたいなんじゃありませんでした?
だからアルファベットになおしゃなんとなくわかるかなーと思いました。
499デフォルトの名無しさん:02/03/01 04:05
>>498
それです!!
つまりアルファベットに直せばこちらでなんとでもしますので大丈夫
なのれす。
110番と25番のPortの情報はわかりますので!!
ただ最悪に恥ずかしい事に「あるふぁべっと」に直せない。

あああああああああ自己嫌悪・・・なぜなぜなぜなぜなぜなぜ・・・

納期近いのに・・・社長の馬鹿・・・
500498:02/03/01 04:52
だから
sprintf(buf,"%c%c%c%c",readbuf[0], readbuf[1], ...);
で駄目なの?
501498:02/03/01 05:07
お気に召さん?じゃこれは?
int len = read(f,buf,sizeof(buf));
buf[len]=0;
printf("%s", buf);
もしかしてサブジェクトがMIMEエンコードされてて見えない
ってコトじゃない
503デフォルトの名無しさん:02/03/01 10:30
すいません。机で仮眠してしまいました・・・
ごめんなさい。すぐ試します。
504デフォルトの名無しさん:02/03/01 10:51
問題となってる個所を記載するのを忘れていました。すいません。(1)

unsigned long __stdcall CaptureThread(void *ArgList)
{
unsigned char buf[MAX_IP_SIZE];
WSABUF wsb;
unsigned long len;
DWORD Flags;

while(1){
Sleep(1);
Application->ProcessMessages();


wsb.buf=buf;
wsb.len=MAX_IP_SIZE;
memset(wsb.buf,0x0,MAX_IP_SIZE);
Flags=0;

if(SOCKET_ERROR==WSARecv(Form1->sock,&wsb,1,&len,&Flags,NULL,NULL)){
wsprintf(buf,"%d",WSAGetLastError(),Form1->sock);
Form1->Memo1->Lines->Add((char *)buf);
continue;
}

Form1->dPrint(buf,len);
}

Form1->hhThread=NULL;
return 0;
}
505デフォルトの名無しさん:02/03/01 10:51
その2

void __fastcall TForm1::dPrint(unsigned char *buf,int len)
{
char Buf[10],TmpBuf[1024];
char *p;
int d;
unsigned int i,y;
SYSTEMTIME t;

GetLocalTime(&t);

Memo1->Lines->Add("-----------------------------------------------------------");

wsprintf(TmpBuf,"%02d/%02d/%02d %02d:%02d:%02d Protocol: %s ",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond,Protocol[buf[9]]);
Memo1->Lines->Add(TmpBuf);

wsprintf(TmpBuf,"Source Address: %d.%d.%d.%d ",buf[12],buf[13],buf[14],buf[15]);
Memo1->Lines->Add(TmpBuf);
wsprintf(TmpBuf,"Destination Address: %d.%d.%d.%d",buf[16],buf[17],buf[18],buf[19]);
Memo1->Lines->Add(TmpBuf);

wsprintf(TmpBuf,"Source Port: %d Destination Port: %d",buf[20]*256+buf[21],buf[22]*256+buf[23]);
Memo1->Lines->Add(TmpBuf);

for(int i = 0;i < 3;i++)
{

p = buf + i*16;
d = len - i*16;
if (d > 16) {d = 16;}
if (d <= 0) {break;}

wsprintf(TmpBuf, "%08lx : ", i );

for (int j = 0; j < d; j++ )
{
wsprintf(Buf, "%02x ", *(BYTE *)p++ );
strcat(TmpBuf,Buf);
}
for (int j = d; j < 16; j++ )
{
strcat(TmpBuf," ");
}

p = buf + i*16;
for (int j = 0; j < d; j++, p++ )
{
wsprintf(Buf, "%c", isprint( *p ) ? *p : '.' );
strcat(TmpBuf,Buf);
}

Form1->Memo1->Lines->Add(TmpBuf);
if (d != 16) {break;}
}
}
506デフォルトの名無しさん:02/03/01 11:00
その2の

p = buf + i*16;
for (int j = 0; j < d; j++, p++ )
{
wsprintf(Buf, "%c", isprint( *p ) ? *p : '.' );
strcat(TmpBuf,Buf);
}

で下記のような数値を形成しています。

45 00 00 28 64 f8 40 00 3d 06 a5 04 d3 13 a0 10 E..(d.@.=.......
c0 a8 00 07 00 6e 11 09 d6

以上です。
>>504-506
オプションつきのパケットではオフセットがずれるんじゃないかな…
buf + 40 (+ IPオプション長 + TCPオプション長)からlenまでを単純に出力するだけで
よいのではないかと。

って思ったけど、ISO-2022-JP→CP932(or Unicode)変換が必要ですな。
あと、日本語文字のSubjectを表示したいなら>>502の言うとおりMIME "B" Encoding
を解いてあげる必要も。
508名無しと呼ばないで:02/03/01 11:37
>>506
> その2の
>
> p = buf + i*16;
> for (int j = 0; j < d; j++, p++ )
> {
> wsprintf(Buf, "%c", isprint( *p ) ? *p : '.' );
> strcat(TmpBuf,Buf);
> }
>
> で下記のような数値を形成しています。

このプログラムでは、

> 45 00 00 28 64 f8 40 00 3d 06 a5 04 d3 13 a0 10 E..(d.@.=.......
> c0 a8 00 07 00 6e 11 09 d6

こうはならないでしょ。
509名無しと呼ばないで:02/03/01 11:44
>>506
つづき

p = IP, TCPのヘッダは読み飛ばして;
for (int j = 0; j < d; j++, p++ ) // TCPセグメントのデータ部だけで、
{
 sprintf(Buf, "%c", *p);
 strcat(TmpBuf,Buf);
}
じゃないの?


for文は、
int size = d - p;
int j = strlen(TmpBuf);
if (j + size < sizeof(TmpBuf)) {
 bzopy(p, &TmpBuf[j], size);
} else {
 エラー処理;
}
でいい。

MIME headerのdecodeは別途やること。
510デフォルトの名無しさん:02/03/01 13:17
>>507-509
うう〜〜〜〜。ありがとうございます。このような漏れに多大な助言を
頂いた事にまず感謝いたします。時間を割いて頂いた事にも感謝致しま
す。

MIMEdecordに関しては別に作成していますので、問題はありません。

>>507-509で作成頂いた方法をまずは試して見ます。

頭悪いから時間がかかるのでしょうね・・・・
511507:02/03/01 13:49
>>510
IPパケットとTCPパケットのヘッダ長は、それぞれ

int ipheaderlen = (buf[0] & 0x0f) << 2;
int tcpheaderlen = (buf[ipheaderlen + 12] >> 2) & 0x3c;

とかで。あとは、

p = buf + ipheaderlen + tcpheaderlen;
d = len - ipheaderlen - tcpheaderlen;

とすれば>>509前半のコードが使える…んじゃないかなあ。
512デフォルトの名無しさん:02/03/02 00:48
MFCのワーカスレッドの中でCAsyncSocketを使用した場合、OnReceiveや
OnSendのようなメッセージの処理はどのようにしたらいいのでしょうか?
ワーカスレッドでもメッセージを受け取ることは可能なのでしょうか?
それともGUIスレッドとかっていうので行うのでしょうか?

MFCのソースよめ
なぜワーカスレッドでCAsyncSocketを使うのかが
激しく謎だが、そのスレッドでメッセージループを
廻せば〜
515デフォルトの名無しさん:02/03/02 01:17
>>513
CAsyncSocketのソース?
>>514
一般的にはどのように書くのでしょうか?
WinMXのように一度に複数のファイルをダウンロードする処理はスレッドで
行うのではないでしょうか?
そもそも、ソケット関係でMFC使うな。
ふつうは、Thread + Blocking Socket又は、
MainThreadでAsyncSocketをつかって多重化するか。
518デフォルトの名無しさん:02/03/02 01:29
>>516
普通はAPI直が一般的なのですか!?
>>517
例えばCSocketの場合、ブロッキングしてしまって延々と処理が戻ってこない
ような場合は、どうやってそのスレッドを終了させればいいのでしょうか?
監視用のスレッドも一緒に作成してIsBlocking等を使うの?

何分ソケットを初めて使うのでよくわからんのです。
とんちんかんな事を言っているようならスンマソです。
CancelBlockingCallとか。
selectでごにょごにょするとか。
520デフォルトの名無しさん:02/03/02 01:35
>>519
とんちんかんな質問の連続ですいません。
あとちょっとだけヒントをいただきたいのですが、CancelBlockingCall等を使用
するとしても、ブロッキングされてしまっているスレッドでは使用する術がないで
すよね。そうすると、やはり通信しているスレッドを監視するスレッドみたいなも
のを一緒に作成して、そちらのスレッドから、キャンセルさせるのでしょうか?
メインスレッドがあるだろうが。
thread<->sokcetマップくらい考えろよな‥‥
意味が分からん。非同期にもかかわらずブロックされるというのか?
それとも、同期ソケットを、専用に作成したスレッドで処理して
そのスレッドが固まると言う意味か?
>>521
でも、メインスレッドから監視するっていうことはメインスレッドでは、定期的
にSocketのスレッドがどうなっているか監視する処理を延々実行するということ
なると思うのですが。そうするとメインのGUI関係のメッセージをどう裁けばよい
やら。それとも、スレッド作成と同時にタイマをセットして一定時間後に正常に完
了しているかチェックするとかでしょうか。
>>522
>それとも、同期ソケットを、専用に作成したスレッドで処理して
>そのスレッドが固まると言う意味か?
という後者の意味です。
>523
まったくわかってねーな。
CancelBlockingCallを発行するのは、通信を終了させて、
そのスレッドを終了させるときだろうが。
BlockingSocketを使ってるThreadでは、読み込み処理に
専念させとけよ。
>>524
でもあんた、話が矛盾してないか?
CAsyncSocketについて聞いてたんと違うのか?
それは非同期だが。
とりあえず、キリ番の512は、
http://tangentsoft.net/wskfaq/
あたりを100遍よんどけってこった。
>526
>>518>>517へのレスをみれ。
>>525
読み込み処理でもブロッキングしてしまうことはあると思いますが、
その場合、そのスレッドは終了しないのではないでしょうか?

>CancelBlockingCallを発行するのは、通信を終了させて、
>そのスレッドを終了させるときだろうが。
通信が終了させられるということはブロッキングはしていないことになるの
ではないでしょうか?それとも、これは非同期の話?

>>526
いえ、>>517
>ふつうは、Thread + Blocking Socket又は、
という話を引っ張っているのです。分かりづらくてスンマソ。
だから〜、
recvがBlockingしているところのWorker Threadがあるとするだろ。
で、そのThreadを強制終了させたい、と。
そこで、Main Threadから、そのThreadの使っているSocketに
対してCancelBlockingCallを呼び出す。これで、そのThreadの
recvがWSAEINTRで帰ってくるだろうが。あとは変数とかを見て、
終了処理に突っ込むわけ。これでわかったか?
>>529
いえ、それはもちろん分かっているのですが、そのタイミングなんですよ。
例えば、10秒以上ブロッキングしていたら終了させるとかっていうことを
やりたいとしたら、それはメインのスレッドでワーカースレッドと同時に
タイマーを起動して10秒後にチェックするとか、監視用のスレッドを起動して
逐次状況を監視するとか、そういう処理が必要になるのでしょうか?ということです。
ブラウザの停止ボタンのような処理であれば簡単でいいのですが、一定時間して
ずっとブロッキングしっぱなしだった場合に自動的にタイムアウトさせるには、
どういう方法が一般的かということです。
このスレの127からの議論をどうぞ。
>>530
ちみは、日本語能力が低すぎる。
自分で何がしたいのかだけを簡潔に説明してくれ。

まあ>>530で分かったが、要するに、別スレッドで動いてる同期スレッドの処理が
ブロックされた時のタイムアウトの方法を教えてくれと。

そういうことか?
533532:02/03/02 02:20
間違った。
同期スレッド > 同期ソケットな。
>>532
そういうことです。
説明下手でスンマソ。
535NR:02/03/02 10:00

perlスクリプトを使って
簡易サーバーとしているPCからルーターのグローバルIPアドレスを取得する
良い方法、ありませんでしょうか。
ローカルアドレスは
192.168.0.1 ルーター
192.168.0.2 サーバー(ルーターのnatを使ってwww/ftp/dns/smtp/popとしています)

環境変数をファイルに書き出すcgiをIP_check.cgiという名前で作成して
socketを使って自分自身のwww.hoge.com/IP_check.cgiへアクセスしてみたのですが
cgiプログラムが実行されずに、プログラム内容が書き出されてしまいます。

socketについて理解出来ていないのが原因だとは思うのですが...
どなたが何か良いアドバイスをお願いします。
536デフォルトの名無しさん:02/03/02 10:53
最近ネットワークプログラム始めた者なんですけど、みなさんデバッグとかテストプレイどうやってます?
個人なのでLAN環境も無く一台のパソコンに複数ソフト起動させてテストしてるんですけど、実際インターネットで動かさなきゃ分からない所も沢山あると思うので。
何かいい環境やテクニックは無いものでしょうか?
>>534
で、>>531のアドバイスに従ってみたの?
538名無しと呼ばないで:02/03/02 12:08
>>535
> socketを使って自分自身のwww.hoge.com/IP_check.cgiへアクセスしてみたのですが
> cgiプログラムが実行されずに、プログラム内容が書き出されてしまいます。
>
> socketについて理解出来ていないのが原因だとは思うのですが...

違うよ。web serverのmanual読みなよ。
ApacheならOptions ExecCgi関係だ。続きはWeb版でね。
539名無しと呼ばないで:02/03/02 12:16
>>536
> 実際インターネットで動かさなきゃ分からない所も沢山あると思うので。

一般的には何の支障もないが、支障があるときは、
VMware使うとか、FreeBSDの仮想ホストのような機能を持っているOS使うとか。
場合によっては、仮想インターフェースで間に合うだろうし。
>>535
cgiプログラムが実行されないのは、socketやperlが問題じゃなくて、Webサーバーの設定に問題があるんだと思う。
あと、192.168.0.2のマシンでIPチェック用CGIを使ってもローカルアドレスしかとれないから、外でやるように。
すでにあるIPチェック用CGIが利用できればいいが、アドレスを忘れたから探して。
ルーターにアクセスして、グローバルIPアドレスを抜き出すという方法もあるかと。
とりあえずDynamicDNS使ってみては。
541535:02/03/02 12:43
情報ありがとうございます。
ExecCgiについて今調べています。
542534:02/03/02 15:00
>>537
アドバイスの先をみて、setsockoptを使用してタイムアウト値を設定してみましたが、
ブロッキングしっぱなしです。CSocketとの併用はまずいのでしょうか。
やはりAPI直で全部書くべきでしょうか。下記のようなプログラムで実験してみたのですが、
sock.Receive(buff, 1000);のところでブロッキングして処理が戻ってこないようです。

int timeout = 5;
CSocket sock;
BYTE buff[1000];

sock.Create();
if(sock.Connect("localhost", 8088)) {
setsockopt(sock.m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout,sizeof(timeout));
sock.Receive(buff, 1000);
sock.Close();
}
543534:02/03/02 22:32
結局APIを直で使うしかないのでしょうか。できればMFCでやりたいのですが、情報への
ポインタでもいいので教えてください。
544デフォルトの名無しさん:02/03/03 01:18
SO_RCVTIMEOってオプションつかったことないけど
Receive time-out (available in Microsoft implementation of Windows Sockets 2)
って書いてるね。
MFCのCSocketはクソやから使うな、という話も、
このスレにあったとおもうが。
546デフォルトの名無しさん:02/03/03 02:54
CSocketはWinSock1.1しかサポートしてないよ。たしか。
だから>>544の言うようにCScoketではSO_RCVTIMEOは使えない。

// 読めるときに読める分だけ読んでればタイムアウトなんて気にする
// 必要ないと思うんだがなあ。
547534:02/03/03 03:13
>>544-546
そうだったのですか。CSocketを使うのは諦めたいと思います。APIレベルでの
Socketを勉強しようと思います。助言していただいた方々ありがとうございました。
548デフォルトの名無しさん:02/03/03 22:54
ソケットのMFCコードはゴミだな
549534:02/03/04 00:19
ということでソフトバンクから出ている”WinSock2.0プログラミング”という本を
注文してしまったのですが評判はどうでしょうか?もっといい本あります?
550デフォルトの名無しさん:02/03/04 00:32
>>549
Winsock だったら、それで十分だよ。
あと『Unix ネットワークプログラミング 第2版』があれば最強。
551デフォルトの名無しさん:02/03/10 23:04
非同期+InternetOpenUrlでコールバック関数にINTERNET_STATUS_REQUEST_COMPLETE
が来た時点で、HTMLは全てダウンロードされたってことですか?

MicrosoftのASyncのサンプルで、INTERNET_STATUS_REQUEST_COMPLETE
が来たたんびに一々InternetReadFileのためにスレッド立ててるみたいなんで
混乱してます。
AsyncDemo動かなくてめげた記憶がある
553初心者:02/03/11 16:54
Winsockのrecv関数はsend関数で1000バイト送ると
必ず一回で受け取れますか?
細い線を通ると100バイト単位で細切れになったりしますか?
>細い線を通ると100バイト単位で細切れになったりしますか?
します。
555初心者:02/03/11 17:23
>>554
実際にそうゆうふうになる実験がしてみたいのですが
どうやったらできますでしょうか?
556初心者:02/03/11 17:26
>>554
というのも、先輩が4kまでは一回で受信できるといっているのですが
今までそのようなことは聞いたことがなかったので実験して確認したいです。
mtuを576byteまで下げて、LANを介して送受信を
行ってみてください。localhostではどうやっても無理でしょう。
LANの代わりに、インターネットを使用するのもいいでしょう。
558初心者:02/03/11 17:34
>>557
ありがとうございます。
さらに申し訳ないですがmtuというのはどこで変更できますか?
ネットワークのプロパティを探したのですが見つかりませんでした。

例えばLANの場合、ネットワークが混むと細切れになるようなことはありますか?
mtuという設定を変えなければ細切れになることはないのでしょうか?
559初心者:02/03/11 17:45
>>557
MTUの変更方法分かりました。レジストリを編集するのですね。
>例えばLANの場合、ネットワークが混むと細切れになるようなことはありますか?
俺はきみんとこが使ってるtcp/ipスタックのソースを読んだことは
ないし、LANアダプタのドライバを読んだこともないんだが、
細切れにならない、という保証がないなら、細切れになる想定を
しとかないといけないのじゃないか?
それがそんなに困難なこととは思えないが。
561初心者:02/03/11 18:00
>>560
受信する電文に通常なら頭のほうにレングスがあると思うのですが
それが無いんです。可変長なのに。
こんなのを確実に受信する方法ってないでしょうか?
562名無しと呼ばないで:02/03/11 19:00
>>556
> というのも、先輩が4kまでは一回で受信できるといっているのですが

つーか、普通のEthernetならMTUは1500だよ。
お前の先輩はアフォ。推薦図書スレで紹介されてる本読め。

>>558
> 例えばLANの場合、ネットワークが混むと細切れになるようなことはありますか?
> mtuという設定を変えなければ細切れになることはないのでしょうか?

TCPならそれなりのサイズへの分解、合成はprotocol stackが自分でやる。
UDPでもIP packet fragmentationというのがあって、
分解、合成が途中のgatewayからpeerの間で自動的に起きる。
ただ、一つでもなくなると全部再送で効率から、
UDPなprotocolで大きなpacketを投げるように設計されているのはない。

IPv6なら途中経路の最小MTUに合わせて転送する。

とにかく本を読んで、先輩のようなアフォにはなるな。
563名無しと呼ばないで:02/03/11 19:05
>>561
TCPとUDPでは話が全く違う。

TCPでは、pakcet境界を識別する方法はない。

UDPでは順序も保証されないから、自動分割なんてあり得ない。
つまり、必ず送ったサイズのpacketを受け取ることが出来る。
ただし、これはprotocol上の話。
APIがどうなっているかはsystem依存。
俺はUDPでsendしたpacketが分割される実装は知らん。ないと思う。
564名無しと呼ばないで:02/03/11 19:06
>>562
> ただ、一つでもなくなると全部再送で効率から、

効率悪くなるから、
565初心者:02/03/11 19:27
>>562
なるほどー
勉強になります。
先輩にうまく間違いを指摘する方法を考えなくては。
566初心者:02/03/11 19:28
>>563
ちなみにTCPです。
567名無しと呼ばないで:02/03/11 19:36
>>566
TCPならpacket境界について何の保証もない。

>>561
> 受信する電文に通常なら頭のほうにレングスがあると思うのですが
> それが無いんです。可変長なのに。

完全な設計ミス。
昔こういう設計の実装をやらされたことがあったが、
幸いデータはplain ASCII textだったので、packetを'\0'終端して切り抜けた。
568初心者:02/03/11 22:22
>>567
完全な設計ミスとなるためには、まず、4kを一回で受信できるという
誤解を解かないことにはどうにもなりませんね。がんばりますです。
569名無しさん@お腹いっぱい。:02/03/11 23:37
> 4kを一回で受信できるという誤解

という書き方は少し不安になるが、
どんなサイズであっても、一回で受信できると限らないのがTCP。
一つのsendが複数のTCP segmentになることもあるし、
一つのTCP segmentが複数のrecv/readで読まれることもある。

それがTCPのサービスの境界のないbyte streamということの意味。

MTUが4kより小さいから、だけが理由じゃない。
MTUがいくつだろうともそもそも無理。
570初心者:02/03/12 13:55
>>569
MTUは関係ないんですか?
混乱してきました。MTUというのはISOの層でいうとどこになるのでしょう?
イーサネットということはデータリンク層でしょうか?
TCPはトランスポート層だったような?
ということは、分割される基準にMTUは関係ないということでしょうか?
mtuは「どーがんばっても、このネットワークでは、
これ以上の大きさのパケットは飛ばせませんよ」
ということを示しているのであり、そういう意味では
関係ある(制限要素のひとつ)が、それだけがすべて
ではない、ちゅうことさね。
572初心者:02/03/12 14:17
>>571
なるほど。
ちょっと実験してみました。
OSはNT<>XPです。MTUは変更していません。100BASE-Tです。
8192バイトのデータを一回でsendした場合、受信側は
3668バイトで受け取ったり8192バイトで受け取ったり
変化がありました。
で、今度は20000バイト一度に送信してみました。
すると、常に3668バイトになりました。
とりあえず、4096byteを一回で受信できるというのは確実に間違いなようです。
しかし、この場合MTUはいくつになっているのかなーと不思議に思います。
573初心者:02/03/12 14:18
と思いましたが4380バイトが発生しました。
ほんとにいろいろ変化しそうですね。
574初心者:02/03/12 14:23
>>562さんがいわれているようにTCPは、分割されたパケットも
recv()時にはくっつけて受信してくれるのかなー
イーサ上はMTU以下のパケットサイズでもTCPのrecv時には
できるだけ送信時のパケットサイズに戻してくれると。
そう考えていいでしょうか?
>>574
送信時のサイズは関係ないよ。
recvしたときに既に届いてるデータのうち、
recvに渡したバッファのサイズにはいるだけ受信できる。
200byteずつ100回sendしてみ。大抵、最初だけちぎれて後はまとめられちゃう。
だからといって、まとめられることを仮定してはいけない。
>>574
よくないと言ってるだろ。何度言ったら分かるんだ?
分からないならとっとと氏ねよ。
>>576
> 200byteずつ100回sendしてみ。大抵、最初だけちぎれて後はまとめられちゃう。
TCP_NODELAYを設定すれば事情は変わるかも…というチャチャはおいといて、

>> 574
TCP自身の設計もそうだけど、ソケットライブラリを使うときは特に
「パケットを送信するタイミング/サイズを指定することはできないし、
受信するタイミング/サイズが送信されたパケットと一致する保証は一切ない」
点に注意する必要があります。というのも、それを隠蔽するのがライブラリだから。

そういえば、"Programming Unix Sockets in C"ってがいしゅつでしたっけ。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
579名無しと呼ばないで:02/03/13 11:10
>>578
> TCP自身の設計もそうだけど、ソケットライブラリを使うときは特に
> 「パケットを送信するタイミング/サイズを指定することはできないし、
> 受信するタイミング/サイズが送信されたパケットと一致する保証は一切ない」
> 点に注意する必要があります。

UDPのことを考えると「サイズ」については書きすぎだろ。
一行目を「ソケットライブラリでTCPを」とするなら正しいけど。

とにかくTCPのサービスはbyte stream。境界はなし。> 初心者
EOFまで(遅延あれども)とぎれなく「byteが」流れてくる。


> というのも、それを隠蔽するのがライブラリだから。

第一因としてはTCPの仕様による。
APIの設計を拘束し他の仕様を絶対に許さないから。
# 上の階層にSOCK_SEQPACKETサービスを構築すれば別。

ただ、第二因としてC標準libraryやPOSIXのI/O APIが
そのように抽象化されて設計されているということがある。


>>570
> 混乱してきました。MTUというのはISOの層でいうとどこになるのでしょう?
> イーサネットということはデータリンク層でしょうか?

そうだよ。

> TCPはトランスポート層だったような?

そう。

> ということは、分割される基準にMTUは関係ないということでしょうか?

分割といっているが、TCPサービスには分割なんて概念はない。
packet通信型のIP networkで動かす実装の都合上として、
segmentと呼ばれるpacketを使うが、TCPサービス利用者には関係ない話。

お前はサービス(仕様)と実装を分けて考えられないのか?

関係あるかないかということについて答えれば、
TCPは再送を担当するんだから、
MTUについて知っていた方が都合いいことあるだろ。
だから利用する実装もあると思う。

しかし、それは実装によって違うから、
それに依存したプログラム書く奴は馬鹿だろ。馬鹿だろ。
580名無しと呼ばないで:02/03/13 11:14
>>572
> しかし、この場合MTUはいくつになっているのかなーと不思議に思います。

受け側のTCP protocol stackがassembleしてるんだよ。

OSI参照モデルって階層の名前だけしか知らないのか?
entity間のdata受け渡しとか本読めや。TCP/IPとの関係についても解説あるよ。
581初心者:02/03/13 11:40
みなさんどうもすみません。私がアホなばっかりに。
結論として、1回のrecvでは何バイト受信されるかは
まったくわからないということですね。
582名無しと呼ばないで:02/03/13 12:47
そう!もうこれで君はアホでなくなった!
583ちえおくれ:02/03/13 13:24
WinsockでUDPを使用し8192バイト送信しました
受ける側はノンブロッキングで4バイト読み出したところエラーになりました
(WSAGetLastErroで10040が帰ってきた)エラーを調べたところ、
受信バッファが足りないとか言うことになったんですが、
ノンブロッキングで8192バイト受信するとうまくいきます
TCPと違って受信したパケットを全て読み出さなければならないのでしょうか?
584578:02/03/13 13:49
>>579
> UDPのことを考えると「サイズ」については書きすぎだろ。
ストリーム型しか念頭にありませんでした。失礼しました。

>>583
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/wsapiref_88oi.asp
> If the datagram or message is larger than the buffer specified, the buffer is
> filled with the first part of the datagram, and recvfrom generates the error
> WSAEMSGSIZE.

データグラム型ソケットでは当然かと。
後続パートが必要ないなら、WSAEMSGSIZEを無視するだけですが。
585ちえおくれ:02/03/13 14:04
>>584
レスありがとうございます
データグラム型ソケットでは当然なんですか、
初UDPなんで良くわかりませんでした
って言うことは、UDPを使う場合にはデータの塊が1パケット内に収まるよう
設計するべきなんでしょうか?
UNIX Socket FAQのUDPのところを読め。
587ちえおくれ:02/03/13 15:13
>>586
それどこで読めるんでしょうか?
http://www.google.com/search?q=UNIX+Socket+FAQ
その名に違わぬバカっぷりを堪能させて頂きました。
これは、ほんの些細なお礼です(ワラ
589チェン:02/03/13 15:23
はじめまして。プログラムをやってみたいのですが、CやらJAVAだとか
いろいろあって何から手をつければ良いかチンプンカンプンです。
こんな初心者の質問ですが、ご返事宜しくお願いします。
ちょっと大雑把な質問で申し訳ないのですが、
データを転送するとき転送速度を任意の速度に制限したいと思っていまs。
どうゆう手法が考えられるでしょうか。
受信に使ってるスレッドを任意の時間止めればいいのかと
思ってるんですけど、その止める時間をどうしたらいいのかわからないし。。
よろしくお願いします。
int begin = gettime...//受信開始時刻
...
length += recv...//lengthは総取得長
int end = gettime...;int t = end - begin;
int speed = length/t;
だよな。で、眠っていたい時間をXとすると、
wantspeed = length/(t+X)なわけで、
X = (length/wantspeed) - t;
で、このXだけ、寝てればいいわけだな。
つか、中学生レヴェルの話かと。
>>591 時間取得すること、全く思いつかなかった。
厨な質問にお答え頂き感激です。ありがとうございました。
593名無しに生まれて:02/03/13 20:02
>>592
止めたり受けたりを極端にやると、
TCPの軋轢制御の挙動に影響が出てなかなか思うような速度に出来ない事がある。
その場合は、徐々に止めていくことも考える必要がある。
QoS制御を自前でやるのは面倒だねえ
595初心者:02/03/15 11:08
select()って必要ありますか?
accept()の前にあるんですけど必要性がわかりません。
あとsend()やrecv()の前にもあります。
>>595
selectは必要あります。
あなたが見たプログラムが必要ないところでselectを使ってるかどうかは
判断のしようがありません。
597初心者:02/03/15 12:02
>>596
タイムアウトを検出するためでしょうか?
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
読めとまで言ってるのに読みもしない人に説明する気はありません。
599初心者:02/03/15 14:31
>>598
読みましたがわからないです。
600600だー!:02/03/15 15:29
>>599
しね
SOCKET初心者ではなくプログラミング初心者で
プロセスとかスレッドがわからないとか。
602初心者:02/03/15 15:58
なぜaccept()の前にselect()がいるんですか?
accept()もconnectされるまで待ってくれるのに
select()で待つ意味がわかりません。
>>602
いらないと思うのなら、selectをコメントアウトしてコンパイルして
プログラムを動かしてみろ

そしてどんな動きをするか確認しろ

話はそれからだ
604604だー!:02/03/15 16:58
その前にprogram理解しろ、selectした後どうしているのか?
出来ないなら死ね
605初心者:02/03/15 17:02
>>603
特におかしな動きはしません。

>>604
selectした後acceptしてます。
606606だー!:02/03/15 17:13
アファか?
selectの引数や返値調べて、

> タイムアウトを検出するためでしょうか?

以外に意味あるのかどうか考えられないなら、死ね
607初心者:02/03/15 17:32
>>606
他に意味があるんですか?
608デフォルトの名無しさん:02/03/15 17:53
>>596が読めないのか?
609初心者:02/03/15 18:00
>>608
selectが必要ないところで使ってあるのですね?
やっとわかりました。
>>609
もういいから氏ね
二度と来るな。邪魔だ。
>>610
そんなこと言っても相手をしてしまうあなたはずばり初心者が好きに違いない
>>609
ネタなのか、天然馬鹿なのか。
613初心者:02/03/16 00:40
あなたがたのような大人にだけはなりなくない。
未成年ですが....
615初心者:02/03/16 11:09
select()を明快に説明できる人はいないんですか?
わかりやすい本でもいいんで教えていただけませんか?
UNIXネットワークプログラミングっていうのを読んでみましたが
わかりませんでした。
616初心者:02/03/16 11:11
>>612
ネタではありません。
自分が馬鹿なのはわかっています。
>初心者
仕事でやってるのかどうか知らないが、そうだとしたら
こんなのが同業者とは思いたくないな
そう思うだけで 鬱だ
selectがいらないと思うなら、使わなくていいよ
そして そのプログラムを納品すればいい
どうなろうが俺らの知ったことじゃない 好きにしな

>ALL
以後 「初心者」は放置しましょう
618初心者:02/03/16 19:25
>>617
要するに、説明が出来ないだけなのですね。
あなたこそ、ここに来るべきではありません。
真面目に取り組んでいる人間に対して、無礼だと思いませんか?

で、select()はなぜ必要なのですか。
満足のいく説明をしてください。
619初心者:02/03/16 19:28
私が馬鹿なのではない。
馬鹿なのは、あなたがただったのですね。
説明を求めても「氏ね」としか言えない。
プロのプログラマのとるべき姿勢とは、到底思えません。
>>618
ここは、あなたに問いつめられるスレではありません。

>>619
理解力を深めるためには、一度自分を疑うことも大事かも。
先入観・その他で、周りが見えなくなることがありますから。
自分は間違ってないと思っていると、周りの善意も悪意に見えますよ。

「氏ね」と言われるまでの、あなたのやり取りをもう一度見直してみてはいかが?
621初心者:02/03/16 19:40
>>620
要するに、あなたも説明ができないだけなのですね。

>「氏ね」と言われるまでの、あなたのやり取りをもう一度見直してみてはいかが?

このようなことをあなたに言われる筋合いはありません。

それで、select()は何故必要なのですか。
満足のできる回答を願います。
622620:02/03/16 19:43
うん。そこまで気にしたこと無いもん。(^-^)
623初心者:02/03/16 19:51
すみません。偽者のかたがたくさんいます。
プププ
IDがねーのをいいことに、都合の悪い発言は全部偽物扱いか
おめでてー奴だな

初心者 君はもう死んでいいよ
今すぐビルの屋上からダイブしたまへ
625初心者:02/03/16 20:09
信じてくださいよー
 ↑     / ̄ ̄ ̄ ̄\    おまえら「オタク=デブ」と勘違いしてないか?
 │    (  人____)    最近のオタクは、みんなガリガリに痩せてるよ。
 │     |ミ/  ー◎-◎-)   「オタク=デブ」という概念は、今では古いね。
 │    (6     (_ _) )
 │   __| ∴ ノ  3  ノ   まぁ秋葉原にでも行って、実際にオタク共を観察
 │  (__/\_____ノ    してみれば分かるよ。
160cm/ (   ))      )))   痩せていてキショイオタクどもが蔓延ってる。
 │ []___.| | select()命 ヽ  奴らを見ると本当に狩りたくなるよな。
 │ |[] .|_|______)
 │  \_(__)三三三[□]三)  ま、俺みたくかっこいい奴はそんな奴ら
 │   /(_)\:::::::::::::::::::::::| 相手にもしないけれどね。
 │  | SONY |:::::::::/:::::::/ ←初心者
 │  (_____);;;;;/;;;;;;;/
 ↓      (___[)_[)
発言のタイミング考えても、同一人物と思われて仕方ないよなぁ・・。

select()の前にトリップを勉強しておくべきでしたね。
まぁ、初心者の本性が分かったわけで(w
これで心おきなく放置できるな
よかったね 初心者
629初心者:02/03/16 20:24
>>626
VAIOだけあってる
糞スレ万歳
631初心者:02/03/16 21:31
いろいろ検索などしてしらべているのですが
やっぱりわかりません。
標準入力などは使っていませんし。
632デフォルトの名無しさん:02/03/16 21:35
selectなんてスレッドがある今は無用の長物
初心者は悩まず先に進むべき
633初心者:02/03/16 21:40
>>632
マジですか?
acceptした後はスレッド起こしているんです。
でも、そのacceptの前にselect()があるんです。
これが謎すぎます。
そのプログラムを全部どっかに上げてみるというのはどうかなあ。
意図するところを知るには全体を見るしかないと思う・・・
>>634
俺も一瞬そう思ったのだが、あーゆー態度だからなぁ。
相手するのも教育上良くないと思うので書き込まなかった。
荒れてルナー。環境はwindowsかxnixか?>>初心者。
acceptしちゃうとクライアントが接続してこないかぎり、
ブロックされるでしょ。プログラムがそこでブロック
されてもいいんならselectとかpollしなくてもいいよ。
XENIXて!
「ハード」はPC-9801FAか?
>>637 いや、unix とか linux とかあるんで、
Xnix と書いたつもりだたのだが...
xenixは思いつかなかった。

#懐かしーな、コンパイラのライブラリに
xenix互換エラーコードとかあったな。
639デフォルトの名無しさん:02/03/17 17:23
xtiはいつかBSDソケットを置き換えるようなものになるんでしょうか?
640デフォルトの名無しさん:02/03/17 22:55
>>595
> select()って必要ありますか?
> accept()の前にあるんですけど必要性がわかりません。
> あとsend()やrecv()の前にもあります。

この書き方だと誰か他の人の書いたコードを読んでますね。
acceptの前にあったりsendやrecvの前にあったりと
selectがあちこちに散らばってる状態でしょうか?
そうだとするとそのコードが腐ってる可能性が高いので、
他のもっとよいコードを参考にしましょう。
普通selectは一箇所ですむはずです。
641初心者:02/03/18 09:48
疑問のソースです。
ここのselect()はどんな意味があるのでしょう?

if (listen(sock, 5) == SOCKET_ERROR) puts("listen Error\n");
FD_SET(sock, &fdval);
while(1){
if (select(1, &fdval, 0, &fdval, NULL) == SOCKET_ERROR) puts("select Error\n");
if (FD_ISSET(sock, &fdval) == 0) continue;
len = sizeof(claddr);
if ((clsock = accept(sock,(LPSOCKADDR)&claddr, &len)) == INVALID_SOCKET) continue;
642初心者:02/03/18 09:51
ちなみに本番のソースではありません。
これを見て勉強しろといわれました。
>>641
> 疑問のソースです。
> ここのselect()はどんな意味があるのでしょう?

目が腐るから、このソースは捨てて、

> UNIXネットワークプログラミングっていうのを読んでみましたが

で勉強しろ。このソース考えても時間の無駄。
アファ炸裂だが、INVALID_SOCKETでcontinueなのが一番ウケタ
INVALID_SOCKET ?

FreeBSD で man したら EINVAL ってのしかなかった。
ひょっとして socket, listen, select, accept のエラー
は OS ごとに違うのだろうか...
646初心者:02/03/18 17:19
おかしなところは多々あると思いますが、最大の謎である
select()の必要性はどうでしょうか?

こんなところにselect()はいらない。
それとも、select()はいいとして、まともに機能していない。

どちらでしょうか?

1つ思ったんだがWinSockって3way handshakeが完了した後
(サーバがselectから戻った後)acceptする前にクライアントが
RST送るとacceptはどんな振る舞いすんだろ。
なんか『UNIXネットワークプログラミング』には実装依存て書いてる。
ま、実際こんなことは稀だと思うけど。
参考> 『UNIXネットワークプログラミング』 P.126, P.409
648初心者:02/03/18 17:31
ひらめきました。
ひょっとしてselect()ってブロックさせないためにあるんですか?
だとすると、上のソースにはselect()は必要ないですね。
649初心者:02/03/18 17:44
っていうか>>636さんが、核心を突いてる!!ってこと?
気づかなくて、ごめんなさい。
つーかよ、なんでselect()が必要かどうかだけに着目してるの?

その教育用サンプルは非常にまずい。
select()があっていいかどうかなんて問題に矮小化すると、
大切なことが抜け落ちちゃうよ?

・listen(), select(), accept()のerror処理は適正か?
・fdvalはreadfdsとexceptfdsの両方に使われている。なぜ?
・FD_ISSET()による検査後の対処は適切か?
・accept()が実行されるのはどういう時か?

などの問題点を解決して始めて、
この文脈でselect()にはどういう意味があるかを問うことが出来る。

糞プログラムの意味なんて問われても答えられない。
全部が糞。これを勉強の道具に使うと糞が再生産。

select()をaccept()の前に使うのはどういう時が考えられますか? なら、
・timeoutを設定したい時 (Winsockは他に方法があるが)
・非同期I/Oもmulti-threadも使う事を禁じられた状況で、
複数のsocketでeventを待ちたい時。
などと一般論で答えられるけど。

>>595なんて「いる時はいる、入らない時は入らない」としか答えようがない。

あなたは「いる、いらない」の答えだけが欲しいみたいだけど、
それは本来あなたがやるべき事からはかけ離れている。
>>650
ずいぶんと丁寧な・・・優しいひとですね。
まず、このようなサンプルで教育しようとする会社(学校)は×。
そのような会社(学校)を選んだ初心者は×。
このサンプルに疑問をもたない初心者はプログラマ失格。センスなし。
さらに >>648 のような納得をしてしまう初心者は高等教育を受け直す必要あり。
652647:02/03/18 19:38
>>647への自己レス。気になったので試してみた。
select後のacceptはブロッキングもしないしINVALID_SOCKETも返さない。
しかしacceptの返り値で得られるソケットに対して
send/recvするとSOCKET_ERRORが返される。
WSAGetLastErrorはWSAENOTCONNになる。
こういう場合のエラー処理って普通は考慮しなくていいかな?
653初心者:02/03/18 20:09
すごく勉強になります。
654647:02/03/18 20:25
>>652
間違った。
recvの返り値は0だった。
鬱氏。
>>653=何も考えてません
select()は(必要な|必要ない)のですね
と壊れたレコードのように繰り返すのみ。
お前に理解する気がないのはもう嫌ってほど分かったから
帰ってくれ。頼むから
>>641
これBusyLoopしてるじゃんよ。いかがなものか。
657初心者:02/03/19 08:46
また疑問ができたら来ます。よろしくおながいします。
来なくていいよ。永遠に
659初心者:02/03/19 10:17
UNIXネットワークプログラミングのp331に載っているフローチャートを見ると
select()してからaccept()しています。
これはinetdデーモンというものの説明のようです。
たぶん、これの名残なんだろうと思うことにしました。
名残て
あの糞プログラムは以前はinetdだったのかぁ?
すげーなれの果てだな(w
661初心者:02/03/19 14:09
p161,162の単一のプロセスとselectを用いるTCPサーバ

これの名残かも。。
データ送受信のとこを別スレッドでやるようにしたけど
select()を消すのが面倒だったと。
これで、完璧か!
662デフォルトの名無しさん:02/03/19 14:54
>>647
p126のシーケンスを再現するとWinsockだとacceptの戻りはゼロ、
recvも0バイト受信みたいですね。tcpdumpを使わないでやってたら
一度recvで>>652が出ましたよ。まあ、双方ソケットをクローズして
新しいコネクションを待てば問題ないですね。

AIXでやるとp127のエラーが戻されます。
なんかすっかり糞スレになっちまったな…
664初心者:02/03/19 17:47
糞スレになってしまったので新スレ立てましょう
うむ。お前用のな。
666初心者:02/03/19 18:15
んじゃ、立てますね
そっちのスレ削除されても、へたれのままでここへ帰ってくるなよな。

て言うてたら「ネットワークプログラミング相談室 part3」て立ててたりして。
666だけに。
ばかもん。つぎはport3ダロガ。
669初心者:02/03/21 21:57
ばかもん。
670初心者:02/03/22 00:20
ぽけもん。
すいません質問させてください。一応過去ログは見たつもりです
Winsockを使い、WEBサイトにアクセスして返事をもらうプログラムを作りました

sendで
sprintf(str, "GET %s HTTP/1.0\r\n", pathname);
これで作ったstrを飛ばして、recvで受け取るだけの基本中の基本の奴です

これで大抵のところからはちゃんとタグ他が帰ってくるのですが、とくとくのhtmlを取得しようとすると

「URL is Unknown or in Syntax Error」というのが含まれた文章を返されてしまいます
ユーザーエージェントがIEなどのブラウザでないとアクセスできないようになってるのでしょうか?
だとしたら、どうすれば回避できるでしょうか

教えていただけると幸いですm(_ _)m
>>671
tok2.comはName-based virtual hostを使っている(みたい)ので、HTTPリクエストに
Hostヘッダ(RFC2616 14.23)を含めてあげないといけません。
RFCを読まず&&実験せずに書き子
>>672 >>671はHTTP/1.0でアクセスしてるけどそれでもHost:は必須って判断なの?
>>671 \r\nのペアを一回でなく二回したら取れたりしない?
>>672
アドバイスありがとうございます。遅くなりました
HOST情報としてwww43.tok2.comを送ったら、やっと返してくれました

>>673
上記の通り、トクトクはHOST情報必須だったようです
他のページは取れるのにね

また詰まったら相談に来るかもしれません。その時もよろしくお願いします
早く逆に質問に答えられるようになれるといなヽ(´o`)ノ
674じゃないですが http なんかを自分でやるのは骨が折れるなあと
実感しているところですがお前らどうしてますか。
やっぱり普通libwww/WinInetですか。
良く見かける


len = sprintf( buf, "GET %s\r\n", pathname );
send( s, buf, len, 0 );

// reveive contents and output them.
while( (len=recv( s, buf, sizeof(buf), 0 ))>0 ) write( 1, buf, len );

こんな感じの記述。
これってさ、最初にrecvが-1返したら、データ受け止める前に終了しちまう気がするんだが…
>骨が折れるなあと。。
要するにキミはチウボウだね。(´‥`)
678675:02/03/23 03:08
チウボウです。(´・ω・`)ショボーン
HTTP1.1があんなにしんどいとは思いませんでしたYO!

>>676
recvが-1返したらエラーなのでEINTR以外はどうでもいいと思いますヨ
あとsendは繰り返さないとダメですな。普通は大丈夫でしょうけど。
>>676
同期ソケットでしょ。-1はエラーだから終了で
いいんじゃない。
680676:02/03/23 03:14
む?
でもsendした直後にrecvすると-1がしばらく返ってきて、その後データが送られてくる(revcに1以上が返ってくる)んだが、
俺のミスか??
>>680
それは非同期ソケットなのでは?
682674:02/03/23 03:23
詰まるの早すぎですんません(;´Д`)
CGIにPOSTを送って、データをもらうプログラムが一応完成したのです
掲示板から情報もらう。送る情報として
Content-Length:
を使ってちゃんとできる

ですが、大抵の掲示板はいいのですが、2ちゃんねる型のBBSが正常な情報を返してくれません
例えば
ttp://www.nyuch.net/test/read.cgi?bbs=ragnarok&key=015906629
ここなどです

「そんなスレッドありません。過去ログ倉庫にもありません」 というページが返ってきてしまいます
Content-Length: を間違えたかなとも思ったのですが、bbs=ragnarok&key=015906629の文字列の長さををstrlenで
とるようにしてるので間違えようがありません

何が原因か考えてみましたが
・クッキー情報とかおくらないと駄目?
・ブラウザじゃないと駄目?(ブラウザだと言い張ればOK? User-Agent:を偽造すべし?)
でしょうか?

ちなみに送っている情報は"POST 〜〜〜〜 HTTP/1.0\r\n" "Content-Length〜" "bbs=ragnarok&key=015906629"です
他の掲示板とかはうまくいくんだけど…
683676:02/03/23 03:34
>>681
ぐは!
超ボンミスだ。同期モードと非同期モードで処理分けてたはずが両方でAAsyncしてやがった…
指摘さんきゅ〜直った直った
>>682
何をしたいのかよくわからんが、
掲示板に書きこみたいのか、多だ読みたいだけなのか?

それと、context-lengthを誤解してるような。
とりあえず送ってるヘッダ全部書いてみれば。
685682:02/03/23 04:08
>>684
掲示板を読みこみたいだけです、低LVですいません(;´Д`)

"POST /test/read.cgi HTTP/1.0\r\n"
"Host: www.nyuch.net\r\n"
"Content-Length: 26\r\n"
"bbs=ragnarok&key=015906629\r\n"
"\r\n"

内容的には上記を送っています
実際はsprintfやstrlenを使って楽をしており、他の掲示板は読みこめるのでそのあたりのミスは無いと思うのですが…

686682:02/03/23 04:09
失礼しました。書きこみミスです

"POST /test/read.cgi HTTP/1.0\r\n"
"Host: www.nyuch.net\r\n"
"Content-Length: 26\r\n"
"\r\n"
"bbs=ragnarok&key=015906629\r\n"
"\r\n"

です
読みたいならGETだよ。

GET /test/read.cgi?bbs=ragnarok&key=015906629 HTTP/1.1
Accept: */*
User-Agent: hoge
Host: www.nyuch.net
Connection: close
>>687
POSTで
bbs=ragnarok&key=015906629\r\n
送って、データを受け取りたいんじゃないか?
POSTの練習とか
これで間違ってないように見えるが…
2chも変なメッセージ返してきて駄目なんだよな〜
read.cgiってPOSTを想定してないんじゃない、
書きこみはbbs.cgiに送るみたいだし。

いや、よくしらんけど。
やっぱりお前ら苦労しすぎ(´・ω・`)
>やっぱりお前ら苦労しすぎ(´・ω・`)
要するにキミはチウボウだね。(´‥`)
692デフォルトの名無しさん:02/03/23 14:24
苦労するのが好きなんだからいいじゃない。
693デフォルトの名無しさん:02/03/23 15:16
サーバークライアント型ソフトのネットワークプログラミングでデバッグ
する際、etherealのようにやりとりしたデータの中身をそこそこ表示する
ようにしたいんだが、それをファイルにおとして必要なデータの検索とか
したい。tcpdumpで同じことできますか?
なにやら色々オプションがあるんだけど、やってみたけどわからんかった。
それともできないのかな?まぁある意味やばいことはわかってるけど。
694初心者:02/03/23 15:49
要するにキミはチウボウだね。(´‥`)
695デフォルトの名無しさん:02/03/23 16:16
>>674
> 他のページは取れるのにね

こんな考えのまま糞アプリ配布しないでね。
>>695
GETを使いはじめたばかりの初心者になんてことを・・・
697デフォルトの名無しさん:02/03/24 01:47
>>693
サーバ/クライアントともに自作ならなにもパケットキャプチャしなくても
よいんでは? 送受信したデータをファイルに落としてみるとかさ。
テストするときは決められた受け答えをする偽クライアント/偽サーバを
作ってやってるよ。
まぁ捕っちまって見た方が早いっつーケースはあるな…
699672:02/03/25 11:24
亀レスすまそ。

>>673
Name-based virtual hostを使っているサーバに対しては、純粋にHTTP/1.0しか
使わないクライアントでは目的のリソースを正しく取得できません(Hostヘッダの
内容によりどの仮想ホストへの要求かを決定するため)。
ので、HTTP/1.1を使うかHTTP/1.0のままHostヘッダをつける必要があります。
>>693
パケットをそのままファイルに落としたいなら"-s 0 -w ファイル名"。
これをtcpdumpで解析したいなら"-r ファイル名"。

テキストベースのプロトコルなら、このファイルを直接エディタで開けば検索でも
なんでもできるし。
>>686
POSTするなら、まずは
Content-Type: application/x-www-form-urlencoded
をつけておけ。
702デフォルトの名無しさん:02/03/26 05:12
DiabloみたいなネットゲーってTCP/IP使ってるんですか?UDP?
そのときって送受信バッファってなんバイトぐらい取ってるんでしょう。
リアルタイムではプレイヤーの操作ぐらいしか送受信しない気はしますが、
バッファリングするとネットワーク越しの相手から見たら遅延したり、
いきなり瞬間移動した風にみえないのかな。
バッファを短くして、小さいパケットを連続して送受信してる風に
見えるんですが、実際のところどうなんでしょう。
基本的に移動情報などpacket lossしてもいいものはUDP、
メッセージなどlossすると駄目なものはTCPを使う。
diabloあたりだとlossすると瞬間移動したりするからなー
実際のゲームではlossが起きても途中の位置をある程度予測
し、補正できるようなしくみが必要。
704ともみ:02/03/27 00:43
WindowsでCプログラミングしていますが、
自分自身のIPアドレスを変更することって可能なのでしょうか?
C++を使ったクラスは用意されているみたいなのですが、Cでやりかたをご存知でしたら教えてください。

やりたいことは、WinSockを使って、IPパケットのSourceIPをダイナミックに変更していきたいのですが、
自分自身のIPと違うIPでバインドしたところエラーになったので、
そこで自分自身のIPアドレスを変更することで、結果としてSourceIPを変更したいなと思っています。
rawソケでもつかわねーとSourceIPの偽造なんてできねーよ。
706デフォルトの名無しさん:02/03/27 00:51
IPを偽装してパケット戻ってこれるの?
時と場合によっては、例外的には、戻ってこないこともない。
バカハブネットワークで、IPの下のほうを偽装したときとか。
ほとんどもどってこねーけどな。
708デフォルトの名無しさん:02/03/27 03:01
>>706
DoS用のprogramでも作ろうとしているか、
負荷分散首振りサーバ群でも作ろうとしているんじゃないの?

>>702
TCP/IPってのは、the Internet protocol suite、
あるいはその下位層の総称な。
TCP←→UDP protocolはどっちもIP protocolの上位層。
>>706
「分身の術」
>>704
bindでできない?
711デフォルトの名無しさん:02/03/27 21:55
便乗質問いいっすか?
SYN flooding のツール作ってみたんですけど、
外に向かって撃ったらすぐ ADSL router がハング
してしまいます。
source IP を偽造しているためにNATテーブルが
溢れてしまうんでしょうか?
D-bornはそういう現象はありました?
>SYN flooding のツール作ってみたんですけど、
>外に向かって撃った
逝ってよし。
NAT越しにDOS攻撃して訴えられればー。
>>711
通報しますた。ってレスが欲しいのですか?
ルータの攻撃に成功したようなのでそのへんでやめれば?のほうがいいですか?
「ルータに対してSYN-flood攻撃している状態」ですか。
せっかくsource書き換えても、途中にNATあったら意味ないだろ(笑)
お前NATの意味わかっとるのかと小一時間(...
ワラタ、自分でルーターハングさせるアホがいるとは(藁
。。。。どうしょうもねーな。
まぁ、何事も経験だ。
719デフォルトの名無しさん:02/03/28 23:16
WinSock Spy みたいなので Windows2000 WinSock2 で使えるもの無いですか?
720人柱:02/03/29 02:10
プログラマーの皆さん。
僕のささやかな大計画を助けてください。

僕の会社で、kddiのデータセンターに100M帯域保障で
サーバーを立ててしまいました。 8月までのあいだ僕以外誰も
タッチしません。完璧に私用OK なのです。

エロ大計画
1・サーバーをリモート管理する
2・Winmxを常時稼動させて ダウンロードしまくる
3・助けてくれた皆さんにダウンロードエリアを開放する

もし捕まって僕です。僕は命をかけてやり遂げる所存です。
やり方(プログラムや仕込み)を教えてください。
>>720
か…神!?
春だねえ
>>720
ネタでない根拠を示したまへ
720どこいった?
725デフォルトの名無しさん:02/03/31 19:51
チャットみたいな機能をつけたいのですが、簡単に文字の送受信ができるDLLないですか?
726ともみ:02/03/31 22:27
704です。

私も調べてみました。
やはりWinSockでSourceIPの偽造は難しそうですね。

ということで、自分自身のIPアドレスを動的に変更するようなプログラムを書きたいです。
MFCでSetAddress()というのがあるらしいのですが、使ったことある方いますか?

当方MFCに関してはほとんど初心者なのですが、スケルトンを作成して、
とりあえずダイアログを作ってボタンを押したらSetAddress()を実行して
IPを変更(値は決め打ち)するようにしたら、コンパイルとリンクは通ったのですが実行するとエラーが出て落ちてしまいました。
(見たことがないエラーでした・・。)
ソケットの勉強をしています

"GET url HTTP/1.0\r\n"
ついでに
sprintf(str, "Host: %s\r\n", hostname);
ホスト情報も送って、ユーザーエージェントをIEだと偽って2chに接続したところログが取得できました

だがこの場合、せっかくのgzipは働いていないでしょうか?
もし働いていないのなら(2chに負担をおかけるのはよろしくないので)やめるかgzip対応方法を
模索するのですが…



>自分自身のIPアドレスを動的に変更するようなプログラム

はぁ
>>727
Accept-Encoding: gzip
が、とりあえずmonazillaスレ最初から目を通せ。
>>729
ありがとう
過去ログは見られないみたいだけど、現スレだけでも追ってみるよ
731ともみ:02/03/31 23:31
>>728
おかしいですか?

単純に、自分自身のIPアドレスを変更するプログラムを書きたいのです。Win環境で。
>730
part2は無理だけど、part1はこれで充分のはず
直読み規制はまだだけど、閉鎖危機(gzip)はここ
http://piza2.2ch.net/tech/kako/981/981726544.html
>>728
放置しとけって
>>726
< やはり「私は馬鹿だから」WinSockでSourceIPの偽造は「私には」難しそうですね。
それより早いとここの前スレhtml化して欲しい
736ともみ:02/04/01 22:34
>>734
可能なんですか?
犯罪を犯そうなんて考えてるヴァカな人は誰ですか。
ネカマ注意報(・∀・)
739デフォルトの名無しさん:02/04/04 10:13
recvのタイムアウトってどこで設定するんですか?
SO_RCVTIMEOをsetsockopt.
いろいろ罠があるから、素人にはお勧めできない。
741デフォルトの名無しさん:02/04/04 15:58
>>740
ありがとう。とりあえずうまく行きました。
罠が気になるけれど、調べた限りではLinuxでは使えないって事しか
わからなかったけど、他にありますか?

今回はちょっとしたプログラムだったからいいけど、
素直にselectを使うのが無難なのかな??
>>731
使った事はないし、プラットフォーム限定みたいだけど。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tcpip/tcpip_7wiv.asp
743デフォルトの名無しさん:02/04/05 07:13
>>741
> 他にありますか?

このスレを検索せよ。
>>743
「WinSock2.0以降じゃないとダメだよ」って事ですかね?
745ななし:02/04/08 00:00
おちたらあかん
I/O完了ポートを1から学ぶのにお勧めの書籍ありますか?

やはりMSDNやこのスレで紹介されているサイトを参照した方が
よいのでしょうか?
747デフォルトの名無しさん:02/04/09 21:37
PHP なんですけども。

<input type="text" name="key1" value="val1">
<input type="checkbox" name="key2" value="val2">

みたいなものを一括して

array["key1"] == "val1"
array["key2"] == "val2"

みたいな感じで、一括して配列に流し込む関数とかないでしょーか。
748デフォルトの名無しさん:02/04/09 22:22
TCPのコネクションが切れた事を知って、エラー処理をしたいのですが、
どうやったらいいんでしょうか? TCPのタイムアウトとかを利用するしか
ないんでしょうか?
接続が切れたら、selectを通過してrecvが0バイトを受信する
>>748
うぃ。それかタイムアウトを自前で処理するとか。
751デフォルトの名無しさん:02/04/09 23:46
>>748
MSDNにいくつか記事が有るし、IOCP自体はそんなに新しい技術では
ないから、VC++4.0の頃の「Books Online」でさえ、いくつかの
ソースでIOCP使ってる(Popサーバのサンプルとか)んで、参考に
できるソースコードの数は多いと思う。本はしらない。
もっとも、MSの「おもちゃレベルの」サンプルコードだと、
エラー時の処理がいい加減なのが×ですが...
xxの状態でRSTを受信した場合にpending中のI/Oについて
yyの結果となる、とかそういうのはわりとどこにも書いてなかったり
するので、自力でノウハウを蓄積するしかないかも...
752751:02/04/09 23:47
まちがい。
>>746だった
753デフォルトの名無しさん:02/04/10 21:12
すいまんせん
超素人です。javaでMultisocketプログラムをスタンドアロンで実行しようとしているんですが
できますか。ルータに設定がいるとか?
うまくいきません





754デフォルトの名無しさん:02/04/10 21:13
コードは
import java.net.*;
import java.io.*;
public class MulticastSniffer {
public static void main(String[] args) {

InetAddress ia = null;
byte[] buffer = new byte[65509];
DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
int port = 0;

// read the address from the command line
try {
try {
ia = InetAddress.getByName(args[0]);
System.out.println("IP="+ia+"\n");
}
catch (UnknownHostException e) {
// ia = InetAddressFactory.newInetAddress(args[0]);
}
port = Integer.parseInt(args[1]);
System.out.println("port="+port);
} // end try
catch (Exception e) {
//System.err.println(e);
//System.err.println("Usage: java MulticastSniffer MulticastAddress port");
//System.exit(1);
}

try {
MulticastSocket ms = new MulticastSocket(port);
System.out.println("test");
ms.joinGroup(ia);
System.out.println("test");
while (true) {
ms.receive(dp);
String s = new String(dp.getData(), 0, 0, dp.getLength());
System.out.println(s);
}
}
catch (SocketException se) {
System.err.println(se);
}
catch (IOException ie) {
System.err.println(ie);
}

}

}
勉強不足ですいません。
755デフォルトの名無しさん:02/04/10 21:54
ルータを設定しなければだめかな?
疑似でも実行はできない?
756デフォルトの名無しさん:02/04/11 01:44
JavaServletでdoPostをひとつのクラス内で二つ使うことはできませぬか?

例えば・・フォームのアクション属性で飛んできてgetParameterで取った
情報からDBの内容をセレクトしてそれをまたフォームで飛ばして・・って感じで

Servletってそれ自体あんまり長いコードにならないからあんまりクラスをちょこちょこ
分けたくないんですよね・・
オブジェクト指向のぉの字もないですが・・・

javaとか言ってるコイツ、アホだろ?
Javaはいいけど、内容がnetwork programming的じゃないね。
759デフォルトの名無しさん:02/04/12 02:54
>>758
ついでにNetWorkもやったろかって感じすかね?>Java

>>757
あなたがやってるのは何?
最近ネット関係のプログラム作り始めたんだけど、RFCが読み辛い。
HTTPやFTPについて解説してある良書って知りませんか?
>>760
書籍じゃないけど、「HTTP 解説」でググったらよさげなサイトが見つかった。
http://www.studyinghttp.net/
762ななし:02/04/16 15:02
ユウタの時間越えはナギ羽を持ってたことによる偶然ではなく、
アークによって仕込まれた事なのでは?

と思えてきた

763ななし:02/04/16 15:56
ユウタの時間越えはナギ羽を持ってたことによる偶然ではなく、
アークによって仕込まれた事なのでは?

と思えてきた

>>762-763
こっち逝け(藁

===読後は2chで踊りましょう なるしまゆり2===
http://comic.2ch.net/test/read.cgi/gcomic/1015182555/l50

# わざわざ探すな>俺
765デフォルトの名無しさん:02/04/16 17:10
>>760

プレンティスホール出版の「HTTP詳説」が良かった。
ISBN:4894710412
あ゛ー、pipelined requestの実装と、そのcancelの実装で、
死ぬる思いだYO‥‥最初からpipeline発行ねらうと、
いくらか遅延が発生するか、手動制御になっちゃうし‥‥
同鯖への2本の接続にどうリクエストを割り振るか、
ちゅうストラテジはどう構築すれば良いんだろ‥‥
767760:02/04/16 19:40
>>761
結構詳しく書いてるね。ありがたく参考にします。
もしかしてこのページの作者タンですか?

>>765
サンクス。早速本屋で見てきます。
>>766
そりゃチミがチュウボウってこったね
769766:02/04/17 05:08
えへへ、チュウボウってよばれちったよ、、、
じゃ、キリバンの768さんのイカスhttpライブラリをクレクレ
最初からpipeline可能であると仮定してはいけないって
RFCに書いてるんだからしちゃ駄目だろ
> Clients which assume persistent connections and pipeline immediately
> after connection establishment SHOULD be prepared to retry their
> connection if the first pipelined attempt fails. If a client does
> such a retry, it MUST NOT pipeline before it knows the connection is
> persistent.
「pipelineを試みて、失敗したら、pesistent connectionを仮定しちゃダメだよ」と読めるのだが
>最初からpipeline可能であると仮定してはいけない
の「最初」のうけとりかた次第かと。
・「その鯖の素性もわからない程最初のときに、pipelineを発行するなよ」
・「接続して最初にpipelineを発行するなよ」
ってこと。で、例示されたRFCの「assume persistant〜なクライアントは、
〜すべし」とあるのを見ると、後者なわけがない、と。
#もし違うなら、「クライアントは、そんな仮定をするな」って書くはず。
もっとも、前者をねらったというなら、770の日本語はダメダメ。
接続した直後からパイプラインでリクエストするクライアントは、
最初の(パイプラインされた)リクエストが失敗した時に備えて
再試行する準備をしておくべきである。
そして、そのようにクライアントが再試行する場合、
コネクションが持続的なものあると確認するまでは
(リクエストを)パイプラインして発行してはならない。

俺はこう読んでるんだけど、違うかな?
774766:02/04/17 18:46
そうだね。「パイプラインしてはいけない」のは、
「一発目が失敗して、再試行するとき」という条件下だよね。
要は、一遍失敗したなら、次からきちんと確認しようね、って事
775デフォルトの名無しさん:02/04/17 19:34
まったく関係ないけど
漢字って何バイト?
「漢字」はシフトJISだと「8A BF 8E 9A」で4バイトだ
2〜6バイトまで、多彩なコードを取りそろえておりますが。
778775:02/04/17 19:50
どうも、ありがとうございました。
CGIで、能動的にデータを送る方法はあるでしょうか?
例えば掲示板で、カキコされると即座に見ている人に更新命令を送るような感じで

JAVAアップレットをつかったチャットを考えているのですが、
通常の方法だと10秒毎にクライアントが読みこみにいきますよね
これをなんとか受動的(カキコがされたらデータが勝手に送られてくる。こっちからは取得にいかない)に作りたいのです

かなり無茶なこと言ってるかも…
Javaで、2chのdatを読み込むサンプルソースくださーい!
>779
CGIではなく、おとなしくircにしとけ。
782デフォルトの名無しさん:02/04/22 23:11
パケットを意図的に遅延させる方法ってありますか?
>>782
送受信の合間に適当にwait入れれば?

っていう話ではなく?
784デフォルトの名無しさん:02/04/23 14:47
>>783
waitで例えば1秒きっちりに遅らす事って可能?
要するに、こっちが意図的に目的の時間だけ
遅らすってことなんだけど。
>> 784
FreeBSDとかでブリッジ作って、帯域制御かけるのは
だめ?
786デフォルトの名無しさん:02/04/23 16:23
>>786
残念ながら、WindowsNTでやりたいんで。
無理なんでしょうかねぇ?
ネットワーク上のどの部分のパケットを遅らせたいの?
788デフォルトの名無しさん:02/04/23 16:35
>>787
初心者なんでうまいこと言えませんが、
例えば、データ(画像とか)を送信側から
受信側に送りたいときに、1つのパケットごとに
遅延を発生させたいわけです。
recv()の手前でwait()すればいいんじゃないか?
って思っているんですけど・・・。
つか、何のために、「パケット毎に」遅延を発生させたいのさ?
まあ、独自TCP/IPレイヤを書けば、逝けると思うよ。
パケットが予定通り1秒送れて届いたぞ!ってどうやって評価するの?
791デフォルトの名無しさん:02/04/23 17:05
>>789
独自TCP/IPレイヤを書けば逝けるって
wait()使えばいいのかな?
792デフォルトの名無しさん:02/04/23 17:06
>>789
独自のTCP/IPレイヤを書けば逝けるって
wait()を使えばいいのかな?
793デフォルトの名無しさん:02/04/23 17:12
受信側で受け取らなきゃ、送信側は遅れないからwaitで充分だろ。
わけわかめ。
パケットって言ってるけど、EtherNetフレームって言う意味か?
Sendするときに一括で送るんじゃなくてちょびっとづつ送るんじゃ
だめなのか?んで、そのSend毎にdelay入れちゃだめか?

初心者にかぎって、「パケット」の使い方がぁゃιぃという罠
初心者はなぜそうしたいのかを言わない罠。
「例えば」がやりたいことそのものなのか、一例に過ぎないのか分からない罠。
798デフォルトの名無しさん:02/04/23 23:41
擬似衛星通信でも作るのかな?
Cで、gethostbynameが失敗してNULLが戻る原因って、どんなのがあるでしょうか?
もちろん引数にはちゃんとGetComputerNameで取得した名が入っています
名前もちゃんとまともに取得されています
800デフォルトの名無しさん:02/04/26 08:31
winsockで、1つのファイルを分割して細かくしてループで回して送ってみるテスト
スレッドの中で100分割くらいしてsend送っているのですが、
受け取り側が一部しかrecvしてくれません
後半部分がどこかへ消えてしまっているようです

原因としてどのようなことが考えられますか?
本当に素直にsend, recv両方スレッド内で送るファイルのサイズが処理し終わるまでループにしている
だけなのです
TCP/IP通信は、送った順番にデータが届くし、そうそう消えることもないと思っていたのですが・・・
>>800
sendもrecvも、転送できたサイズを戻り値として返しますが
それはチェックしてますか
>>799
TCP/IPスタックがインストールされていない。
>>801
もちろん返り値を取得してチェックしております
sendはしっかり最後まで送信しています
でもrecvが途中から何も取得しなくなります
sendの回数が多すぎるのでしょうか
とりあえず、sendのループ部とrecvのループ部を
晒してみれ。
805デフォルトの名無しさん:02/04/26 10:22
>>800
UDPかTCPか、明記してないところが怪しい
TCP/IPはTCPのことではない。

それからWinsockはversion 1なのか2なのか?
socketは非同期なのか、同期なのか。

> TCP/IP通信は、送った順番にデータが届くし、そうそう消えることもないと思っていたのですが・・・

使い方によっては、Windowsやprogrammerが捨てる。
806名無しさん@接続しっ放し:02/04/26 10:27
>>799
エラー原因はWSAGetLastErrorで別途取得できる。

http://www.allapi.net/apilist/apifunction.php?apifunction=gethostbyname
http://www.allapi.net/apilist/apifunction.php?apifunction=WSAGetLastError

2ch.netで取得しようとしてはいけない(w

なお、エラー原因は「C」にあるのではなくて、システムにある。
「Cで、」はおかしい。
すみません。質問です。

VBなんですが、ネットワークドライバを取得して、ドライバをクローズすること
って出来ますか?ネットワークドライバを取得するAPIは見つけたんですが、
選んだドライバをクローズする方法が分かりません。
808デフォルトの名無しさん:02/04/26 15:31
マルチキャストのパケット投げる LAN 用のメッセンジャーツール作ったんだけど、
グループの Class D アドレスやポートって適当に決めて良いの? 何か取り決め
とかある?
809807:02/04/26 15:44
すまん。解決した。

IPHLPAPI.DLLのGetAdaptersInfo関数を使い
ネットワークアダプタ名(AdapterName)を取得

cmd.exe起動、IPCONFIG /release + AdapterNameでアダプタ解放

IPCONFIG /renew + AdapterNameでアダプタ再取得

こんなことが分からなかったなんて・・・撃つ出汁
810デフォルトの名無しさん:02/04/26 16:05
ちみたちws2_32.dllをコピーしてC:\\にもってきたり
するなよ!あとあと面倒だからな!
あんた、もうでてくるなよ!
見苦しいからな!
>>812
見てなかった!! Thanks!!
これって IANA Reserved のアドレスを使えばいいのかな。アドレスが
同じでもポートが違えば問題ないよね。
814デフォルトの名無しさん:02/04/26 20:14
ひょっとして、
WSACreateEventとかのイベントオブジェクト使う関数って
Kernel32.dllのCreateEventやらと同じものですか?
from MSDN
>Remarks
>The WSACreateEvent function creates an event object that is manually
>reset with an initial state of nonsignaled.
>Windows Sockets 2 event objects are system objects in Windows environments.
>Therefore, if a Windows application desires auto reset events,
>it can call the native CreateEvent Windows function directly.
>The scope of an event object is limited to the process in which it is created.
816803:02/04/26 22:49
ソースはこんな風になっております
どうも4割程度受け取ったあたりでRecLoopの無限ループにはまってしまうもよう。

// すでに作成してあるsend.lzhファイルを分割して送ってみる。分割転送のテスト
void SendThread(void *Null){

FILE *fp;
char *data;
int size;
int i, cnt;

// lzhファイル作成
fp = fopen("send.lzh", "rb");

// ファイルサイズを取得
fseek(fp, 0, SEEK_END);
size = ftell(fp);

// ファイルサイズを送る
send(sckConnect, (char*)&size, 4); // ヘッダ(ファイルサイズ)を送る

// 圧縮ファイルを転送する
data = new char [size];
fseek(fp, 0, SEEK_SET); // 先頭に
fread(data, size, 1, fp); // 情報を読みこむ

// SLICE_SIZEバイトに分割して送る
cnt = size / SLICE_SIZE;
for(i = 0; i < cnt; i++){
send(sckConnect, data + (SLICE_SIZE * i), SLICE_SIZE); // 送る
Sleep(2);
}
// 端数分を送る
if ((size % SLICE_SIZE) != 0)
send(sckConnect, data + (SLICE_SIZE * cnt), (size % SLICE_SIZE));

delete [] data;
fclose(fp);

_endthread();
}
817803:02/04/26 22:50

// アドレス*Dataに、Sizeバイト受信して書きこみます
char RecLoop(int Size, char *Data){
int res, offset;

offset = 0;
while(1){
res = recv(sckConnect, Data + offset, Size - offset, 0);
if (0 <= res)
offset += res;

if (Size == offset)
return 1;

Sleep(2);
}
return 1;
}

// 受信スレッド。最初に4バイトのヘッダ(int で送られてくるファイルの大きさが書かれている)を読みこんだあと、
// ファイル本体を読みこむ
void ReciveThread(void *Null){
int size;
char str[4];
char ret;
char *Data;
FILE *fp;

while(1){
// ヘッダ受信待ち
ret = RecLoop(4, str);
if (1 == ret){
// 正常

// データ受信中
EnterCriticalSection(&cs);
Edit.Rec = true;
LeaveCriticalSection(&cs);

memcpy(&size, str, sizeof(int));
Data = new char [size];
ret = RecLoop(size, Data);
if (1 == ret){
// 正常
fp = fopen("ini/tmp/rec", "wb");
fwrite(Data, size, 1, fp);
fclose(fp);
}
delete [] Data;
}
}
_endthread();
}
>>816
sendの戻り値見てないじゃん。ほんとに全部送信成功してんの?
つーか、RecLoopにrecvのエラー処理が無い気がするけど‥‥
820803:02/04/26 23:20
>>818さん
あ、見落としてました
えっと、sendはそうそう失敗するものなんでしょうか…(そりゃ返り値でエラーがある以上エラーが出る可能性はありますが…)

>>819
データを全部頂くまで意地でもねばるつもりなので、recvの返り値が-1だった場合のことは考えていません
完成版ではもちろんエラー処理もするつもりですが・・・
>>820
簡単な話、送信バッファサイズより多く送信しようとしても
相手が受信しないかぎりsendは受け付けない。
>もちろん返り値を取得してチェックしております

なんつーか、やっぱりきちんとソース見ないとわからんもんだな(ワラ。

>820
>データを全部頂くまで意地でもねばるつもりなので、
>recvの返り値が-1だった場合のことは考えていません
途中で切断されても粘るつもりデスか?

>えっと、sendはそうそう失敗するものなんでしょうか…(そりゃ返り値でエラーがある以上エラーが出る可能性はありますが…)
つかな、
>原因としてどのようなことが考えられますか?
っていうまえに、エラーチェックくらいするのが大前提だろが。
そしたら、質問は「sendが失敗しているのですが」となって、
自力解決もできたかもしれなし、答えがくるのも速かっただろう。
>>821
ブロッキングのようだからあんまり関係ないかも
>>822
煽るな煽るな
最後の文章はともかく前半はただの煽りになってるぞ
825803:02/04/26 23:33
>>821
なるほど。ですが30KBのJPG送るだけでも失敗してしまうのですが、そんなに小さいものなのでしょうか…?

>>822
すいません。ソースミスです
途中で切断されても〜というのは、もちろん完成版の時は考慮にいれます
sendについては今から大急ぎで調べてみます
まさか、sizeのバイトオーダー問題ではなかろうな、、、
827803:02/04/27 00:02
sendの返り値は問題ないようです。しっかりSLICE_SIZEが返ってきます(端数部分では端数サイズ)
あ、記述忘れてました(;´Д`)

#define SLICE_SIZE 256

です
>途中で切断されても〜というのは、もちろん完成版の時は考慮にいれます

だから、原因究明フェーズではこういう情報も必要なことがあるわけよ。
recvがなんかしくじっているかもしれない。それがわかれば、かなり前進できる
情報は多い方がいいと思うのだが。
829名無しさん@接続しっ放し:02/04/27 00:35
sendして、
・指定したbyteだけ送られた
・指定したbyte全ては送られなかった
・エラーが起きた
全ての場合にちゃんと対処するプログラム書けない奴は、
ネットワークプログラミング辞めろ。
(´-`)oO(つか、send側socketはいつどこで閉じているんだろう
831803:02/04/27 01:13
色々さらに改良を重ねたところ、特定の人以外ではちゃんと送受信できているようです
その「特定の人」が今ネット上にいないので、近いうちに実験してみます
お付き合いありがとうございました
>>831
おいおい、ネット越しだったんかい!
じゃあMTU Blackholeとかあるかもね。
>>832
ねーよ!
>>803はtako。プログラム読んでみれ
読んで見てわからない俺もtakoだろうか・・・
どこか見落としてるのか・・・

気になる
まぁ疑わしい所はいくつかあるけど、とにかく特定するための情報が少ないので
何ともいえないね。
836807:02/04/30 17:07
解決してない・・・。IPCONFIG /renew ってDHCPのみ有効なんすよね?
スタティックにIPアドレスを設定した場合これではアダプタが解放出来ない・・・。
ローカルエリアネットワーク接続をコマンドプロンプトかなんかで
無効にする方法ってないっすか?
837807:02/04/30 17:11
×renew
○release

打つ氏・・・。ついでにage
ルートを手動変更してみるとか。
839デフォルトの名無しさん:02/04/30 20:16
840836:02/04/30 21:27
>>838
ルーティングテーブルをいじるのも考えたけどもっとシンプルに有効、無効ってしたい。

>>839
Value Meaning
MIB_IF_ADMIN_STATUS_UP The interface is administratively enabled.
MIB_IF_ADMIN_STATUS_DOWN The interface is administratively disabled.
おお、出来そうだ。パラメータ調べて明日試してみよう!ありがとう。
841デフォルトの名無しさん:02/05/04 23:55
相手のIPアドレスを取得して、
ファイルをやり取りするにはどうすればよいのでしょうか?
ソケットの開始方法などまったくわかりません。
何かよい文献等あれば教えていただけないでしょうか?
どうかよろしくお願いします。
相談させてください
winsockを勉強し始め、サーバー、クライアント接続などができるようになりました

ですが最近、うちは家の中でルータをかますようになりました。もう1台PCを手に入れたからです
普通にやっててはICQでセンドファイルすら無理だったので、
ルータの設定でDHCPというものを有効にしました(すいません。DHCPというものの正体については分かっていません)
そうするとICQでファイルのやりとりに不都合が無くなりました

単純に「ふーん。これはつまり、私のPCが今まで通りにケーブルNET内にちゃんと晒されたのかな」と思い
私がサーバー、友達がクライアントとして接続してもらおうとしました
接続先IPはルータに割り振られているものです(ルータかます前は私のPCに割り振られていた固定IP)

はて、接続できないようです。やっぱり私のPCは家庭内ローカルに隠れてしまっている??

前置きが長くなってすいません
この状況下で、私がサーバーとして友達にコネクトしてもらうにはどうしたら良いのでしょうか?
ルータのIPは203.165〜〜(ケーブルですが、友達も同じケーブルNETなので今まで問題なかった)
家庭内でのIPは192.168〜〜です
843842:02/05/05 02:26
読みづらそうなので、箇条書きにしてみます

・私はケーブルNET。友達も同じ
・ICQでのファイルのやりとりに問題無し
・私の家でルータを噛ませることになった。ICQでのファイルのやりとりが友達とできなくなった
・DHCPをいうものを有効にしたらできるようになった

・ルータに割り振られているのは203.165〜〜
・家庭内でわりふられているのは192.168〜〜
・ルータ前まで遊んでたサーバークライアントプログラムも、再び使えるようになったかなぁと実験してみた
・私がサーバー側だと友達がコネクト(203.165〜に向けて)できない

私がサーバーになることはもうできないでしょうか?
winsockの勉強中、友達側しかサーバーになれないのはちょっと不便なのです

長文失礼しました。参考文献、もしくは「できねーよ。残念」とか簡単なアドバイスでもいいので、
キーを教えてもらえると幸いです
>>842-843
板違い。Windows板かソフトウェア板に逝け。
845名無しさん:02/05/05 02:27
NATを使う。ルータのマニュアルに設定の方法とか載ってるはず。
初級ネットか通信技術板で聞いたほうがいいかも。
846デフォルトの名無しさん:02/05/05 03:50
HTTP1.0とHTTP1.1の違いがわかるサイト教えてください
847デフォルトの名無しさん:02/05/05 05:40
ここのスレってWindowsは対応してくれないの?
けちだからしてくれません
>>847
Windowsだから対応しないのではなく
プログラムでないから、対応しないと思われ
6to4して、IPv6対応にしたら、無問題さ!
関係するけど、NATを仮定すると、自分のIPを送って
接続してもらう方法がとれないでしょ
(静的NATを設定してても)。

ヤパーリ、自分のIPを送ったら駄目なんだろうか…
>>851
IPアドレスを渡すプロトコルでも、
NATするルータがプロトコルを理解してIPアドレスを
書き換えてくれればできる。ftpとかはやってくれる
ルータが多いはず。

自前のプロトコルだとそうはいかない。LinuxをNAT
に使ってたりするなら、自分でモジュールを書けば
できる。Linuxだとftp, realaudio, quake, cuseeme,
vdoliveとかはそうやって追加モジュールで対応してる。
853842:02/05/05 13:24
色々アドバイスありがとうございます
NATですか。ルータが安物でNAT使えないとか言われました(;;

一応プログラムのつもりでカキコしたのですが
connect(〜〜);
の際にうまくやる方法はないものかと
こちらとしてはルータのアドレス(203.165.〜〜) 家庭内アドレス(192.168.〜〜)の両方が知れてるわけですから

windows板というのも考えたのですが、winsock自体がlinuxなんかでも使われているsockのパクりだと
聞いていたので、こっちのほうが専門的な人がそろってるかなと思ったわけです

知識不足の初心者がお騒がせしております。すいません
プログラムのつもりって何よ?
自分で書くつもりがあるのか?
855842:02/05/05 16:09
はい。上に書きましたが、winsockでサーバークライアントを接続するプログラムを組んでいるところなのです
ファイル圧縮転送を行うものなのですが、ルータかましてる人とうまくいかないもので
相談にあがったわけです
856デフォルトの名無しさん:02/05/05 16:49
>>855
そんな事出来たら、バックドア作り放題者ねーかよ
>>842
NATとその動作について勉強してからのほうがいいと思う
858842:02/05/05 17:05
>>856
えーっとつまり、ルータのDHCPというものを有効にした状態でも、今までのように気軽に繋いだりはできないということでしょうか
すいません。DHCPというものの正体については勉強不足です。調べることにします

つまりICQは、繋がれることが可能な側を選択してサーバーに。もう片方をクライアントの役割に決定してるということでしょうか
友達も私のようにルータ(DHCP有効)をかましたら転送できなくなるのならそうですね
実験できないし・・・

>>857
やはりNATつきルータしか手がありませんでしょうか
この状態では不可能だと
なら一旦あきらめてNATのお勉強をしようかと思うのですが、不可能でしょうか?
842よ、その節操の無さはGW厨呼ばわりされても仕方ないよ。

これまでに出てきた単語について、しっかり調べて理解した上で質問してよ。
あと、調べるだけなら実機は要らないでしょう。
860842:02/05/05 17:23
はいわかりました
ではサイトを巡って調べてみるとします
お付き合いありがとうございました
結局誰も質問には答えていない罠w
>>861
相談されるだけで、質問に答えてやるつもりは毛頭ありませんが、なにか?
>>861
だから、不可能だっていうの。
プログラムから勝手にルーターを超えてポートを開ける事が出来たら、
それこそトロイ仕込み放題じゃないかよ。
ルーターでNATが設定できないなら、
中継サーバーを用意するしかない。
DMZ設定したらできへん?
866名無しさん@接続しっ放し:02/05/05 23:09
>>853
> NATですか。ルータが安物でNAT使えないとか言われました(;;

んな、わけないだろ。

> こちらとしてはルータのアドレス(203.165.〜〜) 家庭内アドレス
> (192.168.〜〜)の両方が知れてるわけですから

192.168.0.0/24って、private IP addressが使えているんだから。
NATはちゃんと機能しているよ。

> ・私がサーバー側だと友達がコネクト(203.165〜に向けて)できない

そのprogramはport番号は決め打ちか?
決め打ちならrouterのNAT(変換)テーブルに固定で登録しろよ。
(この機能がお前のrouterにないのか?)

かなり知識が欠落しているから、ここだけではきついぞ。
Nut&shellのfirewallの奴でも読んで、分からないところをここで聞けよ。
>>865
できない。DMZ は、外部から来たパケットを指定したホストに転送するもので、
NAT によるアドレス変換は発生するからね。
ここの回答者はキチガイ多いな。
質問者は比較的まともなようだが、、、
869名無しさん@接続しっ放し:02/05/06 00:29
>>866
> 192.168.0.0/24
ウワーン
/16だよ〜。
>>863
別に「勝手に」とは書いてないと思うが。
NATの向うでサーバ立ててる人と通信ができない
っていってるんでは。

>>869
192.168.0.0/24でもいいんじゃないの?
871870=852:02/05/06 01:58
違った。

NATの陰のクライアントから通信ができない
ってんだな。

だから>>852 で書いた通り、
「クライアントがプライベートIPアドレスをサーバに渡してしまう。
ところが当然サーバからそのアドレスは見えない。」
のが原因だと思うんだが。

解決案
・その自前のプロトコルを理解する用にNAT箱に教え込む(Linuxなら可)
・プロトコルを変える。
・自分の今のアドレスとは無関係に、ルータの外側のグローバルアドレスを
 渡せるようにする。

(そもそもなんで自分のIPアドレスを渡してるのかわからん。FTPの真似か?)
872デフォルトの名無しさん:02/05/06 04:35
ただ純粋にネットに接続してるか否かだけしりたいのですが、
InternetAttemptConnectってAPIを使うとネットにつながっていない
場合接続ダイアログが起動してしまいます。
これを起動しないようにする方法なにかないでしょうか。
スパイ系プログラムでも作る気ですか?
874名無しさん@接続しっ放し:02/05/06 13:47
>>871
> (そもそもなんで自分のIPアドレスを渡してるのかわからん。FTPの真似か?)

どこにそんなこと(「自分のIPアドレスを渡してる」)書いてあるの?
>>842-843にはそんな事書いてないよ。
875851:02/05/06 20:03
842=851と誤解したのでは?
876842:02/05/06 23:28
アドバイス本当にありがとうございます
色々勉強後、ルータの仕様を調べてみましたところ、
”バーチャルサーバー”というものを発見
設定した結果繋げられるようになりました
用語を説明書で探すのではなく、キチンと求めるものを理解して解説を読む
以後気をつけたいと思います
大変お騒がせしました
877デフォルトの名無しさん:02/05/07 11:45
Web上のダウンロードするプログラムを作っているのですが、
接続して受信することはできるのですが、その受信の規格などが
よくわかりません。
その規格についてのホームページ等どこかにないでしょうか?
See rfc2616.
879877:02/05/07 11:55
ちなみに最初に受信したバッファから\r\n\r\nを探して、
その次からデータとして保存しています。
このやり方をすると、うまくいくページと、うまくいかないページがあって、
バイナリファイルはまずうまくいきません。
なにか解決方法はないでしょうか?
880877:02/05/07 12:00
>>878
googleで検索したらいいページが見つかりました。
ありがとうございます。
>842
ひさびさに礼儀正しい質問者だった
これくらい礼儀正しければまた来てもいいと俺は思う。っつーか俺が教えてやる
ただ、結論を先に聞きたがるタイプのようだな。悪いとは言わんが
882デフォルトの名無しさん:02/05/09 10:35
WindowsでTCP Renoとか実装できないものか?
883836:02/05/09 18:46
うう・・・、すまん。

SetIfEntryを使いアダプタのクローズに成功。だがPINGを打つと
そのクローズしたアダプタに対してPINGを投げる。

漏れがやりたい事
・一つのPCに2枚のNICを挿す
・ネットワークアダプタの一つはインターネット網につなぎ、
もう一つは閉じられたLANにつなぐ。
・普段は閉じられたLAN上の監視端末と通信を行う
・異常が発生したときLAN側のアダプタをクローズ。
・インターネット網側のアダプタを開き、異常通知メールを送信する。
・送信に成功したらインターネット側をクローズして閉じられたLAN側のアダプタを開く。
・で監視再開。

SetIfEntryを使うとアダプタは使えなくなるが
もう一つのアダプタが有効なのにその無効にしたアダプタに対してパケットを投げている。
ごめん>>839。うまくいかんかった。

誰かネットワークアダプタを有効、無効にして、
なおかつ無効にしたときもう一つのネットワークアダプタに対してパケット
を投げられるようにする方法って知ってます?

ちなみに
PC:Win2KPro
開発環境:VB6.0
別にLAN側アダプタを閉じなくても、スタティックルート設定すれば
いいのではないかい?
885デフォルトの名無しさん:02/05/09 21:01
>>889だ。(謝られても困るんだが…)

・routing
・filtering

など他にもやり方はいろいろ考えられるぞ。

filteringして
・閉じている時: 全部捨てちゃう
・Mail出す時: dst port smtpだけ開ける
のが一番簡単なんじゃないのか? (3分で書けそうだ)
routingは勉強することが山ほどあるからな。

他にも、Internet網と繋ぐ時にPPPする、という手もある。
これはそもそもつながってないんだから、失敗しようがないぞ。
886883:02/05/09 22:50
うう、みんなやさしいな。
routeコマンド(dos)でそれぞれのインターフェースに対して
スタティックにルートを追加、削除すればよかったのね。

http://www.fctv.ne.jp/ASIS/netstatr/netstatr.html
http://www.geocities.co.jp/SiliconValley-SanJose/3925/windows1.html
この辺googleから拾ってきたんでよく読んで勉強するよ。
887デフォルトの名無しさん:02/05/18 15:44
winsockで質問があります
今ファイル送受信プログラムを作っているのですが、送受信を同時にすると止まってしまいます

・まずはコネクト確立。ソケットを作成
・自分が送信
・相手もこっちに送信

とやると、sendから-1しか返ってこなくなってしまいます
固まる理由はわかっていて、ファイル送信途中でとあるヘッダ(8バイト)を渡すために無理やり無限ループしているところ
ヘッダが破損しては困るので8バイト渡すまでsend部分をループさせてるのです(Sleep(2)あり)

ここからは素人考え
受信に一杯一杯だとsendは失敗する
だから8バイトとはいえ無限ループしているところのsendで失敗を繰り返してしまい固まる
何故なら無限ループ中はrecvしていないから

この推測は当たっているでしょうか?
recvに手一杯だとsendは失敗してしまうのでしょうか?
また、これの解決方法は?(ソケット2つつくる…とか?)無限ループやめろはごもっともですが・・・
select, poll, IOCP,...お好きなのをどうぞ。
送信/受信でスレッド分けるとか。
890デフォルトの名無しさん:02/05/19 08:48
>>887
んなことはない。
891デフォルトの名無しさん:02/05/27 20:37
UDPパケットのモニタ&改竄ツールってないですか?
ツール聞くのは板違いちゃうんかと。
893デフォルトの名無しさん:02/05/30 00:11
保守あげ
894デフォルトの名無しさん:02/05/30 01:18
VC++でなんですけど、サーバ側から、LANで、常時繋がっている
クライアントへ一括でデータを送信したいと思ってるんですけど、
手順を教えてもらえませんか?

サーバは、どのように送信するか?
クライアントと側は、イベントを受けれるのか?
さっぱり分かりません。。よろしくお願いします。。
マルチキャストしたい、ってこと?
それとも、TCPソケトがたくさんあるので、
そいつらに同じ内容のメッセージを送りたいの?
896894:02/05/30 09:52
>895さん

マルチキャスト、そんな高度なことではないです。
たぶん、後者だと思います。

例えば、時間がくれば、サーバ側からメッセージを送信して、
クライアント側(常駐のAP)が、メッセージを受信して、
表示するとかって感じです。。

よろしくお願いします。
んなもん、ソケットを配列に持って、forで回すとかしかねーだろ。
non-blocking推奨。
898デフォルトの名無しさん:02/05/30 15:40
凄く基本的な質問で申し訳ありません。
卒業研究でパケットからmacアドレスを抜き出すプログラムを作ってます。
tcp_dumpやlibpcap、LANアナライザなどで見ているのですが、
掲示板等に書き込む時にmacアドレスを抜き出せるものは作れるのでしょうか?
セキュリティーという意味で抜き出す方法を考えているのですが
なかなかうまく行きません。
方法は自分で考えますので、可能か不可能かだけ教えていただきたいです。

よろしくお願いします。
可能だが意味がない。
理由:MACアドレスはルータ超えるとかきかわる為。
そのため、ネット上の掲示板でMACアドレスを表示する
ようにしても、そのネットワークの近接ルータのMAC
アドレスがとれるのが落ち。
卒業研究とか適当な事書くのはやめような。
前も別の板で聞いてたね。糞厨房。
SO_RCVBUF
SO_SNDBUF
SO_LINGER
SO_TIMEOUT
TCP_NODELAY

↑はどう意味何ですか?
googleで調べたんですが、意味がのってませんでした。

良い調べ方など教えてください。
902デフォルトの名無しさん:02/05/30 18:10
903901:02/05/30 18:28
>>902
ありがとうございます。
勉強します。
904891:02/05/30 21:28
ネットワークプログラムの
デバッグに使いたいんで教えてくださいよ〜
>>904
    ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ( ゚Д゚ )< >>892が言っているようにイタチガイ。うせろ。
e@@と |  \____________
(・∀・,)λ |ノ
とと__Uつ
     ミ ピョン
ethrelとか使えばモニタできるけど、
改竄はルータでもないと無理じゃないかね?
s/ethrel/ethereal/
モニタならアプリでログ出力でもすりゃいいだろ、と言いたい。
デバッグで何を改竄する必要があるのかそっちが知りたいぞ。
データに間違いがあるならバグ直す方が大切だろう。
909898:02/06/01 02:49
>>899
ありがとうございました。

>>900
この板に来たのは初めてです。
他に書き込みがあったのですか?
検索不足でした。

気分を害したみたいですね。
申し訳ありませんでした。
910デフォルトの名無しさん:02/06/03 12:28
ネットワークRPGってどんな風に開発するんだろう
遅延への対策は?
回線が細い人対策は?

そんなことを考えているのですが、ネットワークRPGの作り方(というか考え方でもよい)を解説しているページというのは
ないものでしょうか?
もし知っている方がいらっしゃるのなら、教えていただけるとうれしいです
MMORPGじゃ普通は1秒に2〜4k程度のデータ転送しかない。
遅延時は何も考えずに作り、それがラグとなる。
もしくは、クライアントで勝手に進行させて後でつじつま合わせをする(Diablo2)

遅延時の予測なんかをやってるソフトもあるけど、レースゲームとかだけでしょ。
ていうか、一度作ってみないと細い回線で速度が足りるか足りないかなんて分からないんでない?
>>910
C マガ 6 月号にネットワークゲームの特集が載ってたな。
よく読んでないんで、役に立つかは保証できんが。
細い回線といっても、300bpsのモデムなんてものを想定してるわけではあるまい。
どの程度を考えているのかによって違う気もする。
915デフォルトの名無しさん:02/06/03 23:42
おい、おまいら
ネットワークプログラミングやってて楽しいですか?
C++でWinsock勉強できるオススメの本ってありませんか?
新宿のヨドバシ行ったけど全くなかったっす。
C++で、ってのがいまいちだけど、
http://books.softbank.co.jp/isbn/macmillan/devpress/#winsock
ではいかんか?

 ひょっとして、MFCのCSocketとかのことを言ってるのか?
>>916
新宿なら紀伊国屋があるだろゴルァ
919916:02/06/04 00:16
MFCとAPI両方学びたいです。
今のところJavaではソケット扱えてます。

>>917
その本ほしいです・・

>>918
今度見てみます。
920aki:02/06/04 00:49
イラストを追加しました。
タイトルはビーチ○バレーです。
http://www.h4.dion.ne.jp/~k.seed/index.html
921HK:02/06/04 00:53
すみません、質問させてください。
solaris8+zeus4の環境でperl5.6.1でCGIを書いてます。
CGIの中で、実行に時間のかかる処理を実行する関数を、fork()させた
子プロセスの中で実行することを考えています。こんな感じで。
.
.
foreach $i (1,2,3){
 if($pid = fork()){
  next;
 }else{
  very_long_time_to_process();
  exit;
 }
}
exit(0)

very_long_time_to_process()の中身は単に大量のファイルのコピーで、
親プロセスはその終了を見届けるまで待たずに、fork()し終わったら
すぐに終了します。処理に時間のかかる処理の終了を待たずに親プロセス
を終了させたいというのが、私のやりたいことです。
このプログラムをコマンドラインからcgiとしてではなく通常のスタンド
アロンのプログラムとして実行すると、意図したとおり親プロセスはすぐに
終了し、その裏で子プロセスがシコシコと時間のかかる処理を行い、私の意図した
通りに動くのですが、これをCGIとして実行すると、子プロセスが全て終了する
までwebサーバとの接続が切れずに、非常に長い時間クライアントは
待たされる(Connection closed by foreign host.がなかなか返ってこない)と
いう結果になります。
これを、CGIとして実行した時も即座に終了するようにするにはどうしたらよいのでしょうか?
すみませんが教えてください。
WinSock 2.0 プログラミング
はMFCもちょこっと載ってるからいいと思う。
メインはAPIの本だけど。
今日は仕事疲れすぎたので本屋よるの止めにします・・

>>922
ちなみにスレッド関連も少し載ってませんか?
>>921
とりあえず思い付くのはstdoutをクローズしてみるとか。
適当に思いつきで言ってみたけど、もしかしてそれかもしれんな。
ほら、ファイル記述子って子プロセスに継承されるやん。
子プロセスが終わるまでstdout閉じられないっしょ?
まだ何か出力されるかもしれんから、
終わるまでWebサーバーは待たないといけないんじゃなかろうか。
TCP/IPの実装について質問させてください。
ホストAからホストBに10個のパケットが送信された時、異なるパスを通って到着する
可能性があり、到着順序が異なることがあります。そういう事情を考慮して受信側の
TCP/IP層?では、到着したパケット群をある固定量(ソケットバッファ?)でバッファリング
した後、順番の入れ替えとかやってるのでしょうか?もしやってるとしたらどういう実装
方法をしてるのでしょうか? ソースへのポインタでも構いません。
>>923
一応マルチスレッドサーバをAPIで作るサンプルが載っとる。
たぶんそれは教科書に書いてある>>925

「ウィンドウ」に、ストリームのどの場所にあるべきパケットかという情報が
書かれてて、受け取る側ではウィンドウバッファの指定の位置にぽこぽこ
書き込んでいくわけだ。で、古いものから順にバッファが埋まったら
受信完了とみなしてウィンドウサイズを進めてACKを返す、と。

古い実装では、10個のパケットが逆順に届いた場合
(9 8 7 6 5 4 3 2 1 0)
0のパケットが届いた辞典で9まで受領したことになる。
この場合信頼できない経路においては再送が禿げしく発生するため
歯抜けでも受け取れたものを返すことができるようになった
これがSACK(Selective ACK)

…というイメージ。
ちなみにTCP以前で分割されたパケット(フラグメント)は
TCPに届く前に再構成されるべきなので、TCPではあずかり知らない
(という規格になっている)
928916:02/06/04 23:16
>>926
サンクスです。
その本明日買うことにします。
929925:02/06/04 23:19
>>927
なるほど〜
ちなみに教科書といわれてるのは、UnixNetworkProgrammingの事でしょうか?
それとウィンドウに収まりきらない程遅延して届いてしまったようなパケットは
どうなるんでしょうかね?
>>929
> それとウィンドウに収まりきらない程遅延して届いてしまったようなパケットは
> どうなるんでしょうかね?

プロトコル上はウィンドウは勝手に進まないので、ウィンドウが進むまで
送信側は(適当なディレイを置いて)送りつづければいい
ちなみにウィンドウ外のパケットは捨てることになっている

教科書…は、特定の書籍を指しているわけではないが
皆がオススメの本でもいいし、たぶんWWWでも解説が
容易に見つかるだろう それは自分で探せ
931925:02/06/04 23:35
>>930
勉強になりました。どうもありがとうございます。
932デフォルトの名無しさん:02/06/05 01:13
WinAPIスレでも聞いたのですが、こちらに移動します。

メールサーバからメールのタイトルや送信者を調べて、
条件によって削除したいのですが、何を使うのがいいのでしょうか?
WinInetでは出来なさそうだし、
Telnetじゃカッコ悪いし。
何かいいのありませんか?

過去ログを”メール”で検索しましたが、それらしいのは見つかりませんでした。
>>932
自分でPOP3なりを喋る。
934名無しさん@接続しっぱなし。:02/06/05 03:17
>>932
PerlかVB(WSH)なんじゃないの?
Ruby, Pythonとかさ。
935デフォルトの名無しさん:02/06/05 04:04
スレ違いなのですが、IEなどのブラウザはCookieをどう吐いているのでしょうか?
ローカル串鯖を構築しているのですが、クライアントのCookieとは別管理したいのです
つまり、串を通した時のレスは串鯖のCookieとなる訳です。
API使って共通化させてしまえば、簡単なのですが…
936932:02/06/05 06:18
レス付いてる! うれしい(^O^)

Delphiで作ろうと思ったんですよ〜。
POP3って事は WinSock を使うのかな?
面倒そう・・・。

もしかして MAPI を使うのかも!
ちょっとやってみます。
>>936
Delphiならそういうコンポーネント探したほうが早いと思うが。
>>936
ぜんぜん面倒じゃないよ。
いつまでもWinsockから逃げてたらだめだYO!
マシンAからマシンBにデータを送信してる時に、
マシンBからマシンAに対してpingを打っていると転送速度が上がったり
接続が切れにくくなるのはプラシーボ効果なのでしょうか?

プラシーボ効果でなければ、現在開発中のアプリにping相当の機能を
盛り込みたいと思っていますので、参考文献を紹介して頂けると有り難いです。
プラシーボ効果という言葉の意味を勘違いしてる説
ダウンロードソフトにもサーバにping打つものがあったような・・。
pingが本当に効果があるのかどうか俺も知りたい。
>>939
一般的に言って無駄

>>941
それはサーバまでの回線の具合を計測する目的と思われ
複数のミラーから選ぶためのデータ取り
943939:02/06/05 23:04
>>942
回答ありがとうございました。
ping打っても意味無いんですね・・。
944936:02/06/06 04:27
よ−し!
WSockets v.1.20
http://www.torry.net/vcl/internet/sockets/wsock120.zip
をダウンロードしました!

\Examples\TCPClient.dpr
を実行して、
Hostにメールサーバ、Portに25を入力して、OpenConnection しましたが、
Dataには何を書いて、SendData すればいいのでしょうか?

HELO を送っても何も起きないぞー。
RFC読めば良いんでないの?
946944:02/06/06 05:00
わかった!

最後にCRLFを二つ重ねないと駄目です。

が、今度は
501 HELO requires domain address
と出ました。

RFCも見っけ!
http://www.asahi-net.or.jp/~bd9y-ktu/dtd_f/rfc_f/rfc821j.html
HELO 自分のドメイン名


250 サーバー名 hello 自分のIP pleased to meet you

と出ましたが、直後に

550 Access denied

がでます。 なぜでしょう?
948947:02/06/06 05:50
わかった・・・。
HELO ドメイン名 の後にCRLFを二つ重ねたら駄目でした。
949名無資産@ヘタレ部:02/06/06 05:51
>>946
とりあえずはtelnetでターゲットのSMTP鯖と
手動でお話してみることをオススメする

C:\>telnet host.domain 25
でいいから
レスありがとうございます。 Telnet は後でやってみます。

http://www.puni.net/~mimori/relay/apop.html
に載っている、APOP による認証で、

-ERR [AUTH] not authenticated

が出ます。

Write('APOP UserName' + MD5Str + #13#10);
とやっているのですが。
951950:02/06/06 07:44
追加:UserName と MD5Str の間にはちゃんと空白が入っています。

もしかしてサーバがAPOPに対応していないのかな。

それにしても、Outlook や Netscape はパスワードを
垂れ流していたんですね・・。
952934:02/06/06 11:03
>>944
あの〜、ヒートアップ中に申し訳ないんですが、
SMTP(port 25)とPOP3(port 110)は別プロトコルですよ。
その辺大丈夫ですか?

PerlでNet::POP3モジュール使ったら、

>>932
> メールサーバからメールのタイトルや送信者を調べて、
> 条件によって削除したいのですが、何を使うのがいいのでしょうか?

なんて滅茶簡単だけどね。
http://member.nifty.ne.jp/hippo2000/perltips/rcvmail.htm
953デフォルトの名無しさん:02/06/06 15:24
select()関数って遅いんですか?
もどってくるのに1秒くらいかかるんですけどこれって正常ですか?
954953:02/06/06 15:31
遅いのはselect()じゃなかったです。ごめんなさい
955デフォルトの名無しさん:02/06/06 15:34
WinSockでファイルの送信はできるんですが、
受信側でrecv()が返す値の合計がちゃんと合っているのに
生成されたファイルが元のファイルより小さくなってしまいます。
どのような原因が考えられるのでしょうか?一応ソース晒しときます。

while(1){
memset(recvbuf, 0, sizeof(recvbuf));
// データを受信
buf_len = recv(new_socket,recvbuf,RECVSIZE - 1,0);

if(buf_len == SOCKET_ERROR || buf_len < 0 || buf_len > RECVSIZE){ // 受信失敗の場合
MessageBox(NULL, "データ受信失敗", "エラー", MB_OK);
shutdown(new_socket,2);
// ソケットを破棄
closesocket(new_socket);
return;
}

recvbuf[buf_len] = '\0'; // 受信バッファの後ろにNULLを付加
recvsize += buf_len;

fprintf(fp, "%s",recvbuf); // ファイルに出力する

int percent;
percent = (int)( ((float) recvsize / datasize ) * 100);
sprintf(mesbuf, "データ受信中( %d bytes / %d bytes : %d %% 完了 )", recvsize, datasize, percent);
StatusBar->SetMessage(mesbuf);

if(percent == 100){
sprintf(mesbuf, "データ受信完了しました");
StatusBar->SetMessage(mesbuf);
break;
}
}

ソース見てないけど、
recvが返したデータを全部書き出してないだけだろ。
100バイトのメモリをファイルに98バイト書き出せば98バイトのファイルのできあがり
シングルスレッドのプログラムでacceptしてるんですけど
2つのクライアントがconnectに成功してしまいます?
listen(sock, 5)が影響してそうなんですけど
1つしかconnectが成功しないように制限するには
どうしたらよいでしょうか?
>>957
listen(sock, 1)とか(笑)
>>958
ためしました。だめでした。
960955:02/06/06 16:34
>>956
>>recvが返したデータを全部書き出してないだけだろ。
>>100バイトのメモリをファイルに98バイト書き出せば98バイトのファイルのできあがり
なるほど。
fprintf(fp, "%s",recvbuf); // ファイルに出力する
ここで失敗していたということですね。
それじゃどうやって出力すべきなんでしょうか?
961955:02/06/06 16:38
あと…、
ファイル送受信のテストはネットに接続した同じパソコンでやっているんですが、
みたところネットを経由せずに直接パソコンの中でデータをやり取りしているように見えます。
そんなことってあるんですか?
>960
fwrite。
>961
判断の根拠を示せ。
>957
acceptした後、listenソケトを閉じろ。
>>962
神!
964955:02/06/06 17:09
>>962
fwrite()で書き込んだところ、上手くいきました。
かなり悩んでいました。本当にありがとうございます。

それから、判断の根拠というのは以下の理由からです。
・右下のタスクバーのアイコンが通信している様子を示さない
・状態を見てみても、送信バイト数と受信バイト数に変化が見られない
・パケットの到着がとても早い
localhost間の通信はLANとか外のネットワークにパケットは
飛ばないよ。 当然だろが。
966デフォルトの名無しさん:02/06/06 18:30
HTTPでファイルをダウンロードするプログラムを作っているんですが、
バイナリファイルをダウンロードするとどうしてもファイルサイズが合いません。
もちろんファイルは壊れています。バイナリでみると、最初のほうに
Content-Type: application/octet-streamというのが含まれたりするんですが。
どうすればちゃんとダウンロードできますか?
>>966
HTTPヘッダ解釈してないの?
それとも、ちゃんとbodyみてるのにあわないの? その場合はHTTP/1.1でrequestしてchunkedで応答されてたり?
次スレです。

ネットワークプログラミング相談室 Port3
http://pc.2ch.net/test/read.cgi/prog/1023356587/
>>968
これ、マ板に誤爆です。ム板のものを立て直しますんで、
このスレ放置おながいします。すまん。
(゚Д゚≡゚Д゚)??
ERROR:スレッド立てすぎです。。。

ネットワークプログラミング相談室 Port3
名前: 名無しさん@接続しっぱい。
E-mail: sage
内容:
前スレに引き続き、主にソケットに関しての質疑応答スレです。

過去スレ:
ネットワークプログラミング相談室
http://pc.2ch.net/test/read.cgi/tech/970344582/

ネットワークプログラミング相談室 Port2
http://pc.2ch.net/test/read.cgi/tech/1006258198/



・・・ってことで、時間を置いてリトライします。重ねてすまん。
972デフォルトの名無しさん:02/06/06 19:06
>>967
サーバからのレスポンスは以下の通りです。
htmlをダウンロードするときは上手くいくんですが、
書庫とか、その他のファイルをダウンロードするとやっぱり上手くいきません。

2002/06/06 18:58:28 サーバからのレスポンス
2002/06/06 18:58:28 HTTP/?.? Content Partial Content
2002/06/06 18:58:28 HTTP/1.1 206 Partial Content
2002/06/06 18:58:28 Date: Thu, 06 Jun 2002 10:00:02 GMT
2002/06/06 18:58:28 Server: Apache/1.2.5
2002/06/06 18:58:28 Last-Modified: Fri, 25 Jun 1999 16:42:36 GMT
2002/06/06 18:58:28 ETag: "f97f1-21fbb-3773b17c"
2002/06/06 18:58:28 Content-Length: 139195
2002/06/06 18:58:28 Content-Range: bytes 0-139194/139195
2002/06/06 18:58:28 Connection: close
2002/06/06 18:58:28 Content-Type: application/x-lha
>>972
で、そのあとに139195バイト来ないの?
(ところで Apache/1.2.5って…)
ネットワークプログラミング相談室 Port3
http://pc.2ch.net/test/read.cgi/tech/1023359282/

次スレ立ちました。よろしくおながいします。
>>967
解析してないだろ。
バイナリの先頭にContent-Type:〜って入ってるみたいだから。
976デフォルトの名無しさん:02/06/06 19:44
>>975
そう思って見てみました。
やっぱりそこにミスがあって修正もしましたが依然としてダウンロードは上手くいきません。
ちなみにリクエストは以下の通りで、Irvineをみてそのままパクったんですが、何か問題あるのでしょうか?

GET /taketani/soft/file/pktxt18.lzh HTTP/1.0
Host: www.eva.hi-ho.ne.jp
User-Agent: AutoDownloader/0.0
Referer: http://www.eva.hi-ho.ne.jp/taketani/soft/file/pktxt18.lzh
Accept: */*
Range: bytes=0-
Connection: close
977デフォルトの名無しさん:02/06/06 19:48
あとデータは現在の実装だとレスポンスの\r\n\r\nの後ろからを切り離して保存しているんですが、
それでいいのかどうかもわかりません。具体的に説明したページなどありませんでしょうか?
>>977
RFC2616
バイナリデータが流れてくるまでのすべてのレスポンスヘッダも書け
>>977
HTTPを最初から勉強しる。
RFCを読まずに書かれたネットワークプログラムって怖いな
982977:02/06/06 21:19
>>979
こんな感じなんですが…

HTTP/1.1 206 Partial Content
Date: Thu, 06 Jun 2002 10:50:27 GMT
Server: Apache/1.2.5
Last-Modified: Fri, 25 Jun 1999 16:42:36 GMT
ETag: "f97f1-21fbb-3773b17c"
Content-Length: 139195
Content-Range: bytes 0-139194/139195
Connection: close
Content-Type: application/x-lha

>>980
少しは勉強したつもりだったんですが…なんか良い勉強サイトなどないでしょうか?
>>982
すべてのと言ったはず。\r\n\r\nまでじゃない
ネットワークプログラミング相談室 Port3
http://pc.2ch.net/test/read.cgi/tech/1023359282/l50