トップページ⇒tech
1001コメント356KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/12/31(土) 14:07:24
主にソケットに関しての質疑応答スレッドです。

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

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port15
http://pc8.2ch.net/test/read.cgi/tech/1128088448/
0652デフォルトの名無しさん2006/03/21(火) 20:12:26
まずは、Ethereal とかでネットワーク上のデータを見たほうがいいんじゃないか。
0653648=6512006/03/21(火) 21:54:42
いや>>651がファイナルアンサーだから。
Little-endianのCPUなんでしょ。

01011000 00000000 00000001 11110100
^^^^^^^^^ここが常に壊れる。

0654デフォルトの名無しさん2006/03/22(水) 13:19:50
sendとrecvのドキュメントをちゃんと読んだ方が良いよね。
なんでわざわざ受信(送信)したバイト数を返してくるのか、とか。
06556452006/03/22(水) 14:15:04
>>651
ああ!シコるほど!
> totalBytesRcvd: 7
になってしまうのがいかんかったんですね。

if ((bytesRcvd = recv(sock, &msgStruct, sizeof(msgStruct) - 1, 0)) <= 0)
の-1はEchoBufferでテキストメッセージを送る場合に最後の\nのためにあったんですが
構造体ではいらんかったですね。
消したら

Received:
totalBytesRcvd: 8
deposits: 500
withdrawals: 600

と正常位になりました。
ありがとうございました!
0656デフォルトの名無しさん2006/03/22(水) 16:09:21
とりあえずお前はオウム社のマスタリングTCP/IPを読むことを勧める
0657デフォルトの名無しさん2006/03/22(水) 16:20:48
喜んでボケてるとこ悪いが、もう少し勉強しないと4000バイトとか読んだりする
プログラム書いたときにまたこのスレのお世話になることになるぞ。
0658デフォルトの名無しさん2006/03/22(水) 16:51:22
お世話になっちゃ、、駄目ですか?
私は愛していますが、、

あ、私は655さんではないですよ。ポッ
0659デフォルトの名無しさん2006/03/22(水) 20:31:30
>>655
> と正常位になりました。
それまでは騎乗位だったのですか?
0660デフォルトの名無しさん2006/03/22(水) 21:57:22
>>653
いや、>>651 で FA なのはいいんだけど、Ethereal
とかでで送信/受信のどっちが悪いか切り分けられるよう
になってないと、>>657 が言ってるような事になると思
うんだけどな。
0661デフォルトの名無しさん2006/03/22(水) 22:09:50
いや、誰も悪くないんだって。
OSもAPIも間のルータかスイッチも仕様どおりに動いた。
プログラムも仕様どおりに動いた。
645も神様か親DNA由来の仕様どおりに動いた。

ところで645の人は647のソースをどっからかコピペしてきて
改変したんだろうけど、元のソースでちゃんと
while (totalBytesRcvd < sizeof(msgStruct))
{
 ...
totalBytesRcvd += bytesRcvd
}
っていう構造になってるのに、それを改悪して「動作が変」とか言ってるんだよね。
元のソースがどういう動作をするようになっているのか、recvの戻り値の意味も
考えてよく考察するようにした方が良いと思う。
0662デフォルトの名無しさん2006/03/22(水) 22:26:51
なんかネットワークプログラミングってこの話題に終始するよね。
奥が浅すぎだよね。
0663デフォルトの名無しさん2006/03/22(水) 22:34:35
sendやrecvの使い方程度がこのスレにはお似合いってことでは・・・
0664デフォルトの名無しさん2006/03/22(水) 23:30:55
>>662
まあ、初心者ははまりやすいとこだし。
個人的にはなんでそんな仕様にする必要があったのかよくわからんし。
0665デフォルトの名無しさん2006/03/23(木) 04:36:40
>>664
TCPレベルで何バイト送られるかが不確定であり、バイト列の切れ目というのを
表現する機能がないから自然とこういう仕様になるんじゃない?
0666デフォルトの名無しさん2006/03/23(木) 05:39:50
解決したのを確認した後でうだうだと薀蓄述べるのが好きだな、おまいら
0667デフォルトの名無しさん2006/03/23(木) 07:57:33
熟考というんです
0668デフォルトの名無しさん2006/03/23(木) 11:38:45
というか、今回のバグはTCPがバイト・ストリームである問題とは違うんだが…
0669デフォルトの名無しさん2006/03/23(木) 13:00:31
UDPでのソフトウェア設計に関わる質問だと思うんですが

