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

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
主にソケットに関してのFAQ
0682デフォルトの名無しさんNGNG
>>680 chunked message か?
Netscape Proxy Server とか chunked はずしちゃうよ。もちろん
Content-Length も無しで。それ以前に HTTP/1.1 だからといって
必ず chunked や Content-Length が付いている保証はない。

>>681 GET のみ、レスポンスコード&ヘッダなしでいきなりコンテ
ンツ返信ってやつだな。自作の Web 巡回ツールテストしてて 0.9
レスポンスにぶち当たってこけたことがある。
0683680NGNG
>>682
まじで?
サイズ保証したい場合は自分でまた何かフィールドつけることになるのか・・・
アホや・・・
0684デフォルトの名無しさんNGNG
たしか2種類あるよ>サイズ取得
0685679NGNG
どうも、有難うございます。

コネクションが切れるまでがコンテンツ、だったら
データの終りまで行って切れたのか、それともエラーで切れたかの
区別が出来ないんじゃないですかね…

今 RFC を読んでるんですけど Chunked Message 出てます。
Content-Length は HTTP/1.0 の互換性のためで、
Chunked で送る場合は Chunked を優先して、サーバは Content-
Length は送るな、と書いてありました。
(↑英語正しく読めた自信無い、間違ってるかも)

chunk だと read しっぱなしじゃダメで、データを受信
するのにそれなりの仕組みが必要みたいですね…
0686682NGNG
>>685 手前味噌だがオイラの和訳ページ使ってくれ。

http://www.geocities.co.jp/SiliconValley-PaloAlto/5694/rfc/rfc2068-ja.html

データの整合性を保証するなら長さだけじゃなく Content-MD5
までやってくれや。chunked message には「フッタ」もあり
だから (RFC2616 で修正されたかな?) そこらへんの実装も
難しいぞ。IE のコントロール使ってるとかアプレットとか
なら気にしなくても良いが。
0687685NGNG
>>686
ありがとう〜
英文印刷して読んでやろうかと思っていたところでした、
ホント助かります。
0688デフォルトの名無しさんNGNG
>>683
RFCにはサイズを(Content-Lengthかchunked encodingで)「付けなけれ
ばならない(MUST)」って書かれてるんだけどね(さもないとPersistent
Connectionのとき切れ目が分からない)。
現実はそんなに甘くないということで。
0689デフォルトの名無しさんNGNG
SOCKSV4/V5に対応したクライアントを作りたいのですが、
情報が全く手に入りません。
何処かに良いサンプル落ちてませんかね。。
0690692NGNG
>>688
を、persistent connection の時はデータ長を明示的に渡さな
ければならないということを言い忘れてた。まぁどのみちサーバ
側が persistent connection を拒否して長さ省略で返す場合
もあるんだけどね。
0691デフォルトの名無しさんNGNG
仕様上はmustだってことでいいの?
0692デフォルトの名無しさんNGNG
サーバクライアントタイプのネットゲーを作ったとして、
それを24時間だれでも遊べるようにしたいのですが。

自宅のPCにサーバプログラムを放り込んで、
24時間ネットにつなげっぱなしにすれば実現できますか。

