トップページ⇒tech
956コメント340KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
主にソケットに関してのFAQ
0480デフォルトの名無しさんNGNG
>>478
ありがとうございます。
色々出てきました
0481デフォルトの名無しさんNGNG
windowsのselectって、
openやpipeとかのハンドルも認識する?
0482デフォルトの名無しさんNGNG
>>481
winsockのselectに入れられるのは、winsockで作ったソケットだけだと思う。

WaitForMultipleObjectsのレイヤまで降りれば、
ソケット/ファイル/パイプ/スレッド/プロセス/メッセージキュー/etc.
(ぶっちゃけた話、非同期処理ほぼすべて)
のイベントを待つことができるんだが...winsockとの絡みが分からん。

詳しい奴の登場を待つ。
0483デフォルトの名無しさんNGNG
>>475
plugable protocol handler とかそのへんのドキュメントを
読めば、http(s) や ftp のプロトコルハンドラがTCP/IP を
使っているわけで、wininet はその層については関知していない
ということがわかります。
0484デフォルトの名無しさんNGNG
>>482
Windows NT 系列の Winsock2.0 なら、ソケットも
WaitFor*Objectで待てる。
0485デフォルトの名無しさんNGNG
>>482
CreatePipeで作ったパイプはWaitFor〜が効かない。
CreateNamedPipeにFILE_FLAG_OVERLAPPEDを与えて
作らないと駄目じゃないかな?

>>484
正しいやり方はWSAAsyncSelectでイベントに結びつけるか、
WSARecvでオーバーラップにしてWaitFor〜でしょ。

どちらにしても、WSAAsyncSelect以外はselectでのポーリング
とロジックの作り方が変わるので注意が必要。
0486デフォルトの名無しさんNGNG
VCでネットワークプログラミングを勉強したいのですが
何かいい本、またはホームページはありませんか
あったら教えてください。お願いします
0487デフォルトの名無しさんNGNG
>>486
俺は昔のCマガの特集と、極めるVisualC++で勉強した。
結論:いい本で勉強した方が遙かに吸収が早いです。
0488486NGNG
>>487
そう思うんですが地方に住んでいるのでなかなか本の内容が
わからずに買うのをためらってしまうんです。
書評とかがもっと増えれば安心して買えるんですが...
0489481NGNG
ということは、windowsで単一スレッドコンソールの
チャットクライアントを作るような場合、
selectをタイムアウト付きでポーリングして、
ユーザー入力にはkbhitで判定するのが一番自然でしょうか?
(WaitFor〜レベルまで降りたくないので)
0490デフォルトの名無しさんNGNG
age
0491デフォルトの名無しさんNGNG
sendする時に、selectで待たないで、
連続してsendしていくと何か問題あるでしょうか?
selectの2番めの引数の使い方がわからないです。
recvならメッセージが着るって事で理解できるんですが。
0492475NGNG
>>475
動的にロードしていた。
0493デフォルトの名無しさんNGNG
よくポートが空いていると言いますが、
これは、そのポートがlistenになっているって事ですか?
そして、要求があれば、acceptするのですか?

そして、例えばプリンタポートが空いていたら、
外部からプリンターの操作が可能になるのですか?

良く分からん。
0494デフォルトの名無しさんNGNG
>>491
(sendできない状態ってのを、相手が送信を受け付けて無い状態って前提で話すけど)
sendできない状態でsendしていくと、
ソケットのバッファに溜まっていくんじゃない?
溢れたらエラー返ってくるとか。
(「溢れた場合」ってのがあるのか疑問だけど、恐らく一定サイズで切り上げるんだと思う。)
結局、相手が受信しない限りは、ソケットのsend内部バッファ?に
どんどん溜まっていく筈だから、selectして送信状況を把握していく処理は必要だと思う。