サーバー側でログインしているクライアントの数を数えてるファイルがあります。
クライアントの数は固定(今のところ3人)で
ログインした者の削除フラグは0、ログアウトした者の削除フラグは1にしています
(ユーザーIDと削除フラグから成っている構造体です)。

でクライアント側から'who'なるコマンドを送って
現在ログインしている者のリストをクライアント側で表示したいと思ってるんですが
皆さんならどんな風に処理しますか?

例えば、クライアント側でforループを回して
whoコマンドに該当する番号を3回送って
サーバー側は誰がログインしてようがお構いなく3人分のデータをクライアントに返す。
でクライアント側で削除フラグの立ってない奴だけ表示する。
…というのを考えているんですけど、やる前から効率悪そうだなと思ってます。
他にもっと良い方法があれば教えてください。
0670デフォルトの名無しさん2006/03/23(木) 13:03:58
3人固定なら、一回で全部返せよ。収まるだろ。
06716692006/03/23(木) 13:17:43
えっ、そんな方法ってあるんですか?
構造体のデータ一つ分だけ送る方法しか知らないんですが↓こんな感じで。

/* Send received datagram back to the client */
if (sendto(sock, &msgStruct, recvMsgSize, 0,
(struct sockaddr *) &echoClntAddr, sizeof(echoClntAddr)) != recvMsgSize)

本当に3人分送れるんなら嬉しいですけど。
あ、実は構造体にはIPアドレスとポート番号も含まれてます、今回の件には関係ないですが。
typedef struct {
int recNum;
char userID[8];
int delFlag;
char ip[16];
unsigned short portNum;
} user;
0672デフォルトの名無しさん2006/03/23(木) 13:23:55
これはヒドイ
06736692006/03/23(木) 13:27:25
またまたそんな反応を…。
本当に3人分送れるんですか?
0674デフォルトの名無しさん2006/03/23(木) 13:37:25
プロトコルというものを考えてみては・・・
こんな状態でUDP使うとは。
06756692006/03/23(木) 13:41:41
上からの指示です。逆らえません。
というかやろうと思えばやれるのは分かるんでいいかと。
で結局、3人分送れるというのは嘘ですか?
0676デフォルトの名無しさん2006/03/23(木) 13:43:44
>>675
おまいさ、こんなとこで人に質問したりボケたりする前にC/C++の参考書とか読めよ。
世の中をなめて生きてゆくのも否定はしないけど、まだ若そうだから今のうちにちゃんと
努力したほうが後々ラクになるよ。
06776692006/03/23(木) 13:46:53
全然回答になってないんですが。
3人分送れるというのは嘘ですか?
0678デフォルトの名無しさん2006/03/23(木) 13:49:41
3人分のデータが入った構造体を作るんだ!
06796692006/03/23(木) 13:52:38
ありがとうございます。
そう言ってもらわないとさすがに分からないですよ、いくらC知ってても。
06806692006/03/23(木) 13:54:58
え、でも4人になったら構造体を変えるんですか?
やっぱそうですよねぇ…。どうしましょ?
06816692006/03/23(木) 13:56:42
ちょっと一人で考えてみます。
ありがとうございました。
0682デフォルトの名無しさん2006/03/23(木) 13:57:13
>>680
何か「言われなくてもわかること」はあるのか?
0683デフォルトの名無しさん2006/03/23(木) 13:58:25
もう放置しろ。
馬の耳に念仏だ。
0684デフォルトの名無しさん2006/03/23(木) 14:00:36
まったく女はつかえネーヨナ。
こいつの同僚に同情するヨ
0685デフォルトの名無しさん2006/03/23(木) 14:08:58
buff = malloc(sizeof(user)*3);

でいいんじゃないの?
0686デフォルトの名無しさん2006/03/23(木) 16:09:29
まぁ、TLVにするわな。ふつー。
0687デフォルトの名無しさん2006/03/23(木) 18:12:42
TLVってなに?
0688デフォルトの名無しさん2006/03/23(木) 18:21:41
Type-Length-Valueじゃね?
0689デフォルトの名無しさん2006/03/23(木) 19:51:15
Telecaster - Lespaul - Flying V だろう。
0690デフォルトの名無しさん2006/03/23(木) 22:40:11
>>665
何バイト欲しいか指定してるんだから、そのバイト数がたまる
まで待ってりゃいいじゃん。