大手のサーバのように、24時間信頼性の高い
(ちょくちょく切断されない)サーバを個人で運営するには
どうすれば良いのですか。
0693デフォルトの名無しさんNGNG
通信技術板で聞いた方がいい答えが期待できると思うよ
それと回線は何なの?
0694692NGNG
いまADSLで接続してます。
外部から電話がかかってくると切断されますが…
0695682NGNG
>>691 RFC 2068 か 2616 の "4.4 Message Length" 読んでみ。
message-body 長の決定方法に "By the server closing
the connection." って書いてあるから (RFC 2616 は
transfer-length になってる; 当然か)。Content-Length もしくは
Transfer-Encoding: chunked のどちらかを使わなければならない
という MUST 要求はなかった。
0696デフォルトの名無しさんNGNG
>>694
それは保安器交換で直ると思われ
http://salami.2ch.net/test/read.cgi?bbs=isp&key=995877420
スレ違いなのでsage
0697デフォルトの名無しさんNGNG
http://www2.odn.ne.jp/~aaj02540/img/P000172F.jpg
こういうネットワークエラーがでるんですけど、
どなたかアドバイスお願い致します。
0698デフォルトの名無しさんNGNG
>>697
(・∀・)チンコ!!
0699デフォルトの名無しさんNGNG
エロサイトばっかみてんじゃねーぞ、ゴルァ!って意味です。
0700デフォルトの名無しさんNGNG
700!
0701デフォルトの名無しさんNGNG
>>697
精神的ブラクラにつき開くことなかれ
0702デフォルトの名無しさんNGNG
>>695
ガイーン(T_T)
データ転送をHTTPで済まそうと思ったけど甘かったかな・・・
データ本体をパーズせずに転送エラーをチェックしたかったんだけど・・・
ご教授ありがとうございます。
0703デフォルトの名無しさんNGNG
ここの日記の 8月23日 には HTTP がらみの話が載っている。
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/memo0008.html
0704デフォルトの名無しさんNGNG
>>702 Content-MD5 を使え。
0705デフォルトの名無しさんNGNG
>>704
調べてみます。これってサーバのCPU食いませんか?なんとなく心配。
0706デフォルトの名無しさんNGNG
ソケットとMQの長所、短所は?
0707デフォルトの名無しさんNGNG
MQってなに?
0708デフォルトの名無しさんNGNG
Javaでメール送信プログラムを組んでいるのですが、
メールがうまく送信できずに悩んでいます。
やっていることは、DNSに問い合わせて、MXレコードを引いて
直接相手側のSMTPにメールを送っています。
エラーの内容は、

>501 Invalid domain name

と出るのですが、なにか対処法ご存知の方いらっしゃいますか?
0709デフォルトの名無しさんNGNG
クライアントがポートを7000に設定して接続したら、
サーバーは、ポート7001と返してきたが、どうして?
クライアントもサーバも同じ7000でいいのでは?
0710デフォルトの名無しさんNGNG
TCPの話?
0711デフォルトの名無しさんNGNG
>>708

相手SMTPサーバにあなたの側は、どう名乗っているかがちときになる。
0712チェックサムNGNG
生ソケットを作ってUDPでパケットを送っているんですが少し疑問が。
IPヘッダーのチェックサムなんですが、適当な数字(2とか3)を入れ
てもパケットが送信出来てしまいます。何でエラーが起きないんでしょうか?
0713極めて不確かNGNG
分からないけど、こんな感じじゃないかなぁ

1. ドライバが勝手に(親切にも)直してくれる。
2. 実はいつでもパケットは送信できる。受け取ったホストは
チェックサムを計算して、壊れたパケットだと見なして蹴る。

くだらん邪推書き込んでスマソ。どなたか詳しい方居りませぬか?
0714デフォルトの名無しさんNGNG
>>712
UDPにエラーを返す規定はないからエラーなどおきるわけがない。
もし、そのパケットの送信に対して相手が何らかの応答をしてきたとするならドライバが勝手に直したのだろうし
応答が帰ってこないのなら相手側が壊れたパケットだとして破棄したんだろう。
0715712NGNG
>>714
>UDPにエラーを返す規定はないからエラーなどおきるわけがない。
そうだったんですか、勝手にチェックサムエラーを期待していました。
ありがとうございました。
0716デフォルトの名無しさんNGNG
Javaでネットワークプログラミングする時
BufferedInputStreamは
どういう風に使えばいいのでしょうか?
0717デフォルトの名無しさんNGNG
JavaでDNSサーバからMXレコードを引くにはどうしたらいいのでしょう?
簡単だろうとタカを括っていたのですが、予想外に苦戦してます。

