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

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
主にソケットに関してのFAQ
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の応答コマンドの話。
0783デフォルトの名無しさんNGNG
うちではだまってても .* 全部見えるな
0784デフォルトの名無しさんNGNG
>>782
LIST -aとか
NLST -aとかやってみ。
0785780NGNG
LIST -a でできた
すんませんね>>781
アリガトサン>>784
0786780NGNG
しかしRFC959にはそんなこと一言も書いてないね。
なぜだろう?
0787デフォルトの名無しさんNGNG
959はObsoleteだから。
0788759NGNG
>>760
ありがとうございます
遅レスで申し訳ない上に、さらに質問ですが、

それは、selectだけでは判定できない という事でしょうか?
今は、ソケット監視スレッドで
タイム0でselectを呼び出してループしてます
FDを見て、情報ありの時だけ recvするイベントをだしてメインでrecvしてます

ソケット監視ループで、recvもすれば良いのかなと思ったのですが、
でも、recvって、ブロッキングにならない使いかたできるのでしたっけ?
0789デフォルトの名無しさんNGNG
>>786
つまり厳密には鯖依存ってこと
>>787
大嘘こくな
0790760ではないがNGNG
>>788
それ(loopでselect()の復帰を待ってrecv())でよいはず。
コネクション断でもselect()はデータ到着とみなす。
select()がデータ来てるといってるのにread()でブロックすることはない。
ただ、Win系ならWSAEventSelect()なんかの非同期I/Oを使用するAPIを呼ぶと、
socketが自動的にnonblocking-modeに設定されるので注意。
0791790NGNG
あ、一部訂正。>>790のread()はrecv()でした。すまそ。
0792790NGNG
あ、一部訂正。>>790のread()はrecv()でした。すまそ。
0793788NGNG
>>790
>コネクション断でもselect()はデータ到着とみなす。
知らなかった・・・勉強不足

selectループはそのままに、
recv() が 0 の時 切断処理を行うようにしたら、うまくいきました
ありがとうございました
0794デフォルトの名無しさんNGNG
>>788
ここ一遍目を通しておくとよいよ。
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
0795デフォルトの名無しさんNGNG
winCEとwin32のソケット通信に関する質問を
WinCEスレに書いたのですが、
もしかして、こっちのスレに書いたほうが良かったのかなーなどと
思いはじめ、
図々しくもリンク貼ります
CEスレの93です
↓
http://piza2.2ch.net/test/read.cgi/tech/998569580/93
0796デフォルトの名無しさんNGNG
MFC(WinInet)にてサーバにHTTPS経由でファイルをアップロードしてます。
500MBのファイルを1MBで分割して500回POSTしてるんですが
400回目あたりを過ぎたところで受信要求がタイムアウトして
しまいます。。。んでリトライして行うとまたタイムアウト
んでまた・・・の繰り返しで
8回あたりリトライするとサーバから受信要求が返されます。

原因として何が挙げられるんでしょうか??
ただ単にサーバに負荷がかかってるのでしょうか?それにしては
ブラウザからCGIを直接起動するときの反応が通常のような・・・。

ちなみにMFCではPOSTするたびにコネクションを新規生成してます。
サーバはSolaris+Apache+PHP。
0797デフォルトの名無しさんNGNG
>>795
bind()のエラーだったらTIME_WAITによるAddress already in useの可能性大。
きみも>>794が紹介してくれたとこに一度行ってきなさい。勉強になるから。
0798デフォルトの名無しさんNGNG
ここ、いいですね
ありがとうございます
0799 NGNG
SendMailで受け取った複数ドメイン(*.aaa.com、*.bbb.net、*.ccc.ne.jp等)毎、
複数ユーザ毎のメールを一括でPerl等に出力し、
Perlで転送先へ仕分けして再配送したいのですが、
エンベローブの宛先アドレスや送信元アドレスをPerlへパラメータとして与えたいと
思っています。(MAIL From: [email protected] や RCPT To: [email protected]の情報)
sendmail.defでそれらしい設定を探しましたが、
以下のようなPOPDOMが最も近そうでした。

PSEUDO_POP_DOMAIN=yes/no
POPDOM_MAILER_PATH='/usr/sbin/lmail'
POPDOM_MAILER_FLAG=$PROG_MAILER_FLAG
POPDOM_MAILER_ARGS='lmail -d $h $u'
POPDOM_MAILER_MAXSIZE=100000
POPDOM_MAILER_MAXLINE=

しかし、上記の設定では、$uは宛先の@前のユーザ名のみなので、
@以降のドメイン名部分が取得できません。
また、送信元情報の取得もできません。
そういった情報は固定の変数に設定されているのでしょうか?($〜)

それと、ACCEPT_ADDRSで*.hoge.comという形式でドメイン受信の設定は
可能でしょうか。
TLDは手動設定でいいのですが、サブドメインの登録は自動化したいので、
DNSの*指定のように全サブドメイン対象の設定にしたいと思っています。
0800800NGNG
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800 800
0801デフォルトの名無しさんNGNG
やはり一つのポートには一つのソケットしかつなげられないわけですか?
0802デフォルトの名無しさんNGNG
>>881
基本的にはYes
しかし一つの代表ポートに複数の接続要求を出すことは出来る
TCPのテストプログラムを作って接続語の相手先のポート番号を確認すれば意味は分かる
0803デフォルトの名無しさんNGNG
winsock2.0を使ってプログラムしているのですが、
ひとつ不可解な現象にあって困ってます。
recvで受信するときに、改行文字(\r\n)が送られて来ても、
戻り値で2が帰ってくると思ってたのですが、1なのです。
どうしてでしょうか?

ちなみに、受信バッファを監視していると確実に\r\nが書き込まれてました。
0804デフォルトの名無しさんNGNG
あ、ちなみにtelnetで接続して試してます
0805デフォルトの名無しさんNGNG
>>803
質問内容がいまいちわからないですが、、、

socket層には改行文字なんて概念はありません
純粋にバイナリを送受信してるだけです

送信元が\r\nを送ったんなら、\r\nが届くだろうし、
\nだけを送ったんなら\nだけが届くでしょう
0806デフォルトの名無しさんNGNG
>>805
返答どうもです。
えっと、症状なのですが、確実に\r\nは送られて来てます。
しかし、recvの戻り値が1なので、単純に戻り値を元にバッファを連結すると
\nが上書きされてしまうのです。
0807デフォルトの名無しさんNGNG
相手がUNIXならtelnetを使っても改行コードは\nしか送られてこないはず
勘違いしてない?
0808デフォルトの名無しさんNGNG
W2kでtelnetして接続。
Enterを押して改行だけ送信。

char buf[4096];
memset(buf,0,sizeof buf);
len = recv(c, buf, sizeof buf, 0);

accept後に上記のソースで受信すると、
len = 1;
buf[0] = '\r';
buf[1] = '\n';

こういう状態になってます。
len = 2なら納得できるのですが・・・

と、いう話です。
0809デフォルトの名無しさんNGNG
ウザくて申し訳ないですが、ageさせてもらいます。
どなたか、よろしくお願いします
0810デフォルトの名無しさんNGNG
一対一でつながるwinsockのサーバーとクライアント両方を作ってます

つながっている状態から、

クライアントがソケットを切断した場合、

サーバー側は、一度ソケットを閉じないで
そのままlistenしても良いのですか?
■ このスレッドは過去ログ倉庫に格納されています