て言うか、普通 >>661 が書いてるようなループ作るだろ。

だったら、システムコール (もしくはライブラリ) 内でやっと
いてくれと思う。
0691デフォルトの名無しさん2006/03/24(金) 00:22:14
あらかじめ答えを書いておく。
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.8
0692デフォルトの名無しさん2006/03/24(金) 01:05:25
Accept-Encoding: gzip
で取得したデータを解凍するにはどうしたらいいですか?
C言語でhttpクライアントの実験をしています。
0693デフォルトの名無しさん2006/03/24(金) 02:02:12
クライアントで解けないようなエンコーディングを要求すんな。
0694デフォルトの名無しさん2006/03/24(金) 03:13:14
gzipの仕様を調べ、その仕様に従って解凍ルーチンを書く

つーかネットワーク関係無いし
0695デフォルトの名無しさん2006/03/24(金) 07:33:03
>>692
zlib
0696デフォルトの名無しさん2006/03/24(金) 07:33:23
zlibを使えばいいんでね
0697デフォルトの名無しさん2006/03/24(金) 08:22:45
>>693
もっともだなw
0698デフォルトの名無しさん2006/03/24(金) 08:35:25
実験なのに「もっともだなw」なんてアホだと思う
0699デフォルトの名無しさん2006/03/24(金) 13:27:54
めんどくさければPCにgzipをインストール後 popen("gzip -cd >hoge", "w"); して
fwrite() で書き込んで pclose() してそれから hoge を読め。
0700デフォルトの名無しさん2006/03/24(金) 19:05:01
>>691
釣りか?
0701デフォルトの名無しさん2006/03/24(金) 19:43:44
http://pc8.2ch.net/test/read.cgi/tech/1142302804/448-462n
だな
0702デフォルトの名無しさん2006/03/26(日) 07:35:15
ネットワークゲームのために時刻の同期をとるプロトコルを独自実装したいと
思っているのですが、SNTPではラウンドトリップにかかった時間のちょうど半分がサーバー
というかオリジナルとなる時刻を持ってる側からクライアントにデータが届くまでかかった時間
ってことにしているようなのですが、これはどの程度正確なのでしょうか?
通信の↑の方の層のある程度の持続性のある性質として、行きは遅いが帰りは速いとか、
その逆とかいうことがありうるんでしょうか?

もしそうした場合に片側方向の遅延を検出できるアルゴリズムはどういったものになるのか
…は自分でもこれから考えてみますが、教えていただければうれしいです。
0703デフォルトの名無しさん2006/03/26(日) 16:25:11
ADSLはUpが遅いがDownは速いとか
#↑はスループットの話でラウンドトリップタイムとはまた別かも
0704デフォルトの名無しさん2006/03/26(日) 20:54:22
双方が ntp などですでにシステム時刻が完全合っている状態であれば、片側方向の
通信時間を測定することはできると思うけど、双方のシステム時刻があっていない状態
では、往復時間÷2で推測するしかないと思うけど。
0705デフォルトの名無しさん2006/03/26(日) 23:34:28
負荷かけて速度を測定しろよ
0706デフォルトの名無しさん2006/03/28(火) 12:13:39
送る側の経路しか選べないしなあ。考えるだけ無駄だと思う。
正確さより、いかに現実的な計測が出来るかを追求したら?
0707デフォルトの名無しさん2006/03/28(火) 13:01:34
>>702
そういうアルゴリズムは存在しません。
証明はここに書くには長すぎるのでry
0708デフォルトの名無しさん2006/03/28(火) 22:57:46
インターネット経由なら、行きと帰りでルートが違う可能性はある。
0709デフォルトの名無しさん2006/03/28(火) 23:11:43
すみません。質問です。
ネット環境がない状態で通信するプログラムを作りたいんですが
ルーターを使わずにIPを取得してプログラムのテストをする方法はありますか?
簡易DHCPサーバーなども考えてみましたが、ルーターがないとIPは割り振られないみたいで・・
0710デフォルトの名無しさん2006/03/28(火) 23:26:42
>ルーターがないとIPは割り振られない
そんなわけねー。
0711デフォルトの名無しさん2006/03/28(火) 23:32:08
127.0.0.1
0712デフォルトの名無しさん2006/03/28(火) 23:34:07
・Windows2000/XP/2003なら、最悪でもインターフェースには
169.254/16なアドレスが自動で振られる。
・そのためのIPv6
・有効なインターフェースが無いとTCP/IPスタックがアンロードされて
127.0.0.1も消え去ってしまう話なのか?
0713デフォルトの名無しさん2006/03/29(水) 03:03:14
勝手にポートを特定するソフトって作れますかね?