いまのところnslookupコマンドを外部呼出しして結果をファイルにリダイレクトして、そこから読み込むという方法をとっているのですが、やはり自プログラムで直接引くようにしたいのです。

サンプル等も探したのですが、見当たりません。
なにか情報があったら教えてくださいませ
0718717NGNG
と思ったら、ちょうと知ってそうなお方がそこに・・・!

>>708
MXレコードはどうやって引いているのですか?
さっぱりわからなくて、困っています。やはり自分でソケットプログラムを
書いてDNSからのデータを解析しないといけないのでしょうか?
0719708NGNG
>>711
>相手SMTPサーバにあなたの側は、どう名乗っているかがちときになる。
それって、HELOコマンドのときのことですか?
HEROコマンドに対するレスポンスでエラーが出ています。
HEROコマンドの引数に、MIMEエンコードした文字列を入れちゃ駄目ですか?

>>718
dnsjavaというのを使ってます。
http://xbill.org/dnsjava/
0720デフォルトの名無しさんNGNG
メールサーバーの送信部分をエミュレート(?)したいのですが、
Return-Path、Received、Message-Idなどのヘッダー(エンベローブ)って
普通にDATAコマンドの後に記述しても駄目なんでしょうか?
だれか教えてぷりーず。
0721 NGNG
どなたか、Winsockでタイムアウトの時間を設定する方法を
教えてくださいませんか。
0722デフォルトの名無しさんNGNG
>721
コネクション切断検知のタイムアウトなら
レジストリいじらないと
だめだったような(NTの場合)
0723 NGNG
connect()でのタイムアウトを短くしたいのですが、無理なのですか・・・。
0724デフォルトの名無しさんNGNG
非ブロッキングモードのsocket使えば?
0725WInsock勉強中NGNG
WinSockを使ってクライアント側のアプリを作っているのですが、
サーバに何か要求しようとして、Connectした後Sendする前に
その要求がやっぱり不要になってしまった場合。
あるいは、SendしてRecvしている最中にいま受信しているデータが
不要になって、さっさと別の要求を出したい場合。

上記のような場合どうすればいいでしょうか?
現状は、問答無用でshutdownを実行しているのですが、
あまりよろしくないような・・・
やはりきちっとすべてのデータを受信してからでないと
次の要求はできないのでしょうか?
どなたか教えてください。
0726デフォルトの名無しさんNGNG
>>725
いきなりクライアントが shutdown する可能性があることを前提に
サーバーを作ってあれば(作っておくべき、異常終了に対応するため
にも)、それでも良いよ。

データの受信中にコマンドを発行したいなら、FTP みたくコマンドと
データ用に別々にコネクションを張るのが楽だと思うが。今、どうし
てます?
0727WInsock勉強中NGNG
>>726
デフォルトの名無しさん お返事ありがとうございます。
知識不足でFTPみたく・・・の部分はよくわからないのですが、
現状ではデータ要求のコマンド(というかメッセージ?)もデータ自体も
すべて同じ風にrecvとsendを使用して同じSocketでやり取りしています。
この部分を別仕様に変えるのはちょっと大変なので、サーバ側がいきなりの
shutdownに対応しているか?を確認してみます。
ありがとうございました。
0728デフォルトの名無しさんNGNG
ネットワークゲームを作るには、C を勉強するのが一番の早道ですか?
0729デフォルトの名無しさんNGNG
>>728
いや、Cは関係ない。
知識さえ仕入れれば、Cでも何でもOK。