ちなみにこれは推測だから実際の所は知りません。ごめんね。
詳しい人が現れるのを待ちましょう。
0495デフォルトの名無しさんNGNG
>>493
恐らく、何らかのサーバーアプリがそのポートにbindしてなければ、
「ポートが空いている」という事では?
使ってたらbindは失敗すると思う。
0496デフォルトの名無しさんNGNG
オフラインで、ソケットを使ったアプリ間の通信したいのですが、
どうするのでしょうか?
socket関数がINVALID_SOCKETを返すので先に進みません。
0497デフォルトの名無しさんNGNG
localhostでやれば?>496
hosts参照
0498デフォルトの名無しさんNGNG
>>496
INVALID_SOCKETって、socket()が失敗するってこと?ソケット層
のレベルではオンラインもオフラインもないと思うんだけど。
WSAStartup()を呼んでないだけ、なんてオチじゃないよね?(藁

とりあえず、WSAGetLastError()で理由を調べてみましょう。
0499496NGNG
WSAStartup()を忘れていました。
うまく行きそうです。
487さん、498さんありがとうございます。

んー、他のプロセスが一度でもWSAStartup()を呼んでいれば、
エラーにならないのかなぁ。
WSAStartup()が無くてもエラーにならない事があったから…。
0500デフォルトの名無しさんNGNG
>> 493
ソケットとかでいう「ポート」とプリンタポートっていうときの「ポート」は
別物だぜよ。
0501デフォルトの名無しさんNGNG
>>494
sendは1度の呼出しで送信可能状態になるまでブロックする。
そのブロックしている間に何かしたいならば、selectを使用する。
ってこと。
sendでブロックしてもいいならsekectしなくても良い。
0502デフォルトの名無しさんNGNG
afe
0503デフォルトの名無しさんNGNG
まともなの作るつもりならselectでタイムアウト検出は必要だと思われ。
0504デフォルトの名無しさんNGNG
WSAStartup() がエラーを返した時も、
WSACleanup() を呼ぶ必要があるのでしょうか?
以下ヘルプ。

>There must be one WSACleanup call corresponding to every successful
>WSAStartup call to allow third-party DLLs to make use of a Windows
>Sockets DLL on behalf of an application. This means, for example,
>that if an application calls WSAStartup three times, it must call
>WSACleanup three times. The first two calls to WSACleanup do nothing
>except decrement an internal counter; the final WSACleanup call for the
>task does all necessary resource deallocation for the task.
0505デフォルトの名無しさんNGNG
>>499
他のプロセスは関係ない。自分のプロセス内のDLLが初期化した
場合は使える。>>504の記述にあるとおり、DLLが勝手に初期化
しても平気なように、WSAStartupを呼んだ回数分WSACleanupを
呼ばなきゃいけない仕様になっている。

>>504
内部の実装は知らんが、常識的に考えて失敗した場合も内部の
カウンタを増加するように実装する?つまりそゆこと。

#M$は何でWSAStartupを呼ばなきゃいけないように作ったんだ?
0506デフォルトの名無しさんNGNG
M$ わ、というか元の (Win3.1 の頃の) Winsock がライブラリ
レベル (DLL) でのソケット API サポートだったからでわ。
UNIX はカーネルレベル (って表現で良い?) のサポートだから
初期化はいらない。
0507デフォルトの名無しさんNGNG
補足: Win3.1 の頃のしょっぱなは Win 標準で Winsock をサポート
していたわけではなかった (と記憶する)。サードパーティから DLL
形式で Winsock が出ていた。Trumpet Winsock とか、わけ分からず
設定した覚えがある (DNS とか何のことか分からんかった)。途中で
M$ がそれを買ったのかパクッたかして Win 付属の標準ライブラリと
なった。今の Winsock はそのままずるずる引きずってんじゃないの?
(確かに Winsock2 に変わったときに OS レベルでサポートしても
良かったのでは、と思う)
0508505NGNG
そろそろsocketをkernel32.dllのAPIにして欲しいね。
他のファイル関係のAPIと同じように、UNIX風の関数は
Cライブラリに取り込めば使い勝手よくなると思うぞ。
CreateSocket()を_socket()で包むような感じで。

ついでにパイプやコンソールもselect出来るようになれば
嬉しいね。何でCreatePipeのハンドルをpolling出来ない
仕様にしたんだろうね。まったく。
0509デフォルトの名無しさんNGNG
標準入出力モナー>508
select使えなさスギ
0510デフォルトの名無しさんNGNG
__WSAFDIsSetって何に使うのですか?
0511デフォルトの名無しさんNGNG
WinSockを使わないとすると、インターネットへのアクセスはどうなるのでしょうか?
直接デバイスドライバとやり取りするのですか?
でも、これだとハード毎に異なりますよねぇ〜。
WinSockのフックは出来たのですが、検出できないアクセスがあるもので…。
0512デフォルトの名無しさんNGNG
rawソケットを使ってTCPソケットと同じことをやろうとした場合、
パケットの送受信って何を使えばいいのでしょう?
0513デフォルトの名無しさんNGNG
Windowsでソケット使う場合ってBSDスタイルのワーカスレッド形式が良いですか?
0514デフォルトの名無しさんNGNG
test
0515超初心者NGNG
pingのTオプションについて教えてもらえませんか
どうやって指定するのでしょう。マルチキャストがいまいち・・・

またこれを使ってtracerouteの替わりにできるとも聞いたのですが
実際どうなんでしょう。
0516デフォルトの名無しさんNGNG
>>515
そんなあなたに ping -f がオススメです
0517デフォルトの名無しさんNGNG
>>515
Tオプションと言われても実装されている環境によって意味が違うの
では?Win98ではそのようなオプションはありませんでした。

多分「ping -T 値」って指定するのでは?
0518超初心者NGNG
>>517
usage: ping [-QRadfnqrv] [-c count] [-i wait] [-l preload] [-p pattern]
[-P policy] [-s packetsize] [-S src_addr] [-t timeout]
[host | [-L] [-I iface] [-T ttl] mcast-group]
こんな感じの環境です

fオプションはないみたいですね。
0519デフォルトの名無しさんNGNG

ソケット通信ほとんど素人の者です。
ソケット通信で Send メソッドで通信する場合
一度で送るサイズをこうした方が良いとかありますか?
1MBのデータを送る場合、1回の Send で1MB送るのではなく
10KBに分けて100回 Send を行った方が効率的ってことありますか?
(自分で試せ!ってツッコミはイヤ〜ン。)
それとMSDNのサポート技術文書「[SDK32] 送信サイズが小さいと TCP/IP のパフォーマンスが低くなる」ってところにMTUサイズがどうのこうのって書いてありますがこれはどう言うことでしょうか?
1460バイト単位らしいですが普段気に留める必要はあるのでしょうか?
環境はVC++6.0です。
 お・し・え・て
0520デフォルトの名無しさんNGNG
い・や・よ
0521デフォルトの名無しさんNGNG
>>518
 TTLの値はIPパケットの生存時間で0なら破棄されたと思います。
この値の減り方はよく知りませんが、ルータなどを超えると減ったと
思います。
 pingとtracerouteは同じICMPのECHOリクエストとECHO応答を使う
プログラムですが、tracerouteはTTLの値でパケットが破棄される仕
組みを利用していたと思います。詳細はtracerouteのソースを読ん
でください。それに合わせてpingを利用するなら使えそうな感じが
します。
0522超初心者NGNG
結局Tオプションはどのようにアドレスを指定すればいいんでしょう。
224.0.0.1としてみたら何かは表示されましたが
普通のアドレスだとこうなります。
> ping -T 10 アドレス
ping: -I, -L, -T flags cannot be used with unicast destination
0523デフォルトの名無しさんNGNG
>>515
板違い。通信技術板へいきませう。
0524超初心者NGNG
>>523
そうします
0525デフォルトの名無しさんNGNG
WinSock1と
WinSock2って何が違うんですか?
0526デフォルトの名無しさんNGNG
UNIXネットワークプログラミングは基本ですか?
0527デフォルトの名無しさんNGNG
>>526
というかマトモな本がそれしかない
0528デフォルトの名無しさんNGNG
>>519
素人です。
自分は2000バイトずつに分けてます。
1回ずつACKを受け取ってから送信するようにしてます。
正しいかどうかわからないけど、動いてます。
1MBを1回のSendでは無理だと思います。
0529デフォルトの名無しさんNGNG
>>528
サンキュ。
これから本格的なMLに聞いてくる。
とりあえずレスありがと。
0530512NGNG
結局この板にはrawソケットでプログラミングできる人が居ないのね。
0531デフォルトの名無しさんNGNG
>>530
Berkeley Packet Filterでも使えば?
0532512NGNG
>>531
 Berkley Packet Filterをちょっと調べてみたらパケットのスニファー
みたいな用途っぽいですね。やりたいのはconnect()などの制御
とデータパケットの送受信をrawソケットで実現させること。
 環境は書いてませんでしたが、AIXかHP-UX。あるいはLinuxでも
OK。
0533デフォルトの名無しさんNGNG
>>532
LinuxでいいんならTCP実装のソース読めばいいんでねえの?
0534512NGNG
>>533
Linuxカーネルって全くといって良いほどソースを読んだことが無いです
が、rawソケットで実装されてるのですか?なかなか奥の深い助言です
ね。

カーネルソースをみてみましたが、net/ipv4辺り?としかわかりません。
ソースを読むにあたって、システムコールに対応するソースは何処か
解説のあるサイトはご存知でしょうか?
0535デフォルトの名無しさんNGNG
<form method='POST' action="http://aaa/ssss.cgi">
<input type=hidden name="get" value="143242341324">
<input type=submit value="abcd">
</form>
このCGIの出力結果を見るにはどんな文ををサーバーに送れば見ることが出来ますか?
おしえてください
0536デフォルトの名無しさんNGNG
> あるいはLinuxでも OK。

BPFってありました? 相当する機能はあったと思うけど..
0537512NGNG
Berkley Packet Filterをしっかり調べれば問題解決するということ
ですね。詳細を調べてみます。
0538デフォルトの名無しさんNGNG
DirectPlayってルータとか通すときプロコトルがNATでないといけませんよね。
うちのはNATeなのですがヤフメなどは使えます。
で、ポートの役目リストみたいなページで、ヤフメのポートが記述してあったのですが、、
WinSockなど特別な方法を使えばふつーに通信できるのでしょうか?
判りにくくてスミマセン(汗

具体的に言うとマイクロソフトメッセンジャーなどは1:1で会話や通信できるのに
(どこかでサーバ介している??)
DirectPlayを使うと(というよりわたしの技術では)東急ケーブルなどのローカルIPなプロバイダの人とは
ネットワークゲームが出来なかったりするのです。(どうにかNATeにも対応させたいし、、)
回避する方法はないのでしょうか。。
資料などありましたらこのバカにも判りやすく具体的によろしくお願いします
(ここの何処にあるとか。。)
0539デフォルトの名無しさんNGNG
TCP/IPのパケットデータを覗くソフトってあるんでしょうか?
Win2000使ってます。
0540デフォルトの名無しさんNGNG
>>539 PacMon
http://www.layer.co.jp/
0541デフォルトの名無しさんNGNG
フリーウェアならethereal、Analyzerがあります。
メニューなどが英語ですけど十分使えます。
Analyzerの英語(日本語ならベターだけど)ドキュメントが欲しいところ。
0542デフォルトの名無しさんNGNG
>>538
NATって何なのかもう少し理解してから書き込んで下さい
0543デフォルトの名無しさんNGNG
NATの理解がNATらん
0544デフォルトの名無しさんNGNG
>>543
回線で足つってください。
0545デフォルトの名無しさんNGNG
NATく行かん
0546デフォルトの名無しさんNGNG
>>545
回線で足つって氏んで下さい
0547デフォルトの名無しさんNGNG
厨房質問ですいません。
ftp-data 20/tcp
や
netbios-dgm 138/tcp nbdgm
netbios-dgm 138/udp nbdgm
のように実際のセッションがあるときにしか使われないポートが
開いているかどうかを調べるには対応する
ftp 21/tcp
とか
netbios-ssn 139/tcp nbssn
が開いていることで判断すればいいのでしょうか?
それとも上記のデータ送信ポートが開いていることを
セッションを作らずに直接調べる方法があるのでしょうか?
0548sNGNG
おまえらたいどがNATらん.
0549デフォルトの名無しさんNGNG
厨房警報NATるで
0550デフォルトの名無しさんNGNG
怪傑ズNAT
0551デフォルトの名無しさんNGNG
(ソケット使うならTCP/IPって普通に勉強するもんじゃなかったのか。。。
0552デフォルトの名無しさんNGNG
>>545
激しくワラタ
0553デフォルトの名無しさんNGNG
>>551
ソケット使う「だけ」ならそれほど勉強する必要はない。
0554デフォルトの名無しさんNGNG
1、CGIでURLエンコードするときのデフォルトの文字コードは決まってるんでしょうか?
2、SJISのエンコードは %XX で言いと思うんですが、他の文字コードのエンコードは
  どうやってやるのでしょうか?
UNICODEとかの場合は %XXXX で良いのでしょうか?
0555デフォルトの名無しさんNGNG
>>554

%xxは文字コードのエンコードじゃなくてバイナリのエンコードだから
S-JISだろうとEUCだろうとunicodeだろうと全部%xxの組み合わせダヨ。

デフォルトの文字コードはどうなんだろうね。発信元依存じゃないのかな?
0556デフォルトの名無しさんNGNG
>>554
URL-Encode は単にエンコード方式を規定しているだけで、charset の規定はない。
0557554NGNG
555さん556さん、ありがとうございます。
わかりましたです。
0558デフォルトの名無しさんNGNG
このスレ、レベル低いね。
0559デフォルトの名無しさんNGNG
甘NATう
0560七夕NGNG
願いがかNATいいね
0561デフォルトの名無しさんNGNG
NATって大豆を水につけて煮たものに納豆菌をつけてワラの中に入れて発酵させたものでしょ?
0562デフォルトの名無しさんNGNG
そら納豆や
0563デフォルトの名無しさんNGNG
NATゃん
0564デフォルトの名無しさんNGNG
age
0565デフォルトの名無しさんNGNG
おもしろかった
0566デフォルトの名無しさんNGNG
Windowsで、WinInet使わずにWinSockでHTTPするのはバカですか?
0567デフォルトの名無しさんNGNG
・WinInetのバージョンに左右されたくない
・IEが入ってなくても使えるようにしたい
等の理由があれば馬鹿じゃないだろ
0568デフォルトの名無しさんNGNG
わたしもWinsock派だよん
0569デフォルトの名無しさんNGNG
>>567
なるほど、じゃあ、そういうことにしておきます。

プロトコル調べて、自力で動かすのが楽しいからやってただけなんですが(笑)
0570デフォルトの名無しさんNGNG
すにっふぁしたあい('-`)
0571デフォルトの名無しさんNGNG
proxy とか使ってる人がいるかもしれないから、
WinInet 使えるんなら使っておいたほうが良いと思う。
0572デフォルトの名無しさんNGNG
winsock2使えアホボケ
0573デフォルトの名無しさんNGNG
>>571
proxyも自分でつないじゃ駄目?
0574デフォルトの名無しさんNGNG
>>573
IEの設定を使いたいって事でしょ
自力で探ると結構面倒だし
0575デフォルトの名無しさんNGNG
JavaScriptで自動構成とかされてると自力じゃどうやっても取れない。
厳密にはJavaScriptエンジンまで作れば取れるだろうけどそこまでする
ならWinInet使うぞ。
WinInetで困ったのがIE5あたりで追加されたフラグをうかつに立ててると
IE3環境でERROR_INVALID_PARAMETERになること
0576デフォルトの名無しさんNGNG
あと https がタダで使えるのも美味しいぞ>WinInet
0577デフォルトの名無しさんNGNG
Winsockのselectは効率割悪いってよ。>使ってる人
詳しくはアスキーのマルチスレッドプログラミングって本参照
0578デフォルトの名無しさんNGNG
IriaやらRegetのレジューム機能
ってどうやって実現されてるの?
0579デフォルトの名無しさんNGNG
>>577
NTならIO完了ポートを使うのが常識。
0580デフォルトの名無しさんNGNG
>>578
要求ヘッダで「ここの位置からのデータを頂戴」と書いてサーバーに伝えてるだけです。
詳しくはIriaやRegetのログ出力を見れ。
■ このスレッドは過去ログ倉庫に格納されています