鯖との最初の通信で認証が通らない場合
次のポートに繋ぎに行くのを繰り返す、みたいな。
迷惑ですかね。
0714デフォルトの名無しさん2006/03/29(水) 03:22:05
止めとけ
最悪通報される
0715デフォルトの名無しさん2006/03/29(水) 11:25:56
>>709
もしMicrosoft の Windows を使っているなら、
ハードウェアの追加で Microsoft Loopback Adapter ってのを追加すると、
LANケーブル等が無いときにも使えるループバック専用の仮想NICが作成されます。

詳しくはgoogleとかで。
0716デフォルトの名無しさん2006/03/29(水) 12:20:48
>>709
…ああ、
「ネット環境がない状態で」「通信するプログラムを作りたい」のか。
「ネット環境がない状態で通信する」プログラムを作りたいなんて
無茶な奴だ、とオモタ。
0717デフォルトの名無しさん2006/03/29(水) 19:42:16
>>565=568
遅レスだけど、もしかすると使ってるところもあるかもしれない POP サーバの
qmail-pop3d には、「LIST/STAT で返されるメールのサイズが不正」というバグが
あるようです。

参考) ttp://ya.maya.st/mail/qmail-violations.html
0718デフォルトの名無しさん2006/03/29(水) 19:43:16
>>716
片方項だけど、CRT の一部を明滅させて小型PDAに
データを転送するというプログラムも過去にはあったような気が・・・
0719デフォルトの名無しさん2006/03/31(金) 13:25:57
TCPでクライアントの中で
クライアント自身のIPアドレスとポート番号を知るにはどうすればいいですか?
サーバー側ではクライアントをaccept()したときに得られるみたいですが。
0720デフォルトの名無しさん2006/03/31(金) 13:38:44
getsockname
07217192006/03/31(金) 13:44:45
おおー、ありがとうごさいます。
感謝感激!
0722デフォルトの名無しさん2006/03/31(金) 17:35:58
peercastとかskypeとかが
特殊なプロトコルを使って通信してるじゃないですか。

peercast://
call://

こんなやつ。
あれってどうやって作ってるんですかね。
0723デフォルトの名無しさん2006/03/31(金) 18:45:56
>>722
正確にはスキーム。
プラットフォーム依存になるが、Windowsなら、CLSIDをレジストリに登録して、
クラスモニカをパースできるようにするんじゃなかったっけ。
0724デフォルトの名無しさん2006/03/32(土) 13:36:30
zeroconfigだっけか、自分でIP用意しちゃおうぜってRFCはあるね。

次のポートに繋ぎに行くのを繰り返すと、ポートスキャンと見なされてIDS/FWのログに残る。
0725デフォルトの名無しさん2006/03/32(土) 17:13:46

ZoneAlarmのように
他のプログラムのネット接続を即切断したり
また繋ぎ直したり・・・は
どうやったらできるでしょうか。

ZoneAlarmが余りに不安定なので
自作した方が軽くて早くて安定な気はしていますが
ネット系のプログラミングは殆どやったことないので
分からないこと多いです。