でも、ゲーム作るのは、C/C++のほうがいいかな。
0730デフォルトの名無しさんNGNG
使われているポート一覧を調べるにはひとつひとつbindして調べるしか
ないのでしょうか?
0731デフォルトの名無しさんNGNG
netstatのソースコードを見れば?
0732デフォルトの名無しさんNGNG
>>731
そうですね。反省。
0733デフォルトの名無しさんNGNG
dnsjavaをダウンロードして、lookupをためしてみたんだけど、
bud compressionっていうエラーがでて、アドレスを引けない。
わかる人、教えて_(..)_
0734デフォルトの名無しさんNGNG
>>733
javahouseの過去ログ検索で
dnsjavaで検索してみれ。
つい最近dnsjavaの話題があったぞ。
0735デフォルトの名無しさん01/09/03 01:00ID:v81rkv8.
ソケット通信で、文字列を一行ずつ取得したい場合、
1バイトづつレシーブするのとバッファにためておいて一行ずつ切り出すのとでは
どっちが効率いいですか?

操作自体は1バイトづつのほうがやりやすいと思うんですが・・
0736デフォルトの名無しさん01/09/04 01:08ID:3J1vv5e.
>>735
効率の定義にもよるけど・・・recv呼び出しのコストとか?

javaでいうBufferedStreamみたいなのを使えば、気にしなくて済むね。
エラー処理が面倒だけど。
0737デフォルトの名無しさん01/09/04 07:05ID:MJCjZdvc
>>735
ためて1行ずつ切り出すと改行のない長い文字列を送信されたときにえらいことになります
0738ちょっと質問01/09/04 14:27ID:Mo7rJ2/M
UNIXネットワークプログラミングのreadn関数って欠陥品に思えて仕方がないので質問。

以下、readn

ssize_t /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
    size_t nleft;
    ssize_t nread;
    char *ptr;

    ptr = vptr;
    nleft = n;
    while (nleft > 0) {
        if ( (nread = read(fd, ptr, nleft)) < 0) {
            if (errno == EINTR)
                nread = 0; /* and call read() again */
            else
                return(-1);
            } else if (nread == 0)
                break; /* EOF */

        nleft -= nread;
        ptr += nread;
    }
    return(n - nleft); /* return >= 0 */
}
/* end readn */
0739デフォルトの名無しさん01/09/04 20:36ID:Mo7rJ2/M
〜諸処理〜
iread = read(sockfd,buf,sizeof(buf));
write(sockfd,buf,iread);

とするとできるのに