プログラミング歴だけなら
Win3.1のVC++1辺りからやっては居ます。
0726デフォルトの名無しさん2006/03/32(土) 19:11:20
拡張DLLとか使って横取りでもしてるのかな?
無理矢理してるなら不安定なのは当たり前。
切断してる時に、相手からパケット来たら答えられずに接続切られるでしょ?
0727デフォルトの名無しさん2006/03/32(土) 19:28:40
この手のはメシのタネになりがちだから教えない。
0728デフォルトの名無しさん2006/03/32(土) 23:45:39
>>727
どんな情報も飯のネタになるだろ・・・尻の穴の(ry
0729デフォルトの名無しさん2006/04/02(日) 00:53:45
TDI Filter driver とか使う・・というか書くのが普通。
0730デフォルトの名無しさん2006/04/02(日) 09:02:29
フォームのページに自動的に記入して、送信するプログラムを作りたいのですが、
どのようにすれば作れるのでしょうか?
例えばこのようなページに、ブラウザで開かずに、直接プログラムから記入してそうインしたいのですが。
http://www.miyagawaakira.com/inquiry2.html
0731デフォルトの名無しさん2006/04/02(日) 09:09:52
最後の一行いみわかんねぇけど JavaScript でも使えば?
0732デフォルトの名無しさん2006/04/02(日) 09:37:06
HTTPの仕様を満たして、POSTするプログラムを作ればいいね。
まずはGETするプログラムから始めて見たら?


ちょっと機能加えるだけでパーソナルファイヤウォールとか銘打って稼げそうではあるね。
出来が悪いと、損害賠償受けたり、サポート大変だろうけど。
0733デフォルトの名無しさん2006/04/02(日) 09:46:28
あよく見たら 「例えばこのページのように」 じゃなくて 「このページに」 か。
荒らしツールでも作る気か?
0734デフォルトの名無しさん2006/04/02(日) 10:23:36
>>732
> HTTPの仕様を満たして、

HTMLの仕様も知る必要あり
0735デフォルトの名無しさん2006/04/02(日) 12:54:30
>>730
が書いたHPのソースコードの75行目に
<form action="http://www.moukarumail.com/user/successp/autostep/append.php?SNCD=4" meTDod="post" name ="form1" onSubmit="return check()">
とあるが、CGIでサーバ叩いたら(postメソッド投げれば)簡単にできねーか?
0736デフォルトの名無しさん2006/04/03(月) 02:04:46
何か荒らしサイト構築っぽいね。
あちこちのFORMに宣伝とかの書き込みするのかな?
0737デフォルトの名無しさん2006/04/03(月) 18:25:06
735だが
ネットワーク系の実装は、ボタンの掛け方一つでMAD Programになるからな
これ以上は教えないよ
0738デフォルトの名無しさん2006/04/03(月) 18:31:50
連続 POST くらい JavaScript で書けよと
0739デフォルトの名無しさん2006/04/03(月) 18:41:46
漏れなら、PerlかPHPで書くな
0740デフォルトの名無しさん2006/04/03(月) 19:28:23
漏れなら wget で済ますな。
0741デフォルトの名無しさん2006/04/03(月) 19:30:05
誰か.NET版のXML-RPC使って
Hello Worldでもなんでもいいから
サーバークライアント間で通信する。
簡単なプログラム組んでくれませんか?

http://xml-rpc.net/

これ。
どうも使い方がわかりづらい…
0742デフォルトの名無しさん2006/04/04(火) 00:31:49
漏れならruby。
wgetでpostのほうが面倒だ。

.NETのサポートはMSにお問い合わせください。
0743デフォルトの名無しさん2006/04/04(火) 11:20:22
ロジックだけでかまいません。
IEでプロキシサーバの自動検出機能がありますが、
どのように検出させているのでしょうか?

8080や3128ポートのパケットについて
ブロードキャストさせているだけですか?
0744デフォルトの名無しさん2006/04/04(火) 12:28:29
>>743
「WebブラウザのProxy設定を行うための4つの方法 − WPADのススメ −」
http://www.atmarkit.co.jp/fwin2k/win2ktips/031autoproxy/autoproxy.html
0745デフォルトの名無しさん2006/04/04(火) 12:40:30
>>744
なるほど、WPADプロトコル(を実装したプロキシ)を
使うわけですね。
ありがとうございます。
0746デフォルトの名無しさん2006/04/05(水) 13:57:54
質問です。
自前でACK/RSTパケットを送出したいです。
WinXP+VB6なのですが、VC++でも構わないので
どこかに良さげなサンプルはありませんでしょうか?

よろしくおねがいします。
0747デフォルトの名無しさん2006/04/05(水) 16:36:10
どこまでフラグをapiで弄れたっけ?
0748デフォルトの名無しさん2006/04/05(水) 17:55:35
SO_LINGERを設定してclosesocketすれば、RSTがとんだはず。
07497462006/04/06(木) 21:32:29
>>747
IPヘッダは×
TCPヘッタが少々触れそうなのですが。。

>>748
おぉ!試してみます!情報ありがとうございます!゙
0750デフォルトの名無しさん2006/04/09(日) 09:51:12
サーバの試験をするとき、クライアントを全部別々のIPにして
試験したいときは どうすればいいかな。
同一サブネットでの試験したいときに困った

10台程度なら根性で実機用意するにしても
200台とか2000台はちょっとむりぽ
0751デフォルトの名無しさん2006/04/09(日) 10:30:39
vmwareとかどうよ?
■ このスレッドは過去ログ倉庫に格納されています