while(( iread = read(sockfd,buf,sizeof(buf)) >0 )
  write(sockfd,buf,iread);

とすると予想した文字列bufを書き込んでくれません。
内部のバッファーに貯めちゃっているような感じがするのですが
なにが原因でしょうか。
Perlであれば $|=; みたいなおまじないがありますがC言語でも同じようなのがあるのでしょうか。
おねがいします。
0740デフォルトの名無しさん01/09/04 23:39ID:xADXB3S6
この本のソースってネットで検索すればかなりたくさん出てくる
新しいのが出てるかもしれんので探してみ
0741名も無い名無しNGNG
自分のIPがローカルIPかグローバルIPかを知るには
どうすればいいのでしょうか?
0742デフォルトの名無しさんNGNG
>>739
while文を使った方で、毎回read()が何返してるかireadを出力してみたらどうでしょう?

while (iread = read(sockfd,buf,sizeof(buf)) > 0) { // >>739の')'の数あってる?
fprintf(stderr, "iread is %d\n", iread);
write(sockfd,buf,iread);
}

それと、
> 予想した文字列bufを書き込んでくれません。
という文字列は、read()で正しく読み出せていますか?

あと、sockfdがnon-blockingに設定されていて、
read()がEWOULDBLOCKやEAGAINなんかで0を返してきているって事はないですか?
0743 食いだおれさんNGNG
>>21
> しかし、TCP/IP本は必ずといっていいほどOSIも載せるから勘違いしている人も多いんだよな・・・

激亀レスだけど、OSIなんてほとんどの本に載ってないぞ。
OSI参照モデルが載っているだけだろ。
0744デフォルトの名無しさんNGNG
1年前の書き込みにレスする人、初めて見たヨ。
0745デフォルトの名無しさんNGNG
>>742
EWOULDBLOCKやEAGAINの時は、-1が返るはず
0746お胸おっぱいNGNG
>>741
RFC を読む。
0747742NGNG
>>745
あっ、すみません、おっしゃる通り-1ですね。ご指摘どうもです。(ペコ
0748741NGNG
>>746
読んでみました。
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
の範囲のIPはローカルIPって事ですね?
0749 デフォルトの名無しさんNGNG
>>748
RFC1597読んだんだと思うが、public/private addressという用語。
global/localではない。globalは使う人が多いけどlocalはほとんど聞かない。
たぶんclient側のaddressと混同しやすいから。

うるさいかも知れないのでsage
0750748NGNG
あー、そう書いてありました、
ためになります。
Thanks!
0751初心者NGNG
自分のソフトが動いているマシンから、
LAN上につながっている特定の相手のマシン(IPアドレスで区別)に、
ファイルを送り込みたい場合、

たとえば、相手のマシンにサーバもしくはクライアントの役目をするような
なんらかのソフトが入ってて、動いていれば、
いろんな手段で実現できると思うのですが、

相手のマシンが ただLANにつながっているだけ、
という状態では こちらのソフトからファイルを送り込む事は不可能ですか?
0752デフォルトの名無しさんNGNG
>>751不可能
0753751NGNG
>>752
やっぱりだめですね
ありがとうございました
0754デフォルトの名無しさんNGNG
>>751は何を企んでいたのだろう?
0755751NGNG
別に企んでません(ワラ

現在あるリモートメンテナンスソフトを
LAN対応させようとしてて、
リモート側のソフトをLANで入れられないかなーと・・・

よく考えたら、バカな質問ね
0756デフォルトの名無しさんNGNG
recvfrom()の最後の2つの引数、特に struct sockaddr *from
なんだけど、online manual にも、ものの本にも、データの
送り元のアドレスがセットされて戻るとしか解説されてないん
だけど、このfrom引数に送り元のアドレスが最初から
分かっている時に予め代入してから渡すと何かいいこと
あるんでしょうか?
いえ、そうしているソースを見た事があるので。
個人的にはまったく意味ないんじゃないのかなーって
思うんだけど。
0757デフォルトの名無しさんNGNG
>>756
特定アドレスからのパケットを受け入れる
0758756NGNG
>>757
えっ、そうなんだ(汗
ありがと。
0759ネット関係のプログラム作るの初めてNGNG
windowsで、winsock使用で簡単な通信プログラム作ってます。

winCEにも対応させる事を考えて、
WSAAsyncSelectを使用しないで(CE未対応なので)、
スレッドを用意してselectで通信を監視するようにしています。
selectで受信を判定して、recvする事は成功したのですが、

相手からの接続が切れた事(WSAAsyncSelectの、FD_CLOSEに相当する)
の判定のしかたがわかりません。

どうしたら良いのでしょうか?

いろいろ検索かけたり、ヘルプとかで調べてみたのですが、わかりません・・・
0760デフォルトの名無しさんNGNG
>>759
recvが0を返した時
0761デフォルトの名無しさんNGNG
すんませんが、どっかにtelnetのRFCの日本語訳ないでしょうか?
0762デフォルトの名無しさんNGNG
>>761
Rubyはクソです。ゴミ箱逝きです。

いじょ
この発言をコピペしていただければ幸いです。
0763デフォルトの名無しさんNGNG
>>761
http://www.google.com/search?hl=ja&q=telnet+RFC+%93%FA%96%7B%8C%EA%96%F3&lr=
0764761NGNG
>>763
あのさあ、検索しても見付からないからここで聞いてるんだけどさ。
0765デフォルトの名無しさんNGNG
今だ!765ゲットォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡=
         ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ
0766765NGNG
Rubyはクソです。ゴミ箱逝きです。
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡=
         ̄ ̄  (´⌒(´⌒;;
0767765NGNG
sage忘れた。スマソ
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡=
         ̄ ̄  (´⌒(´⌒;;
0768デフォルトの名無しさんNGNG
>>764
これでどうだ!:-P
ttp://www.geocities.co.jp/HeartLand-Kaede/8800/rfc/rfc1097j.txt
0769デフォルトの名無しさんNGNG
質問した事があるのですが、質問した事を忘れてました。
敢えて何番の者かは申しませんが親切に答えてくれた方ありがとうございました。
0770デフォルトの名無しさんNGNG
>>768
おお!ありがとう。
しかしこれはサブリミナルオプションらしいですね。
telnetそのもののRFCの日本語訳を希望。
わがままいってごめんちょ
0771デフォルトの名無しさんNGNG
礼儀正しいんだか無礼なんだか…デモチョトワラタ。
…敢えて何番へのレスかは申しませんが…。
0772デフォルトの名無しさんNGNG
770がチョット可愛くみえた。(笑
0773デフォルトの名無しさんNGNG
              / ̄ ̄ ̄ ̄ ̄
     ,__     | >>770が>>768のjokeに気付きますように。
    /  ./\    \_____
  /  ./( ・ ).\       o〇       ヾ!;; . iii|//"
/_____/ .(´ー`) \   ∧∧   .       |;;; :.iii|/゙
 ̄|| || || ||. |っ¢..|| ̄   (,,  ) ナムナム   |;;; ,:iii|
  || || || ||./,,, |ゝ iii~   ⊂  ヾwwwjjrjww!;;;;:::iii|jwjjrjww〃
  | ̄ ̄ ̄|~~凸( ̄)凸 .(  ,,)〜 wjwjjrj从jwwjwjjrj从jr
0774デフォルトの名無しさんNGNG
以下のようにして、受信ループをまわしているのですが、
クライアント(IE6)が転送を中断してsocketが無効になったときに、
なぜか無限ループになってしまいます。
ちなみに、自分でtelnetを使用して実験した場合では再現しませんでした

このソケットをselect()で調べると、常に読み取り可能。
受信バイト数は16777215バイト。となっています。
無効時には-1が帰るものだと思っていたのですが、
sizeof(rbuf)よりも大きい数が帰ってきたらエラーとして扱うべきなのでしょうか?

char rbuf[4096];
while (len = recv(session, rbuf, sizeof(rbuf) - 1, 0)) {
  rbuf[len] = '\0';
  printf("%s", rbuf);
}
0775デフォルトの名無しさんNGNG
>>774
recv()が-1を返したときも、上のコードだとループは回り続けるけど、
if (len < 0) {...} みたいなコードは省略済み?
ちなみに、16777215は0x00ffffffだけど、
本当にこの値をrecv()が返してきてるの?
lenの値が16777215だった場合の領域破壊はこの際置いておくとしても、
そこのとこどうよ。
0776デフォルトの名無しさんNGNG
telnetのソースコードありますか?あったら下さい。環境はLinuxです。
0777デフォルトの名無しさんNGNG
そんなものはどこにでもころがってます。
0778デフォルトの名無しさん NGNG
ソケットに関してというわけではないので、恐縮なのですが。。。
VBで、InetコントロールのOpenURLメソッドで取得したHTMLデータ
をシーケンシャルファイルに保存すると、2バイト文字が化けて
しまいます。これを回避する方法がありましたら、ご教授ください!
よろしくお願いします!!!
0779デフォルトの名無しさんNGNG
>>777
777getおめでとう。

で、ください。くださいと言ってます。
0780デフォルトの名無しさんNGNG
FTPのLISTコマンドでファイル一覧を表示すると、.ファイルなどの隠しファイルが表示されませんが、隠しファイルまで表示するにはどうすればいいでしょうか?
0781デフォルトの名無しさんNGNG
-a
0782デフォルトの名無しさんNGNG
>>781
それはUNIXのlsコマンドの話でしょう。
自分が言ってるのはFTPの応答コマンドの話。
■ このスレッドは過去ログ倉庫に格納されています